Wie kann ich eine Liste von Benutzern aus dem Active Directory erhalten?

Wie kann ich eine Liste von Benutzern aus dem Active Directory erhalten? Gibt es eine Möglichkeit, Benutzername, Vorname, Nachname zu ziehen? Ich sah einen ähnlichen Beitrag, wo dies verwendet wurde:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"); 

Ich habe noch nie etwas mit Active Directory gemacht, also bin ich komplett verloren. Jede Hilfe würde sehr geschätzt werden!

Solutions Collecting From Web of "Wie kann ich eine Liste von Benutzern aus dem Active Directory erhalten?"

Wenn Sie mit Active Directory noch nicht vertraut sind, sollten Sie verstehen, wie Active Directory Daten zuerst speichert.

Active Directory ist eigentlich ein LDAP-Server. Im LDAP-Server gespeicherte Objekte werden hierarchisch gespeichert. Es ist sehr ähnlich wie Sie Ihre Dateien in Ihrem Dateisystem speichern. Deshalb hat es den Namen Directory Server und Active Directory bekommen

Die Container und Objekte in Active Directory können durch einen definierten distinguished name . Der definierte Name ist wie CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com . Wie bei einer herkömmlichen relationalen database können Sie eine Abfrage für einen LDAP-Server ausführen. Es heißt LDAP-Abfrage.

Es gibt eine Reihe von Möglichkeiten, eine LDAP-Abfrage in .NET auszuführen. Sie können DirectorySearcher von System.DirectoryServices oder SearchRequest aus System.DirectoryServices.Protocol .

Da Sie bei der Frage nach dem Benutzerprinzipalobjekt spezifisch suchen, ist die einfachste Möglichkeit, PrincipalSearcher aus System.DirectoryServices.AccountManagement . Sie können viele verschiedene Beispiele von Google leicht finden. Hier ist ein Beispiel, das genau das tut, was Sie verlangen.

 using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com")) { using (var searcher = new PrincipalSearcher(new UserPrincipal(context))) { foreach (var result in searcher.FindAll()) { DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry; Console.WriteLine("First Name: " + de.Properties["givenName"].Value); Console.WriteLine("Last Name : " + de.Properties["sn"].Value); Console.WriteLine("SAM account name : " + de.Properties["samAccountName"].Value); Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value); Console.WriteLine(); } } } Console.ReadLine(); 

Beachten Sie, dass für das AD-Benutzerobjekt eine Reihe von Attributen vorhanden ist. Insbesondere gibt givenName den givenName und sn den Last Name . Über den Benutzernamen. Ich glaube, du meintest den Benutzernamen. Beachten Sie, dass auf dem AD-Benutzerobjekt zwei Anmeldenamen vorhanden sind. Einer ist samAccountName , der auch als Benutzeranmeldename vor Windows 2000 bezeichnet wird. userPrincipalName wird userPrincipalName nach Windows 2000 verwendet.

Wenn du y aktive Accounts filtern willst, füge das zu Harvey’s Code hinzu:

  UserPrincipal userPrin = new UserPrincipal(context); userPrin.Enabled = true; 

nach der ersten Verwendung. Dann füge hinzu

  searcher.QueryFilter = userPrin; 

vor dem Fund alles. Und das sollte dir die Aktiven bringen.

Natürlich geht der Kredit an @Harvey Kwok, aber ich wollte nur dieses Beispiel hinzufügen, weil ich in meinem Fall eine Liste von UserPrincipals bekommen wollte. Es ist wahrscheinlich effizienter, diese Abfrage im Voraus zu filtern, aber in meiner kleinen Umgebung ist es einfacher, alles zu ziehen und dann nach Bedarf aus meiner Liste zu filtern.

Je nachdem, was Sie benötigen, müssen Sie möglicherweise nicht in DirectoryEntry umwandeln, aber einige Eigenschaften sind in UserPrincipal nicht verfügbar.

 using (var searcher = new PrincipalSearcher(new UserPrincipal(new PrincipalContext(ContextType.Domain, Environment.UserDomainName)))) { List users = searcher.FindAll().Select(u => (UserPrincipal)u).ToList(); foreach(var u in users) { DirectoryEntry d = (DirectoryEntry)u.GetUnderlyingObject(); Console.WriteLine(d.Properties["GivenName"]?.Value?.ToString() + d.Properties["sn"]?.Value?.ToString()); } } 

Schließen Sie die System.DirectoryServices.dll ein und verwenden Sie den folgenden Code:

 DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName); string userNames="Users : "; foreach (DirectoryEntry child in directoryEntry.Children) { if (child.SchemaClassName == "User") { userNames += child.Name + Environment.NewLine ; } } MessageBox.Show(userNames);