转换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;
        }

posted @ 2010-03-29 18:12 鞠强 阅读(...) 评论(...) 编辑 收藏

hello

world