internal static string SidToString(IntPtr sidPointer)
{
if (!NativeMethods.IsValidSid(sidPointer))
{
throw new RemotingException(CoreChannel.GetResourceString("Remoting_InvalidSid"));
}
StringBuilder sidString = new StringBuilder();
IntPtr sidIdentifierAuthorityPointer = NativeMethods.GetSidIdentifierAuthority(sidPointer);
int lastError = Marshal.GetLastWin32Error();
if (lastError != 0)
{
throw new Win32Exception(lastError);
}
byte[] sidIdentifierAuthority = new byte[6];
Marshal.Copy(sidIdentifierAuthorityPointer, sidIdentifierAuthority, 0, 6);
IntPtr subAuthorityCountPointer = NativeMethods.GetSidSubAuthorityCount(sidPointer);
lastError = Marshal.GetLastWin32Error();
if (lastError != 0)
{
throw new Win32Exception(lastError);
}
uint subAuthorityCount = (uint)Marshal.ReadByte(subAuthorityCountPointer);
if (sidIdentifierAuthority[0] != 0 && sidIdentifierAuthority[1] != 0)
{
sidString.Append(String.Format(CultureInfo.CurrentCulture, "{0:x2}{1:x2}{2:x2}{3:x2}{4:x2}{5:x2}",
sidIdentifierAuthority[0],
sidIdentifierAuthority[1],
sidIdentifierAuthority[2],
sidIdentifierAuthority[3],
sidIdentifierAuthority[4],
sidIdentifierAuthority[5]));
}
else
{
uint number = (uint)sidIdentifierAuthority[5] +
(uint)(sidIdentifierAuthority[4] << 8) +
(uint)(sidIdentifierAuthority[3] << 16) +
(uint)(sidIdentifierAuthority[2] << 24);
sidString.Append(String.Format(CultureInfo.CurrentCulture, "{0:x12}", number));
}
for (int index = 0; index < subAuthorityCount; ++index)
{
IntPtr subAuthorityPointer = NativeMethods.GetSidSubAuthority(sidPointer, index);
lastError = Marshal.GetLastWin32Error();
if (lastError != 0)
{
throw new Win32Exception(lastError);
}
uint number = (uint)Marshal.ReadInt32(subAuthorityPointer);
sidString.Append(String.Format(CultureInfo.CurrentCulture, "-{0:x12}", number));
}
return(sidString.ToString());
}