it-swarm.com.de

Wie kann ich eine Benutzerliste aus Active Directory abrufen?

Wie kann ich eine Benutzerliste aus Active Directory abrufen? Gibt es eine Möglichkeit, Benutzername, Vorname, Nachname abzurufen? Ich habe einen ähnlichen Beitrag gesehen, in dem dieser verwendet wurde:

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

Ich habe noch nie etwas mit Active Directory gemacht, daher bin ich völlig verloren. Jede Hilfe wäre sehr dankbar!

98
Mike

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

Active Directory ist eigentlich ein LDAP-Server. Auf dem 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

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

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

Für Ihre Frage, da Sie fragen, ob Sie das Benutzerprinzipalobjekt speziell finden möchten, ist es meiner Meinung nach am intuitivsten, PrincipalSearcher von System.DirectoryServices.AccountManagement Zu verwenden. Sie können leicht viele verschiedene Beispiele von Google finden. Hier ist ein Beispiel, das genau das tut, wonach Sie fragen.

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 sind. Insbesondere gibt givenName den First Name Und sn den Last Name. Über den Benutzernamen. Ich denke, Sie meinten den Benutzernamen. Beachten Sie, dass das AD-Benutzerobjekt zwei Anmeldenamen enthält. Einer ist samAccountName, der auch als Anmeldename für Benutzer vor Windows 2000 bezeichnet wird. userPrincipalName wird im Allgemeinen nach Windows 2000 verwendet.

211
Harvey Kwok

Wenn Sie Ihre aktiven Konten filtern möchten, fügen Sie dies zu Harveys Code hinzu:

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

nach dem ersten Gebrauch. Dann füge hinzu

  searcher.QueryFilter = userPrin;

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

21
apereira

Sicher geht das Guthaben an @ Harvey Kwok hier, aber ich wollte nur dieses Beispiel hinzufügen, weil ich in meinem Fall eine aktuelle Liste von UserPrincipals erhalten wollte. Es ist wahrscheinlich effizienter, diese Abfrage im Voraus zu filtern, aber in meiner kleinen Umgebung ist es einfacher, alles abzurufen und später nach Bedarf aus meiner Liste zu filtern.

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

using (var searcher = new PrincipalSearcher(new UserPrincipal(new PrincipalContext(ContextType.Domain, Environment.UserDomainName))))
{
    List<UserPrincipal> 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());
        }
}
5
Jordan

Schließen Sie die Datei "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);
1
FreeAsInBeer