206 lines
3.7 KiB
C++
206 lines
3.7 KiB
C++
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
strsd.c
|
|
|
|
Abstract:
|
|
|
|
This Module implements wrapper functions to convert from a specialized
|
|
string representation of a security descriptor to the security descriptor
|
|
itself, and the opposite function.
|
|
|
|
Author:
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "headers.h"
|
|
//#include <lmcons.h>
|
|
//#include <secobj.h>
|
|
//#include <netlib.h>
|
|
//#include <ntsecapi.h>
|
|
#include "sddl.h"
|
|
|
|
#pragma hdrstop
|
|
|
|
|
|
DWORD
|
|
ScepGetSecurityInformation(
|
|
IN PSECURITY_DESCRIPTOR pSD,
|
|
OUT SECURITY_INFORMATION *pSeInfo
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
ConvertTextSecurityDescriptor (
|
|
IN PWSTR pwszTextSD,
|
|
OUT PSECURITY_DESCRIPTOR *ppSD,
|
|
OUT PULONG pcSDSize OPTIONAL,
|
|
OUT PSECURITY_INFORMATION pSeInfo OPTIONAL
|
|
)
|
|
{
|
|
|
|
DWORD rc=ERROR_SUCCESS;
|
|
|
|
if ( NULL == pwszTextSD || NULL == ppSD ) {
|
|
return(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
//
|
|
// initialize output buffers
|
|
//
|
|
|
|
*ppSD = NULL;
|
|
|
|
if ( pSeInfo ) {
|
|
*pSeInfo = 0;
|
|
}
|
|
if ( pcSDSize ) {
|
|
*pcSDSize = 0;
|
|
}
|
|
|
|
//
|
|
// call SDDL convert apis
|
|
//
|
|
|
|
if ( ConvertStringSecurityDescriptorToSecurityDescriptorW(
|
|
pwszTextSD,
|
|
SDDL_REVISION_1,
|
|
ppSD,
|
|
pcSDSize
|
|
) ) {
|
|
//
|
|
// conversion succeeds
|
|
//
|
|
|
|
if ( pSeInfo && *ppSD ) {
|
|
|
|
//
|
|
// get the SeInfo
|
|
//
|
|
|
|
rc = ScepGetSecurityInformation(
|
|
*ppSD,
|
|
pSeInfo
|
|
);
|
|
|
|
if ( rc != ERROR_SUCCESS ) {
|
|
|
|
LocalFree(*ppSD);
|
|
*ppSD = NULL;
|
|
|
|
if ( pcSDSize ) {
|
|
*pcSDSize = 0;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
rc = GetLastError();
|
|
}
|
|
|
|
return(rc);
|
|
}
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
ConvertSecurityDescriptorToText (
|
|
IN PSECURITY_DESCRIPTOR pSD,
|
|
IN SECURITY_INFORMATION SecurityInfo,
|
|
OUT PWSTR *ppwszTextSD,
|
|
OUT PULONG pcTextSize
|
|
)
|
|
{
|
|
|
|
if ( ConvertSecurityDescriptorToStringSecurityDescriptorW(
|
|
pSD,
|
|
SDDL_REVISION_1,
|
|
SecurityInfo,
|
|
ppwszTextSD,
|
|
pcTextSize
|
|
) ) {
|
|
|
|
return(ERROR_SUCCESS);
|
|
|
|
} else {
|
|
|
|
return(GetLastError());
|
|
}
|
|
|
|
}
|
|
|
|
|
|
DWORD
|
|
ScepGetSecurityInformation(
|
|
IN PSECURITY_DESCRIPTOR pSD,
|
|
OUT SECURITY_INFORMATION *pSeInfo
|
|
)
|
|
{
|
|
PSID Owner = NULL, Group = NULL;
|
|
BOOLEAN Defaulted;
|
|
NTSTATUS Status;
|
|
SECURITY_DESCRIPTOR_CONTROL ControlCode=0;
|
|
ULONG Revision;
|
|
|
|
|
|
if ( !pSeInfo ) {
|
|
return(ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
*pSeInfo = 0;
|
|
|
|
if ( !pSD ) {
|
|
return(ERROR_SUCCESS);
|
|
}
|
|
|
|
Status = RtlGetOwnerSecurityDescriptor( pSD, &Owner, &Defaulted );
|
|
|
|
if ( NT_SUCCESS( Status ) ) {
|
|
|
|
if ( Owner && !Defaulted ) {
|
|
*pSeInfo |= OWNER_SECURITY_INFORMATION;
|
|
}
|
|
|
|
Status = RtlGetGroupSecurityDescriptor( pSD, &Group, &Defaulted );
|
|
|
|
}
|
|
|
|
if ( NT_SUCCESS( Status ) ) {
|
|
|
|
if ( Group && !Defaulted ) {
|
|
*pSeInfo |= GROUP_SECURITY_INFORMATION;
|
|
}
|
|
|
|
Status = RtlGetControlSecurityDescriptor ( pSD, &ControlCode, &Revision);
|
|
}
|
|
|
|
if ( NT_SUCCESS( Status ) ) {
|
|
|
|
if ( ControlCode & SE_DACL_PRESENT ) {
|
|
*pSeInfo |= DACL_SECURITY_INFORMATION;
|
|
}
|
|
|
|
if ( ControlCode & SE_SACL_PRESENT ) {
|
|
*pSeInfo |= SACL_SECURITY_INFORMATION;
|
|
}
|
|
|
|
} else {
|
|
|
|
*pSeInfo = 0;
|
|
}
|
|
|
|
return( RtlNtStatusToDosError(Status) );
|
|
}
|
|
|