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) );
|
||
|
}
|
||
|
|