windows-nt/Source/XPSP1/NT/ds/security/services/scerpc/strsd.cpp
2020-09-26 16:20:57 +08:00

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