Exemplo n.º 1
0
        internal static NtStatus SamLookupNamesInDomain(SafeSamHandle domainHandle, string[] names, out int[] relativeIds, out SamSidType[] use)
        {
            Validator.AssertNotNull(names, "names");
            int count = names.Length;

            if (count > MaxNamesToLookup)
            {
                // TODO: Extract as resource
                throw new ArgumentOutOfRangeException("names", count, "Cannot translate more than 1000 names at once.");
            }

            // Prepare parameters
            SafeSamPointer relativeIdsPointer;
            SafeSamPointer usePointer;

            UnicodeString[] unicodeNames = new UnicodeString[count];
            for (int i = 0; i < count; i++)
            {
                unicodeNames[i] = new UnicodeString(names[i]);
            }

            // Call the native function
            NtStatus result = SamLookupNamesInDomain(domainHandle, count, unicodeNames, out relativeIdsPointer, out usePointer);

            if (result == NtStatus.Success)
            {
                // Marshal pointers into arrays
                relativeIds = new int[count];
                use         = new SamSidType[count];
                Marshal.Copy(relativeIdsPointer.DangerousGetHandle(), relativeIds, 0, count);
                Marshal.Copy(usePointer.DangerousGetHandle(), (int[])(object)use, 0, count);
            }
            else
            {
                relativeIds = null;
                use         = null;
            }

            return(result);
        }
Exemplo n.º 2
0
        internal static NtStatus SamLookupNameInDomain(SafeSamHandle domainHandle, string name, out int relativeId, out SamSidType sidType)
        {
            string[]     names = new string[] { name };
            int[]        relativeIds;
            SamSidType[] use;
            NtStatus     result = SamLookupNamesInDomain(domainHandle, names, out relativeIds, out use);

            if (result == NtStatus.Success)
            {
                relativeId = relativeIds[0];
                sidType    = use[0];
            }
            else
            {
                relativeId = -1;
                sidType    = SamSidType.Unknown;
            }
            return(result);
        }