Das Active Directory mit PHP und LDAP abfragen

Autor: Robert Zimmer, MCSEboard.de

Im AD können neben den Benutzerkonten einer Domäne noch viele weitere Informationen über die Benutzer abgelegt werden, zum Beispiel deren Telefonnummern oder E-Mail-Adressen. Dieser Datenbestand des Active Directory (AD) lässt sich mit eigenen PHP-Skripten nutzen, zum Beispiel um daraus eine Telefonliste für das Intranet zu generieren. Dazu wird LDAP (Lightweight Directory Access Protocol) verwendet, ein weit verbreitetes Protokoll für die Abfrage von Informationen aus einem Verzeichnisdienst.

Neben einem Domänencontroller mit installiertem Active Directory sind noch folgende Programme nötig:

  • Ein PHP-fähiger Web-Server wie z.B. XAMPP [1], für folgende Beispiele kam „XAMPP Lite Version 1.5.4a“ zum Einsatz.
  • Zum tieferen Erforschen der AD-Struktur ist das Programm "ldp.exe" sehr nützlich, dass in den Windows Support Tools [2] enthalten ist.

Zum Nachvollziehen der Beispielskripte [3] sollten grundlegende Kenntnisse in PHP und im Umgang mit dem Active Directory vorhanden sein.

Die Situation auf dem Testsystem

Für das folgende Beispiel habe ich einen Windows 2003 Domänencontroller eingerichtet, die Domäne heißt „test.local“. Des weiteren habe ich eine Organisationseinheit „Benutzer“ angelegt und einige Benutzer und Kontakte erstellt. Diese sollen letztendlich mit Hilfe von PHP und LDAP in einer HTML-Seite ausgegeben werden.

Abb. 1: Ausgangssituation im AD

Kurzübersicht: Struktur des AD

Alle Einträge im AD sind als Objekte definiert, so gibt es beispielsweise Computer-, Benutzer- und Kontakt-Objekte. Jedes Objekt verfügt über eine bestimmte Anzahl von Attributen, bei einem Benutzer sind das z.B. Name, Vorname, Telefonnummer, Abteilung und noch viele weitere.

Abgelegt werden die Objekte in speziellen Containern, so genannten Organisationseinheiten (Organizational Unit, kurz OU). Neben den vordefinierten OUs können weitere eigene OUs und Unter-OUs angelegt werden. Diese Struktur wird im MMC-Snap-In „Active Directory-Benutzer und Computer“ (siehe Abbildung 1) in einer Baumstruktur veranschaulicht.
Jedes Objekt verfügt über einen eindeutigen Namen, über den es im Verzeichnis angesprochen werden kann: Den Distinguished Name (DN). Für den Kontakt „Fred Feuerstein“ in diesem Beispiel lautet er:
„CN=Fred Feuerstein,OU=Benutzer,DC=test,DC=local“.

Das AD mit ldp.exe durchstöbern

Den DN kann man sehr komfortabel mit dem Tool „ldp.exe“ ermitteln:

  • Zunächst muss über „Connection >> Connect“ eine Verbindung mit dem Domänencontroller hergestellt (localhost, falls ldp auf dem DC gestartet wird) werden, der Port 389 ist so in Ordnung.
  • Dann muss man sich über „Connection >> Bind“ an das Verzeichnis binden, d.h. seine Anmeldeinformationen angeben: Für das Beispiel kann das Administrator-Konto verwendet werden, ein normales Benutzerkonto reicht zum Anschauen der Infos aber auch aus.
  • Über „View >> Tree View“ wird als BaseDN „DC=test,DC=local“ (da die Domäne hier test.local heißt) angegeben. Dieser BaseDN ist dann die Wurzel des Trees, der in der linken Fensterhälfte aufgebaut wird.
  • Nun kann man sich im Baum bis zum Objekt „Fred Feuerstein“ durchklicken, genau wie im MMC-Snap-In „Active Directory-Benutzer und –Computer“.
  • In der rechten Fensterhälfte werden nun u.a. die Attribute des Objekts ausgegeben, auch der DN ist sichtbar.
Abb. 2: ldp.exe im Einsatz

Interessant ist hier auch, dass ldp.exe die englischen Attributnamen ausgibt, mit diesen muss nachher auch im PHP-Skript gearbeitet werden. So muss z.B. das Feld Nachname als „sn“, der Vorname als „givenName“ angesprochen werden.

XAMPP für LDAP vorbereiten

Im Verzeichnis apache\bin im XAMPP-Ordner muss in der Datei php.ini das Zeichen „;“ vor der Zeile „extension=php_ldap.dll“ entfernt werden. Wenn man danach den Apache von XAMPP neu startet, ist das LDAP-Modul für PHP einsatzbereit.

Mit PHP auf das AD zugreifen

Das folgende Skript gibt alle Objekte (auch die in untergeordneten OUs) unterhalb des angegebenen BaseDN (hier: OU=Benutzer,DC=test,DC=local) aus.
Um das Skript „erstes_beispiel.php“ zum Laufen zu bringen, müssen folgende Schritte ausgeführt werden:

  • Datei in das htdocs-Verzeichnis der XAMPP-Installation kopieren.
  • In der Datei folgende Zeilen anpassen, d.h. die Adresse (oder den Namen) des Domänencontrollers eintragen sowie Name und Kennwort des Passworts für den Zugriff festlegen (es muss kein Administrator-Konto sein, da nur lesend auf das AD zugegriffen wird):
    $ldap_server = "ldap://192.168.200.100";
    // Konto für den Zugriff:
    $auth_user = "Administrator@test.local";
    $auth_pass = "passwort";
  • Den Pfad zu den Benutzer-Objekten anpassen:
    $base_dn = "OU=Benutzer,DC=test,DC=local";
  • Sicherstellen, dass der Domänencontroller läuft.
  • Den Apache-Server von XAMPP starten und die Seite localhost/erstes_beispiel.php öffnen.
  • Nun sollte eine Seite wie auf dem folgenden Screenshot erscheinen.
Abb. 3: Ausgabe des PHP-Skripts

Erweiterung: Nach Abteilungen gegliederte Liste

Abb. 4: Nach Abteilungen geordnete Liste

Ich habe das Skript noch etwas erweitert, so dass die Ausgabe nach Abteilungen geordnet ist, wie auf dem folgenden Screenshot dargestellt. Die Einrichtung erfolgt analog zum obigen ersten Skript.
Das Skript ist nicht sehr elegant, da ich noch nicht viel Erfahrung in PHP habe. Vielleicht kann sie aber helfen, einen Einstieg in die Thematik zu bekommen und dann eine maßgeschneiderte Lösung für die eigenen Anforderungen zu entwickeln.

Der Code dazu ist in der Datei „ausgabe_nach_abteilungen.php“ enthalten.

Offene Punkte

Wie auf den Screenshots zu sehen ist, werden Umlaute leider nicht richtig in die Sortierung einbezogen.
Das Skript für die nach Abteilungen geordnete Ausgabe stellt eine große LDAP-Abfrage und wertet diese dann aus. Wenn das AD sehr viele (über 2000?) Einträge erhält, werden nicht mehr alle ausgegeben, da die Ausgabemenge für Abfragen begrenzt ist.

Wer eine Lösung für diese Probleme oder eine elegantere Umsetzung kennt - über Anregungen und Verbesserungsvorschläge freue ich mich:
( paumus(at)googlemail.com).

Downloads

[1]  XAMPP

[2]  Windows Support Tools

[3]  PHP-Skripte

 

© MCSEboard.de, Robert Zimmer