mittels PHP das Windows Active Directory auslesen
Ich war es irgendwann leid, immer doppelt und dreifach Benutzer anzulegen und auch noch entsprechende Listen zu pflegen,
so das wir die Daten ins Active Directory eingepflegt haben. Diese Daten verwende ich z.B. auch fürs Intranet.
Ich habs mit PHP 4.3 unter Linux getestet. Wichtig ist das Euer PHP LDAP unterstützt.
Dies Script soll nur eine Anregung sein, ich habe auf Fehlerbehandlung usw. hier verzichtet. Die wichtigsten Dinge sind im Script erklärt.
Es ist eigentlich keine Zauberei.
so das wir die Daten ins Active Directory eingepflegt haben. Diese Daten verwende ich z.B. auch fürs Intranet.
Ich habs mit PHP 4.3 unter Linux getestet. Wichtig ist das Euer PHP LDAP unterstützt.
Dies Script soll nur eine Anregung sein, ich habe auf Fehlerbehandlung usw. hier verzichtet. Die wichtigsten Dinge sind im Script erklärt.
Es ist eigentlich keine Zauberei.
// Base DN bezeichnet die oberste OU unter der die User zu finden sind.
$basedn = "ou=MeineUser,dc=domain,dc=de";
$server = "pdc.domain.de"
// 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 = "ldapuser"
$password = "ldappassw"
$ldap_port = "389"
// LDAP Abfrage
// ich hab einen erweiterten Filter genommen, da ich nicht nur die User des AD haben wollte, sondern auch Kontakteinträge.
// $filter = "(&(objectClass=user)(objectCategory=person)(cn=*))";
$filter = "(&(|(objectClass=user)(objectClass=contact))(objectCategory=person)(cn=*))";
// Verbindung zum AD herstellen
$connectid = @ldap_connect($server);
// Ihr könnt dies auch nutzen, um z.B. Usernamen und Passwort z.B. fürs Intranet zu verifizieren.
$binding = @ldap_bind($connectid,$username,$password) or die("Fehler");
// AD auslesen
$search = @ldap_search($connectid,$basedn,$filter);
$result = ldap_get_entries($connectid,$sr);
// in $result sind nun alle User mit allen Informationen enthalten.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 29328
Url: https://administrator.de/tutorial/mittels-php-das-windows-active-directory-auslesen-29328.html
Ausgedruckt am: 22.12.2024 um 20:12 Uhr
22 Kommentare
Neuester Kommentar
wichtig ist auch dass man in der php.ini im verzeichnis "C:\xampp\xampp\apache\bin" (bei xampp) den ; vor ;extension=php_ldap.dll entfernt, und anschliessen den xampp neu startet....
das war nämlich mein problem ;) ich hab die im php.ini im "C:\xampp\xampp\php" geänderrt, was aber nur auf die konsolenversion von php auswirkungen hat, nicht aber aufs apache modul...
greetz und thx fürs tut
das war nämlich mein problem ;) ich hab die im php.ini im "C:\xampp\xampp\php" geänderrt, was aber nur auf die konsolenversion von php auswirkungen hat, nicht aber aufs apache modul...
greetz und thx fürs tut
Hallo,
wirklich hilfreich Dein Beitrag! Danke dafür
Habe auf Basis des Scripts mir ein php Script gebaut, was mir ein Asciifile erstellt. Dieses möchte ich einer CTI Anwendung unterschieben. Allerdings brauche ich dafür die Passwörter in Klartext.
Hab gestern den halben Tag verbracht, es aber nicht hinbekommen. Kann man die Kerberos Kennwörter überhaupt umwandeln?
Grüsse Mario
wirklich hilfreich Dein Beitrag! Danke dafür
Habe auf Basis des Scripts mir ein php Script gebaut, was mir ein Asciifile erstellt. Dieses möchte ich einer CTI Anwendung unterschieben. Allerdings brauche ich dafür die Passwörter in Klartext.
Hab gestern den halben Tag verbracht, es aber nicht hinbekommen. Kann man die Kerberos Kennwörter überhaupt umwandeln?
Grüsse Mario
irgendwie logisch
PS: man könnte auch versuchen einen
gegenalgorithmus zu schreiben, aber das
wäre hier weniger zweckmässig und
viel zu aufwändig... xD
PS: man könnte auch versuchen einen
gegenalgorithmus zu schreiben, aber das
wäre hier weniger zweckmässig und
viel zu aufwändig... xD
Für Prüfsummen gibt es keinen "Gegenalgorithmus". Denn wie sollte man beispielsweise aus einem 32-Bit MD5-Hash ein DVD-Image wiederherstellen?
(Was prinzipiell das Gleiche wäre)
Gruss
Stefan
Hallo,
das oben angegebene Script habe ich einmal bei unserem Server getestet und bekomme leider immer wieder Fehlermeldungen.
Ich bin ziemlicher Anfänger was LDap angeht, so hoffe ich mir kann jemand helfen.
Ich arbeite mir einem Windows 2003 Server mit IIS und PHP 5.
Das Anmelden (binden) mit Usern aus der ADS klappt. Bei einem ungültigen User kommt Fehler, ansonsten OK.
Nur das Auslesen der ADS klappt nicht.
Was mache ich falsch bzw. wie muß ich vor allen Dingen die Suche aufbauen?
Hier mein Script dazu:
__________________________________________________
<?php
Base DN bezeichnet die oberste OU unter der die User zu finden sind.
$basedn = "ou=Unterricht,dc=inis-rs,dc=local,dc=de";
$server = "fs2k3.inis-rs.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 = "User";
$password = "test";
$ldap_port = "389";
LDAP Abfrage
ich hab einen erweiterten Filter genommen, da ich nicht nur die User des AD haben wollte, sondern auch Kontakteinträge.
$filter = "(&(objectClass=user)(objectCategory=person)(cn=*))";
$filter = "(&(|(objectClass=user)(objectClass=contact))(objectCategory=person)(cn=*))";
Verbindung zum AD herstellen
$connectid = @ldap_connect($server);
Ihr könnt dies auch nutzen, um z.B. Usernamen und Passwort z.B. fürs Intranet zu verifizieren.
$binding = @ldap_bind($connectid,$username,$password) or die("Fehler");
echo "ok";
AD auslesen
$search = ldap_search($connectid,$basedn,$filter);
$result = ldap_get_entries($connectid,$search);
// in $result sind nun alle User mit allen Informationen enthalten.
echo $result;
print_r($result);
___________________________________________________
Meine Ausgaben des Scriptes:
ok
Warning: ldap_search() [function.ldap-search]: Search: Can't contact LDAP server in C:\Webroot\ldap\index.php on line 28
Warning: ldap_get_entries(): supplied argument is not a valid ldap result resource in C:\Webroot\ldap\index.php on line 29
Hoffe mir kann jemand helfen.
Denke
Richard
das oben angegebene Script habe ich einmal bei unserem Server getestet und bekomme leider immer wieder Fehlermeldungen.
Ich bin ziemlicher Anfänger was LDap angeht, so hoffe ich mir kann jemand helfen.
Ich arbeite mir einem Windows 2003 Server mit IIS und PHP 5.
Das Anmelden (binden) mit Usern aus der ADS klappt. Bei einem ungültigen User kommt Fehler, ansonsten OK.
Nur das Auslesen der ADS klappt nicht.
Was mache ich falsch bzw. wie muß ich vor allen Dingen die Suche aufbauen?
Hier mein Script dazu:
__________________________________________________
<?php
Base DN bezeichnet die oberste OU unter der die User zu finden sind.
$basedn = "ou=Unterricht,dc=inis-rs,dc=local,dc=de";
$server = "fs2k3.inis-rs.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 = "User";
$password = "test";
$ldap_port = "389";
LDAP Abfrage
ich hab einen erweiterten Filter genommen, da ich nicht nur die User des AD haben wollte, sondern auch Kontakteinträge.
$filter = "(&(objectClass=user)(objectCategory=person)(cn=*))";
$filter = "(&(|(objectClass=user)(objectClass=contact))(objectCategory=person)(cn=*))";
Verbindung zum AD herstellen
$connectid = @ldap_connect($server);
Ihr könnt dies auch nutzen, um z.B. Usernamen und Passwort z.B. fürs Intranet zu verifizieren.
$binding = @ldap_bind($connectid,$username,$password) or die("Fehler");
echo "ok";
AD auslesen
$search = ldap_search($connectid,$basedn,$filter);
$result = ldap_get_entries($connectid,$search);
// in $result sind nun alle User mit allen Informationen enthalten.
echo $result;
print_r($result);
___________________________________________________
Meine Ausgaben des Scriptes:
ok
Warning: ldap_search() [function.ldap-search]: Search: Can't contact LDAP server in C:\Webroot\ldap\index.php on line 28
Warning: ldap_get_entries(): supplied argument is not a valid ldap result resource in C:\Webroot\ldap\index.php on line 29
Hoffe mir kann jemand helfen.
Denke
Richard
aus dem AD von jemand anderen habe ich dashier geschaffen, ist ja schön, es gibt die genaue Netzwerkopsition von einem Server an, aber was bringt mir das?
ist es auch irgendwie möglich, datein anzuzeigen (order/rechnerinhalt) oder am besten sogar Datein uploaden und downloaden (auslesen)?
<?
class acceso
{
var $mi_usuario;
var $objUser;
var $user;
var $usuario;
function validar_acceso($Name_user, $Name_pass, $set_domain){
$this->mi_usuario = str_replace(chr(92), chr(47), $set_domain);
$this->mi_usuario = str_replace("","/",$this->mi_usuario);
$this->mi_usuario = "WinNT:".$this->mi_usuario;
$this->objUser = "WinNT://".$set_domain."/".$Name_user.",user";
$this->user = new COM($this->objUser);
$this->usuario = new COM($this->mi_usuario);
$usuario=$this->usuario->ADsPath;
$user=$this->user;
print_r($usuario);
}
}
$objValidar = new acceso;
$objValidar->validar_acceso('user', 'passwd', 'server');
?>
Danke.
p.s.: dafür müsste man sich dann ja eigendlich auchnoch richtig anmelden, bisjetzt ist es ja unr der server (Passwort, benutzername)
ist es auch irgendwie möglich, datein anzuzeigen (order/rechnerinhalt) oder am besten sogar Datein uploaden und downloaden (auslesen)?
<?
class acceso
{
var $mi_usuario;
var $objUser;
var $user;
var $usuario;
function validar_acceso($Name_user, $Name_pass, $set_domain){
$this->mi_usuario = str_replace(chr(92), chr(47), $set_domain);
$this->mi_usuario = str_replace("","/",$this->mi_usuario);
$this->mi_usuario = "WinNT:".$this->mi_usuario;
$this->objUser = "WinNT://".$set_domain."/".$Name_user.",user";
$this->user = new COM($this->objUser);
$this->usuario = new COM($this->mi_usuario);
$usuario=$this->usuario->ADsPath;
$user=$this->user;
print_r($usuario);
}
}
$objValidar = new acceso;
$objValidar->validar_acceso('user', 'passwd', 'server');
?>
Danke.
p.s.: dafür müsste man sich dann ja eigendlich auchnoch richtig anmelden, bisjetzt ist es ja unr der server (Passwort, benutzername)
Hallo zusammen,
nach 4 Stunden Googlen komme ich nicht drauf. Ich bekomme einfach keinen Connect zum Server hin. Muss ich zusäzlich was zum PHP installieren ? Ich finde viele Anleitungen für Linux jedoch nicht für Windows und den ISS. Wie kann ich prüfen wo der Fehler liegt?
Es erscheint keine Fehlermeldung !
und ich kann mir keine connectid ausgeben lassen.
Wäre für jede Antwort sehr dankbar.
Keksprinz
nach 4 Stunden Googlen komme ich nicht drauf. Ich bekomme einfach keinen Connect zum Server hin. Muss ich zusäzlich was zum PHP installieren ? Ich finde viele Anleitungen für Linux jedoch nicht für Windows und den ISS. Wie kann ich prüfen wo der Fehler liegt?
Es erscheint keine Fehlermeldung !
und ich kann mir keine connectid ausgeben lassen.
Wäre für jede Antwort sehr dankbar.
Keksprinz
Hallo zusammen,
um das Ldap Modul zu laden, wollte ich wie im Handbuch vorgehen s.u.
Leider finde ich die Dateien libeay32.dll und ssleay32.dll nicht zum Download.
Jemand nen Tipp ?
Auszug aus dem PHP Handbuch !
Installation
Hinweis für Win32 Benutzer: Um dieses Modul unter Windows nutzen zu können, müssen Sie einige Dateien aus dem DLL Ordner des PHP/Win32 Packets in Ihr SYSTEM32 Verzeichnis Ihres Systems kopieren (z.B.: C:\WINNT\SYSTEM32, C:\WINDOWS\SYSTEM32 oder c:\WINDOWS\SYSTEM). Für PHP <= 4.2.0 kopieren Sie libsasl.dll, für PHP >= 4.3.0 kopieren Sie libeay32.dll und ssleay32.dll in Ihr SYSTEM Verzeichnis.
Gruß
Keksprinz
um das Ldap Modul zu laden, wollte ich wie im Handbuch vorgehen s.u.
Leider finde ich die Dateien libeay32.dll und ssleay32.dll nicht zum Download.
Jemand nen Tipp ?
Auszug aus dem PHP Handbuch !
Installation
Hinweis für Win32 Benutzer: Um dieses Modul unter Windows nutzen zu können, müssen Sie einige Dateien aus dem DLL Ordner des PHP/Win32 Packets in Ihr SYSTEM32 Verzeichnis Ihres Systems kopieren (z.B.: C:\WINNT\SYSTEM32, C:\WINDOWS\SYSTEM32 oder c:\WINDOWS\SYSTEM). Für PHP <= 4.2.0 kopieren Sie libsasl.dll, für PHP >= 4.3.0 kopieren Sie libeay32.dll und ssleay32.dll in Ihr SYSTEM Verzeichnis.
Gruß
Keksprinz
Hallo,
ich möchte für das Intranet mittels php einige Daten aus dem ADS auslesen.
Es klappt mit der Verbindung und ich bekomme auch einige Daten, aber nicht alle.
Es kommen keine Daten für
- givenName
- homePhone
- facsimileTelephonenumber
- streetAddress
- postalCode
- extensionAttribute2
Im ADS sind diese Felder mit Daten gefüllt, für sn, title, mail, company und l bekomme ich die Daten auch ausgelesen.
Warum nicht bei den oberen Feldern?
Woran liegt das?
ich möchte für das Intranet mittels php einige Daten aus dem ADS auslesen.
Es klappt mit der Verbindung und ich bekomme auch einige Daten, aber nicht alle.
Es kommen keine Daten für
- givenName
- homePhone
- facsimileTelephonenumber
- streetAddress
- postalCode
- extensionAttribute2
Im ADS sind diese Felder mit Daten gefüllt, für sn, title, mail, company und l bekomme ich die Daten auch ausgelesen.
Warum nicht bei den oberen Feldern?
Woran liegt das?
<?php
//domain infos
$ldap_server = "ldap://server.xxx.local";
$auth_user = "ldap@xxx.local";
$auth_pass = "xxx";
$newline = "
";
$comma = ",";
// Set the base dn for the search
$base_dn = "OU=Anwender,OU=1User,DC=xxx,DC=local";
// Show only user persons
$filter = "(&(objectClass=user)(objectCategory=person)(cn=*))";
// Enable to show only users
//$filter = "(&(objectClass=user)(cn=$*))";
// Enable to show everything
//$filter = "(cn=*)";
// Enable to show only computers
// $filter = "(&(objectClass=computer)(cn=*))";
// connect to server
if (!($connect=@ldap_connect($ldap_server))) {
die("Could not connect to ldap server");
}
// Needed for W2003 AD..
ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
// bind to server
if (!($bind=@ldap_bind($connect, $auth_user, $auth_pass))) {
die("Unable to bind to server");
}
// Restrict errors
$errors_level = ini_get("error_reporting");
error_reporting(0);
//*********** the search ***************
// search active directory
if (!($search=@ldap_search($connect,$base_dn,$filter))) {
die("Unable to search ldap server");
}
// Find out what we can see
$number_returned = ldap_count_entries($connect,$search);
$info = ldap_get_entries($connect, $search);
//Number of hits
echo "number of entries " . $number_returned . $newline;
//the result
echo "givenName, sn, title, homePhone, facsimileTelephoneNumber, mail, company, streetAddress, postalCode, l, extensionAttribute2". $newline;
for ($i=0; $i<$info["count"]; $i++) {
echo "". $info[$i]["givenName"].$comma;
echo "". $info[$i]["sn"].$comma;
echo "". $info[$i]["title"].$comma;
echo "". $info[$i]["homePhone"].$comma;
echo "". $info[$i]["facsimileTelephoneNumber"].$comma;
echo "". $info[$i]["mail"].$comma;
echo "". $info[$i]["company"].$comma;
echo "". $info[$i]["streetAddress"].$comma;
echo "". $info[$i]["postalCode"].$comma;
echo "". $info[$i]["l"].$comma;
echo "". $info[$i]["extensionAttribute2"];
echo "".$newline;
}
?>
ich bin mittlerweile ein Stück weiter, ich hatte die Felder so geschrieben wie im ads, jetzt hab ich alles klein geschrieben und ich habe die daten
wie bekomme ich jetzt noch die umlaute hin??
wie bekomme ich jetzt noch die umlaute hin??
Hallo,
ich möchte für das Intranet
mittels php einige Daten aus dem ADS
auslesen.
Es klappt mit der Verbindung und ich bekomme
auch einige Daten, aber nicht alle.
Es kommen keine Daten für
- givenName
- homePhone
- facsimileTelephonenumber
- streetAddress
- postalCode
- extensionAttribute2
Im ADS sind diese Felder mit Daten
gefüllt, für sn, title, mail,
company und l bekomme ich die Daten auch
ausgelesen.
Warum nicht bei den oberen Feldern?
Woran liegt das?
ich möchte für das Intranet
mittels php einige Daten aus dem ADS
auslesen.
Es klappt mit der Verbindung und ich bekomme
auch einige Daten, aber nicht alle.
Es kommen keine Daten für
- givenName
- homePhone
- facsimileTelephonenumber
- streetAddress
- postalCode
- extensionAttribute2
Im ADS sind diese Felder mit Daten
gefüllt, für sn, title, mail,
company und l bekomme ich die Daten auch
ausgelesen.
Warum nicht bei den oberen Feldern?
Woran liegt das?
> <?php
>
> //domain infos
> $ldap_server =
> "ldap://server.xxx.local";
> $auth_user = "ldap@xxx.local";
> $auth_pass = "xxx";
> $newline = "
> ";
> $comma = ",";
>
> // Set the base dn for the search
> $base_dn =
> "OU=Anwender,OU=1User,DC=xxx,DC=local";
>
> // Show only user persons
> $filter =
> "(&(objectClass=user)(objectCategory=person)(cn=*))";
>
>
> // Enable to show only users
> //$filter =
> "(&(objectClass=user)(cn=$*))";
>
>
> // Enable to show everything
> //$filter = "(cn=*)";
>
> // Enable to show only computers
> // $filter =
> "(&(objectClass=computer)(cn=*))";
>
> // connect to server
> if (!($connect=@ldap_connect($ldap_server)))
> {
> die("Could not connect to ldap
> server");
> }
>
> // Needed for W2003 AD..
> ldap_set_option($connect,
> LDAP_OPT_PROTOCOL_VERSION, 3);
> ldap_set_option($connect,
> LDAP_OPT_REFERRALS, 0);
>
> // bind to server
> if (!($bind=@ldap_bind($connect, $auth_user,
> $auth_pass))) {
> die("Unable to bind to
> server");
> }
>
> // Restrict errors
> $errors_level =
> ini_get("error_reporting");
> error_reporting(0);
>
> //*********** the search ***************
>
> // search active directory
> if
> (!($search=@ldap_search($connect,$base_dn,$filter)))
> {
> die("Unable to search ldap
> server");
> }
>
> // Find out what we can see
> $number_returned =
> ldap_count_entries($connect,$search);
> $info = ldap_get_entries($connect, $search);
>
>
> //Number of hits
> echo "number of entries " .
> $number_returned . $newline;
>
>
> //the result
> echo "givenName, sn, title, homePhone,
> facsimileTelephoneNumber, mail, company,
> streetAddress, postalCode, l,
> extensionAttribute2". $newline;
> for ($i=0; $i<$info["count"];
> $i++) {
>
> echo "".
> $info[$i]["givenName"].$comma;
> echo "".
> $info[$i]["sn"].$comma;
> echo "".
> $info[$i]["title"].$comma;
> echo "".
> $info[$i]["homePhone"].$comma;
> echo "".
> $info[$i]["facsimileTelephoneNumber"].$comma;
> echo "".
> $info[$i]["mail"].$comma;
> echo "".
> $info[$i]["company"].$comma;
> echo "".
> $info[$i]["streetAddress"].$comma;
> echo "".
> $info[$i]["postalCode"].$comma;
> echo "".
> $info[$i]["l"].$comma;
> echo "".
> $info[$i]["extensionAttribute2"];
> echo "".$newline;
>
> }
>
> ?>
>
wir haben unter Windows Server 2003 xampp (apache, php,mysql) laufen. Ich möchte nur alle aktiven User auslesen und habe folgenden Filter gesetzt:
$filter = "(&(objectCategory=Computer) (!userAccountControl:1.2.840.113556.1.4.803:=8192))"
Mit der Verneinung (!userAccountControl:1.2.840.113556.1.4.803:=8192) bekomme ich immer den Fehler, dass er ldap nicht abfragen kann (Unable to search ldap server). Was ist falsch an dem filter ?
Wenn ich das Ausrufezeichen wegmache funkt es, aber halt nur die deaktivierten.
MfG
Norbert
$filter = "(&(objectCategory=Computer) (!userAccountControl:1.2.840.113556.1.4.803:=8192))"
Mit der Verneinung (!userAccountControl:1.2.840.113556.1.4.803:=8192) bekomme ich immer den Fehler, dass er ldap nicht abfragen kann (Unable to search ldap server). Was ist falsch an dem filter ?
Wenn ich das Ausrufezeichen wegmache funkt es, aber halt nur die deaktivierten.
MfG
Norbert
Zitat von @stefan2904:
ich würd mal behaupten dass ist nicht möglich, da es ein
ziemliches risiko darstellt.
ich würd mal behaupten dass ist nicht möglich, da es ein
ziemliches risiko darstellt.
hat sich erledigt!
Also am einfachsten scheint es mit dem IIS zu gehen. Bei meiner Recherche zu dem Thema bin ich (glaube ich sogar hier im Forum) drauf gestoßen dass man bei der entsprechenden Website im IIS "einfach" die Anonyme Authentifizierung deaktiviert (bei Verzeichnissicherheit/Zugriffskontrolle) und sich versichert, dass "integrierte Windows Authentifizierung" aktiv ist... schon sind folgende Variablen mit Benutzername UND Domäne gefüllt: '_SERVER["AUTH_USER"]' & '_SERVER["LOGON_USER"] ' & '_SERVER["REMOTE_USER"]'
Gruß
Christian
Gruß
Christian