/// <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));
        }
Example #2
0
        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> >());
        }
Example #3
0
 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));
 }