转换SID到byte数组
/*
<Domain/Machine>\Administrator
' Pos : 0 | 1 | 2 3 4 5 6 7 | 8 9 10 11 | 12 13 14 15 | 16 17 18 19 | 20 21 22 23 | 24 25 26 27
' Value: 01 | 05 | 00 00 00 00 00 05 | 15 00 00 00 | 06 4E 7D 7F | 11 57 56 7A | 04 11 C5 20 | F4 01 00 00
' str : S- 1 | | -5 | -21 | -2138918406 | -2052478737 | -549785860 | -500
' SID anatomy:
>> ' Byte Position
>> ' 0 : SID Structure Revision Level (SRL)
>> ' 1 : Number of Subauthority/Relative Identifier
>> ' 2-7 : Identifier Authority Value (IAV) [48 bits]
>> ' 8-x : Variable number of Subauthority or Relative Identifier (RID)
>> [32 bits]
*/
public byte[] ConvertSID2Bytes(string sid)
{
sid = sid.ToLower().Replace("s", "");
string[] list = sid.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
StringBuilder sb = new StringBuilder();
sb.Append(String.Format("{0:X2}", Convert.ToInt32(list[0])));
sb.Append(String.Format("{0:X2}", Convert.ToInt32(list.Length - 2)));
sb.Append(String.Format("{0:X12}", Convert.ToInt32(list[1])));
Console.WriteLine(sb.ToString());
for (int i = 2; i < list.Length; i++)
{
string tmp = String.Format("{0:X8}", Convert.ToUInt32(list[i]));
for (int j = 6; j >= 0; j -= 2)
{
sb.Append(tmp.Substring(j, 2));
}
}
string obj = sb.ToString();
byte[] ret = new byte[obj.Length / 2];
for (int i = 0; i < obj.Length; i += 2)
{
ret[i / 2] = Convert.ToByte(obj.Substring(i, 2), 16);
}
return ret;
}