static private ConvertSdToSddl ( byte binaryForm, int requestedRevision, SecurityInfos si, string &resultSddl ) : int | ||
binaryForm | byte | |
requestedRevision | int | |
si | SecurityInfos | |
resultSddl | string | |
return | int |
internal static int ConvertSdToSddl(
byte[] binaryForm,
int requestedRevision,
SecurityInfos si,
out string resultSddl)
{
int errorCode;
IntPtr ByteArray;
uint ByteArraySize = 0;
if (!Interop.Advapi32.ConvertSdToStringSd(binaryForm, (uint)requestedRevision, (uint)si, out ByteArray, ref ByteArraySize))
{
errorCode = Marshal.GetLastWin32Error();
goto Error;
}
//
// Extract data from the returned pointer
//
resultSddl = Marshal.PtrToStringUni(ByteArray);
//
// Now is a good time to get rid of the returned pointer
//
Interop.Kernel32.LocalFree(ByteArray);
return 0;
Error:
resultSddl = null;
if (errorCode == Interop.Errors.ERROR_NOT_ENOUGH_MEMORY)
{
throw new OutOfMemoryException();
}
return errorCode;
}
public string GetSddlForm(AccessControlSections includeSections) { byte[] binaryForm = new byte[this.BinaryLength]; this.GetBinaryForm(binaryForm, 0); SecurityInfos securityInfos = (SecurityInfos)0; if ((includeSections & AccessControlSections.Owner) != AccessControlSections.None) { securityInfos |= SecurityInfos.Owner; } if ((includeSections & AccessControlSections.Group) != AccessControlSections.None) { securityInfos |= SecurityInfos.Group; } if ((includeSections & AccessControlSections.Audit) != AccessControlSections.None) { securityInfos |= SecurityInfos.SystemAcl; } if ((includeSections & AccessControlSections.Access) != AccessControlSections.None) { securityInfos |= SecurityInfos.DiscretionaryAcl; } string result; int num = Win32.ConvertSdToSddl(binaryForm, 1, securityInfos, out result); if (num == 87 || num == 1305) { throw new InvalidOperationException(); } if (num != 0) { throw new InvalidOperationException(); } return(result); }