예제 #1
0
        internal static bool IsValidReachSid(SecurityIdentifier sid)
        {
            if (!ExternalUser.IsExternalUserSid(sid))
            {
                return(false);
            }
            string text  = sid.ToString();
            int    num   = text.LastIndexOf('-');
            string a     = text.Substring(num + 1);
            string input = text.Substring(0, num + 1);
            string b     = ExternalUser.ComputeHash(input);

            return(string.Equals(a, b, StringComparison.Ordinal));
        }
예제 #2
0
        private static SecurityIdentifier GenerateSid(string source, bool forReachUser)
        {
            if (forReachUser)
            {
                source = Guid.NewGuid() + source;
            }
            byte[] sha1Hash = CryptoUtil.GetSha1Hash(Encoding.Unicode.GetBytes(source));
            for (int i = 0; i < 4; i++)
            {
                byte[] array = sha1Hash;
                int    num   = i;
                array[num] ^= sha1Hash[i + 16];
            }
            BinaryReader       binaryReader = null;
            SecurityIdentifier result;

            try
            {
                binaryReader = new BinaryReader(new MemoryStream(sha1Hash));
                StringBuilder stringBuilder = new StringBuilder("S-1-8-");
                for (int j = 0; j < 4; j++)
                {
                    if (j == 3 && forReachUser)
                    {
                        stringBuilder.Append(ExternalUser.ComputeHash(stringBuilder.ToString()));
                    }
                    else
                    {
                        stringBuilder.Append(binaryReader.ReadUInt32().ToString(NumberFormatInfo.InvariantInfo));
                    }
                    if (j < 3)
                    {
                        stringBuilder.Append('-');
                    }
                }
                result = new SecurityIdentifier(stringBuilder.ToString());
            }
            finally
            {
                if (binaryReader != null)
                {
                    binaryReader.Dispose();
                    binaryReader = null;
                }
            }
            return(result);
        }