Example #1
0
        public static IEnumerable <USER_INFO_3> GetLocalUsers(string computerName)
        {
            // Returns local users
            //  FILTER_NORMAL_ACCOUNT == 2
            var users  = new List <USER_INFO_3>();
            var retVal = NetUserEnum(computerName, 3, 2, out var bufPtr, MAX_PREFERRED_LENGTH, out var EntriesRead, out var TotalEntries, out var Resume);

            if (retVal != 0)
            {
                var errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
                throw new Exception("Error code " + retVal + ": " + errorMessage);
            }

            if (EntriesRead == 0)
            {
                return(users);
            }

            var names    = new string[EntriesRead];
            var userInfo = new USER_INFO_3[EntriesRead];
            var iter     = bufPtr;


            for (var i = 0; i < EntriesRead; i++)
            {
                userInfo[i] = (USER_INFO_3)Marshal.PtrToStructure(iter, typeof(USER_INFO_3));
                users.Add(userInfo[i]);

                //x64 safe
                iter = new IntPtr(iter.ToInt64() + Marshal.SizeOf(typeof(USER_INFO_3)));
            }
            NetApiBufferFree(bufPtr);

            return(users);
        }
Example #2
0
        public static void DumpServer(string serverName)
        {
            StreamWriter writer        = new StreamWriter(serverName + ".txt");
            IntPtr       resume_handle = IntPtr.Zero;
            IntPtr       ptr           = IntPtr.Zero;
            int          resume        = 0;
            double       total_counted = 0;
            double       max           = 0;
            int          totalentries  = 0;
            int          entriesread   = 0;
            int          prefmaxlen    = 1048576 * 10; // 1 MB * 10
            Stopwatch    sw            = new Stopwatch();

            writer.WriteLine("Name\tFull Name\tComment\tUser Comment\tFlags\tAuth Flags\tPw Age\tExpired Pw?\tLast Logon\tLast Logoff\tExpiry Date\tPriv\tBad Pw Count\tProfile\tHomedir\tMax Storage\tWorkstations");

            while (true)
            {
                sw.Start();
                int status = NetUserEnum(serverName, 3, 2, out ptr, prefmaxlen, out entriesread, out totalentries, ref resume);
                sw.Stop();
                if (status != ERROR_MORE_DATA && status != 0)
                {
                    Console.WriteLine("Error: " + status);
                    break;
                }


                total_counted += entriesread;
                if (max == 0)
                {
                    max = totalentries;
                }

                IntPtr iter = ptr;
                for (int i = 0; i < entriesread; i++)
                {
                    USER_INFO_3 user = (USER_INFO_3)Marshal.PtrToStructure(iter, typeof(USER_INFO_3));
                    iter = (IntPtr)((int)iter + Marshal.SizeOf(user));
                    writer.Write(user.name);
                    writer.Write("\t");
                    writer.Write(user.full_name);
                    writer.Write("\t");
                    writer.Write(user.comment);
                    writer.Write("\t");
                    writer.Write(user.usr_comment);
                    writer.Write("\t");
                    writer.Write(FlagsToString(user.flags));
                    writer.Write("\t");
                    writer.Write(AuthFlagsToString(user.auth_flags));
                    writer.Write("\t");
                    writer.Write(user.password_age + "s - " + user.password_age / (60 * 60 * 24) + "days");
                    writer.Write("\t");
                    writer.Write(user.password_expired);
                    writer.Write("\t");
                    writer.Write(UnixToStr(user.last_logon));
                    writer.Write("\t");
                    writer.Write(UnixToStr(user.last_logoff));
                    writer.Write("\t");
                    writer.Write(UnixToStr(user.acct_expires));
                    writer.Write("\t");
                    writer.Write(user.priv);
                    writer.Write("\t");
                    writer.Write(user.bad_pw_count);
                    writer.Write("\t");
                    writer.Write(user.profile);
                    writer.Write("\t");
                    writer.Write(user.home_dir_drive);
                    writer.Write("\t");
                    writer.Write(user.max_storage);
                    writer.Write("\t");
                    writer.Write(user.workstations);
                    writer.Write("\t");
                    writer.WriteLine();
                }
                writer.Flush();

                NetApiBufferFree(ptr);

                Console.WriteLine(String.Format("{0:#.##}% {1} / {2} in {3}s - {4:#.##} users/sec", (total_counted / max) * 100, total_counted, max, sw.ElapsedMilliseconds / 1000, total_counted / (sw.ElapsedMilliseconds / 1000)));

                if (status == 0)
                {
                    break;
                }
            }
            writer.Close();
            Console.WriteLine("Done.");
        }