Benutzer im Active Directory suchen in C# – der einfache Weg

Vorgestern schrieb ich noch darüber, wie man die Active Directory Suchfunktion in Windows 7 erreicht. Heute soll es darum gehen, wie man in C# komfortabel das Active Directory nach Benutzern durchsuchen kann. Der Schwerpunkt liegt hierbei auf komfortabel, denn Artikel über die Thematik generell gibt es schon einige im Netz. Die meisten nutzen dafür jedoch ausschließlich die Methoden rund um System.DirectoryServices.ActiveDirectory und den DirectorySearcher. Doch seit .NET 3.5 geht es auch mit wesentlich weniger und vorallem, wie ich finde, verständlicherem Quelltext.

Doch kommen wir nun zur Sache. In dem folgenden Beispiel nutze ich hauptsächlich Methoden aus dem System.DirectoryServices.AccountManagement Namespace. Und so geht’s:

//Einen Kontext zur entsprechenden Windows Domäne erstellen
PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,
                                                      "meineDomaene");

//Ein "User-Objekt" im Kontext anlegen
UserPrincipal user = new UserPrincipal(domainContext);

//Den Suchparameter angeben
user.Name = "he*";

//Den Sucher anlegen und ihm die Suchkriterien
//(unser User-Objekt) übergeben
PrincipalSearcher pS = new PrincipalSearcher();
pS.QueryFilter = user;

//Die Suche durchführen
PrincipalSearchResult<Principal> results = pS.FindAll();

//Bei Bedarf weitere Details abfragen
Principal pc = results.ToList()[0];
DirectoryEntry de = (DirectoryEntry)pc.GetUnderlyingObject();

//Erstes Ergebnis zum Test ausgeben
MessageBox.Show(de.Properties["mail"].Value.ToString());

Nach dem ihr nun den Quelltext gesehen habt, gibt’s natürlich noch ein paar Hinweise dazu. In Zeile 9 habe ich die Name-Eigenschaft von user gesetzt. Das * gilt dabei als Wildcard. Es würden also in Zeile 17 alle Active Directory Benutzereinträge zurückgegeben, deren Name mit “he” anfängt und beliebig weiter geht.

Grundsätzlich lässt sich noch dazu sagen, dass ihr auch andere Eigenschaften, statt der Name-Eigenschaft, setzen könnt, die dann als Suchfilter fungieren. Auch das kombinieren von mehreren Eigenschaften ist möglich.

Keine Produkte gefunden.

Außerdem möchte ich noch anmerken, das alles ab Zeile 21 optional ist. In den meisten Fällen dürften die Principal-Objekte reichen, die der PrincipalSearcher zurückgibt. Diese Principal-Objekte enthalten jedoch nicht alle Properties, die man so im Active Directory setzen kann.

Solltet ihr also eine Eigentschaft suchen, die das Principal Objekt nicht fasst, so müsst ihr auf den am Anfang des Artikels angesprochenen alten Weg zurückgreifen. Dazu wird das unterlegene Objekt des Principal mittels GetUnderlyingObject ermittelt und als DirectoryEntry gecastet. Diesem könnt ihr dann, wie in Zeile 24 gezeigt, alle beliebigen Informationen entnehmen.

Ich hoffe, ich konnte euch mit diesem Artikel ein wenig helfen. Viel Spaß damit. Solltet ihr noch Fragen haben, schreibt mir einfach einen Kommentar.

Viele Grüße,
Raffi

2 Kommentare

  1. Supahupesays:

    Hey, ich weiß der Artikel ist ewig alt; trotzdem vielen Dank dafür, hat mir heute sehr weitergeholfen. Habe aktuell das Problem in der Firma, dass ich mittels Windows-Bordmitteln (dsquery,…) nicht 100% eindeutig herausbekam, wann sich jemand zuletzt an der Domäne angemeldet hat (evtl habe ich dsquery falsch verwendet -> bin für jeden Hinweis offen). Das sollte eigentlich die eingesetzte HelpDesk-Software übernehmen, die a) gerne bei der Installation vergessen wird und b) nicht immer sauber kommuniziert, weil manche Admins gerne mal vergessen, die Ports in der FW freizugeben :-) (ja ich weiß, es gibt GPO’s => ich kanns nicht oft genug wiederholen). Nach kurzer Suche habe ich deinen Code oben gefunden und suche dann nach dem LastLogon bzw. LastLogonTimestamp über alle Domaincontroller hinweg. Dazu war zwar noch einiges an Anpassung notwendig, funktioniert aber wunderprächtig. Morgen werde ich das ganze noch mit GUI versehen sowie ein paar Config-Files machen, um nachträgliche Domänenänderungen vorzusehen sowie auch den Export mehrerer User in CSV und ggf. noch diverse Suchparameter einfließen lassen – mal schauen, was die Kollegen so anfordern :-).

    War jedenfalls genau das, was ich gesucht habe. Und es ist immer schön, mal von Java weg zu kommen ;-)

    • PUTTEHUPEsays:

      Danach musste er noch zum Urologen, weil (und das kann man nicht oft genug sagen) man auf seine Prostata schauen muss. Seinen Hund hatte es ja ganz übel erwischt, der hatte ja dann auch noch Hodenkrebs gehabt. Deshalb hatte ja seine Tante Frida immer gesagt … ;-)

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Sie dient nur dem Spamschutz.