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