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); }
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); }