Active Directory LDAP Abfrage mit PHP

webdoktor

Angesehenes Mitglied
Hallo zusammen

Ich bin dran, eine Anwendung mit PHP zu schreiben welche den Benutzer aus
dem Active Directory auslesen muss.

Leider schaffe ich es nicht, den Global Catalog des Active Directorys auszulesen
sondern immer nur eine einzige OU. Da wir mehrere OU's haben in unserem AD
wäre es gut wenn ich entweder den ganzen Global Catalog durchsuchen kann oder
aber wenigstens alle OU.

Im Moment mache ich das so:

//################ Auslesen des Active Directory ###################

// Base DN bezeichnet die oberste OU unter der die User zu finden sind.
$basedn = "ou=User_DE, ou=Schweiz, dc=test, dc=test2, dc=local";
$server = "server01.test.test2.local";

// da der Zugriff auch ohne Anmeldung möglich sein soll, hab ich einen extra User im AD angelegt, um mich mit dem Server zu verbinden.
$username = "ldapquery@test.test2.local";
$passwort = "xxxyyy";

//LDAP Port festlegen um Abfragen im AD zu machen.
$ldap_port = "389";

// LDAP Abfrage
$filter = "(&(objectClass=user))";

// Verbindung zum AD herstellen
$connectid = @ldap_connect($server);

// Mit dem AD Verbinden
$binding = @ldap_bind($connectid,$username,$passwort) or die (include "fehler.php");


// AD auslesen
$search = @ldap_search($connectid,$basedn,$filter);
$result = ldap_get_entries($connectid,$search);



//################ ENDE Auslesen des Active Directory ###################

Dann schreibe ich alles kompliziert in eine Datei um es dann definitiv zu durchsuchen. Aber irgnedwie ist das wohl nicht der richtige Weg?
Wer kann mir helfen wie ich das AD einfach durchsuchen kann z.B. nach einem Benutzer "Hans Muster" und am besten über alle OU's.

Bin euch für Antworten sehr dankbar!
Gruss Marco
 
Hallo Sascha

Das geht leider nicht, dann nimt er nur die Benutzer welche direkt im Root Verzeichnis sind.

Liebe Grüsse Marco
 
Wenn du den Global Catalog durchsuchen willst - solltest du dich auch auf diesen Verbinden
wink.gif
MS hat diesen auf Port 3268 gelegt. Dort kannst du danach normale LDAP-Abfragen durchführen.

Nachtrag;
Damit du den ganzen Baum durchsuchen kannst, musst du dem Script beibringen können den ganzen Subtree abzugrasen. Soweit meine grauen Hirnzellen das archiviert haben geht das über "ldap_set_option()". Steht irgendwo auf php.net mit einem guten Beispiel.
 
Hi Alonso

Vielen Dank für Deine Antwort. Jep, mir ist der Global Catalog Port bekannt und ich habe es auch schon mit diesem Versucht leider ohne
Erfolg. Es muss nicht unbedingt der Global Catalog sein (wobei schön wäre es) aber ich wäre schon sehr zufrieden wenn es alle Unterbäume
durchsucht.

Ich stelle mir immer noch folgendes vor, dass ich ein Input-Feld habe welches eine Auto-Complet hat wo das AD durchsucht. Ist das überhaupt
so möglich resp. hat jemand damit Erfahrung?

Grüsse Marco
 
http://php.net/manual/en/function.ldap-search.php

Ich hatte damals glaubs das Beispiel von php @ fccfurn dot com übernommen, welches fast direkt das gewünschte Resultat geliefert hat. War aber irrtum vorbehalten damals noch ein Windows 2000 DC.

CODE
<?php
$ldap_host = "pdc.php.net";
$base_dn = "DC=php,DC=net";
$filter = "(cn=Joe User)";
$ldap_user  = "CN=Joe User,OU=Sales,DC=php,DC=net";
$ldap_pass = "pass";
$connect = ldap_connect( $ldap_host, $ldap_port)
        or exit(">>Could not connect to LDAP server<<");
ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
$bind = ldap_bind($connect, $ldap_user, $ldap_pass)
     or exit(">>Could not bind to $ldap_host<<");
$read = ldap_search($connect, $base_dn, $filter)
     or exit(">>Unable to search ldap server<<");
$info = ldap_get_entries($connect, $read);
echo $info["count"]." entries returned<p>";
$ii=0;
for ($i=0; $ii<$info[$i]["count"]; $ii++){
   $data = $info[$i][$ii];
   echo $data.":  ".$info[$i][$data][0]."<br>";
}
ldap_close($connect);
?>



Für solche Aufgaben wäre es aber durchaus sinnvoll, auf den GC zuzugreiffen. Bei komplexeren AD-Setups mit mehreren DC's (z.B. bei forests) hast du sonst plötzlich eine Referenz für das entsprechende Objekt auf dem zuständigen DC als Resultat - und nicht wie gewünscht ein LDAP "Objekt". Der GC liefert dir dagegen niemals eine Referenz.


Hast du mal versucht mit einem LDAP Browser (z.B. Apache Directory Studio) die gwünschten Informationen zu "lesen"?
 
Lieber Alonso

Zuerst mal vielen Dank für Deine Hilfe. Nun ich würde wirklich gerne den GC auslesen da wir noch andere Domänen haben
und ich sonst nur einen Teil der Informationen habe.

Ich kann mich mit dem LDAP-Programm "Softerra LDAP Browser" ohne Probleme die GC informationen auslesen.
Darum finde ich es komisch resp. schade das es mit PHP nicht geht. Hmm?

Freue mich über Deine Antwort.
Marco
 
Zurück
Oben