/// <summary> /// Enumerate users in a domain. /// </summary> /// <param name="user_account_control">User account control flags.</param> /// <param name="throw_on_error">True to throw on error.</param> /// <returns>The list of users.</returns> public NtResult <IReadOnlyList <SamRidEnumeration> > EnumerateUsers(UserAccountControlFlags user_account_control, bool throw_on_error) { SecurityEnumDelegate <SafeSamHandle, SafeSamMemoryBuffer> enum_func = (SafeSamHandle handle, ref int context, out SafeSamMemoryBuffer buffer, int max_count, out int entries_read) => SecurityNativeMethods.SamEnumerateUsersInDomain(handle, ref context, user_account_control, out buffer, max_count, out entries_read); return(SamUtils.SamEnumerateObjects(Handle, enum_func, (SAM_RID_ENUMERATION s) => new SamRidEnumeration(s), throw_on_error)); }
internal static NtResult <IReadOnlyList <T> > EnumerateObjects <T, H, B, S>(H handle, SecurityEnumDelegate <H, B> func, Func <S, T> select_object, bool throw_on_error) where H : SafeHandle where B : SafeBufferGeneric where S : struct { int context = 0; List <T> ret = new List <T>(); NtStatus status; int last_context = 0; do { status = func(handle, ref context, out B buffer, 64 * 1024, out int entries_read); if (!status.IsSuccess()) { if (status == NtStatus.STATUS_NO_MORE_ENTRIES) { break; } return(status.CreateResultFromError <IReadOnlyList <T> >(throw_on_error)); } if (entries_read == 0) { break; } using (buffer) { buffer.Initialize <S>((uint)entries_read); foreach (var value in buffer.ReadArray <S>(0, entries_read)) { ret.Add(select_object(value)); } } // This is to deal with a weird bug in SamEnumerateAliasesInDomain. if (context == last_context) { break; } last_context = context; }while (true); return(ret.AsReadOnly().CreateResult <IReadOnlyList <T> >()); }
public static NtResult <IReadOnlyList <T> > LsaEnumerateObjects <T, S>(SafeLsaHandle handle, SecurityEnumDelegate <SafeLsaHandle, SafeLsaMemoryBuffer> func, Func <S, T> select_object, bool throw_on_error) where S : struct { return(SecurityNativeMethods.EnumerateObjects(handle, func, select_object, throw_on_error)); }