2012-10-05 15 views
8

Wie kann ich eine Liste der lokalen Windows-Benutzer (Es wird nur die Benutzer, die in dem Windows-Anmeldebildschirm angezeigt werden)Wie kann ich eine Liste Lokal Windows-Benutzer (nur die Benutzer, die in dem Windows-Anmeldebildschirm angezeigt werden)

Ich habe versucht, viele Methoden mit Windows-Prinzip Bibliothek & WMI Select-Befehle. Ich bekomme immer Administrator, Gast & einige andere bizarre Konten (VUSRNEIL-DELL, $ HOMEGROUPUSER, ASPNET ... usw.)

Keines dieser 3 Benutzerkonten erscheint auf dem Anmeldebildschirm. Wie kann ich zwischen diesen Benutzertypen unterscheiden?

Ich bin Codierung in C#

Antwort

3

Wenn Sie WMI verwenden abfragen Win32_UserAccount Sie nur Artikel angezeigt werden können, die folgenden Bedingungen erfüllen:

  • Property AccountType hat die UF_NORMAL_ACCOUNT Flagge.
  • Eigenschaft Disabled ist false.
  • Eigenschaft Lockout ist false.
  • Eigenschaft LocalAccount ist true.
  • Eigenschaft SIDType ist SidTypeUser.

Wenn Sie nicht WMI verwenden können (oder Sie wollen es nicht benutzen), dann müssen Sie ein wenig mehr Arbeit tun, im Grunde haben Sie NetGroupGetUsers Funktion verwenden, um alle Benutzer aufzuzählen. Ein Beispiel finden Sie in this article on CodeProject.

10

nur einen Verweis auf System.Management in einer Konsole-Anwendung hinzufügen und diesen Code versuchen:

using System; 
using System.Management; 
using System.Linq; 

namespace ConsoleApplication5 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ManagementObjectSearcher usersSearcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_UserAccount"); 
      ManagementObjectCollection users = usersSearcher.Get(); 

      var localUsers = users.Cast<ManagementObject>().Where(
       u => (bool)u["LocalAccount"] == true && 
        (bool)u["Disabled"] == false && 
        (bool)u["Lockout"] == false && 
        int.Parse(u["SIDType"].ToString()) == 1 && 
        u["Name"].ToString() != "HomeGroupUser$"); 

      foreach (ManagementObject user in localUsers) 
      { 
       Console.WriteLine("Account Type: " + user["AccountType"].ToString()); 
       Console.WriteLine("Caption: " + user["Caption"].ToString()); 
       Console.WriteLine("Description: " + user["Description"].ToString()); 
       Console.WriteLine("Disabled: " + user["Disabled"].ToString()); 
       Console.WriteLine("Domain: " + user["Domain"].ToString()); 
       Console.WriteLine("Full Name: " + user["FullName"].ToString()); 
       Console.WriteLine("Local Account: " + user["LocalAccount"].ToString()); 
       Console.WriteLine("Lockout: " + user["Lockout"].ToString()); 
       Console.WriteLine("Name: " + user["Name"].ToString()); 
       Console.WriteLine("Password Changeable: " + user["PasswordChangeable"].ToString()); 
       Console.WriteLine("Password Expires: " + user["PasswordExpires"].ToString()); 
       Console.WriteLine("Password Required: " + user["PasswordRequired"].ToString()); 
       Console.WriteLine("SID: " + user["SID"].ToString()); 
       Console.WriteLine("SID Type: " + user["SIDType"].ToString()); 
       Console.WriteLine("Status: " + user["Status"].ToString()); 
      } 

      Console.ReadKey(); 
     } 
    } 
} 
+1

Das funktioniert gut, kann aber langsam sein. Wenn ich es auf einem Windows 7-Domänenmitglied ausführe, läuft meine gesamte Anwendung in 5 Sekunden. Wenn ich es auf einem Windows 2008 Server ausführe, dauert meine gesamte Anwendung fast 3 Minuten. Der größte Unterschied besteht in Pausen beim Durchlaufen der gefundenen Benutzer. –

+1

localusers ist in Ihrem Beispiel eine ungenutzte Variable, für was ist es in der Demo? – Offler

-2

Dies wird Ihnen eine Liste aller Benutzerkonten, deren Domäne, den vollständigen Namen und SID.

wmic useraccount get domain,name,sid