docsam
Goto Top

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.


// 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. 

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

stefan2904
stefan2904 30.03.2006 um 13:13:48 Uhr
Goto Top
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
docsam
docsam 04.04.2006, aktualisiert am 18.10.2012 um 17:56:46 Uhr
Goto Top
HI,

schau Dir mal das Tutorial Anmeldung unter Linux mit Active Directory Benutzerdaten an. Wenn Du die Verbindung so hinbekommst, das Du z.B. Dich an Deinem Server per AD anmelden kannst, kannst Du auch entsprechende Zugriffsberechtigungen auf dem Samba-Server vornehmen.

Ich hab 2 Samba-Server, die sich mittels den Einstellungen die AD-Daten von der Domäne holen. Falls Du weitere Infos brauchst, kann ich das Tutorial entsprechend abwandeln.

Gruß
devnull
devnull 05.04.2006 um 10:25:36 Uhr
Goto Top
Hallo,

wirklich hilfreich Dein Beitrag! Danke dafür face-smile

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
docsam
docsam 05.04.2006 um 11:32:45 Uhr
Goto Top
nein Du bekommst soviel ich weiss die Passwörter nicht. Ich nutze halt einfach die Userdaten zum Login - wenn ich als Meldung "passwort falsch" bekomme, ist es halt falsch face-smile
stpe
stpe 08.04.2006 um 14:36:32 Uhr
Goto Top
Die Passwoerter werden in einer Einweg-Verschlüsselung gespeichert. Aus den verschlüsselten Passwörtern ließen sich die Klartextpasswörter nur per Brute-Force wieder ermitteln.

Und je nach Passwort kann das auch schonmal ein paar Tage dauern.

Gruss
Stefan
stefan2904
stefan2904 09.04.2006 um 19:37:36 Uhr
Goto Top
irgendwie logisch face-smile

PS: man könnte auch versuchen einen gegenalgorithmus zu schreiben, aber das wäre hier weniger zweckmässig und viel zu aufwändig... xD
stpe
stpe 11.04.2006 um 18:25:31 Uhr
Goto Top
irgendwie logisch face-smile

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
rbaumann
rbaumann 16.05.2006 um 13:29:05 Uhr
Goto Top
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
SaschaOrt
SaschaOrt 23.08.2006 um 05:22:33 Uhr
Goto Top
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)
keksprinz
keksprinz 01.12.2006 um 10:27:10 Uhr
Goto Top
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
stefan2904
stefan2904 01.12.2006 um 16:59:33 Uhr
Goto Top
naja, du musst das ldap modul für php laden.
keksprinz
keksprinz 04.12.2006 um 08:15:23 Uhr
Goto Top
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
stefan2904
stefan2904 04.12.2006 um 18:16:10 Uhr
Goto Top
also bei meiner php installation war das modul schon dabei, ich musste nur mehr das kommentarzeichen in der php.ini entfernen...
ottl05
ottl05 02.03.2007 um 08:35:49 Uhr
Goto Top
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?

<?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;   

}

?>
ottl05
ottl05 02.03.2007 um 09:10:42 Uhr
Goto Top
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 face-smile

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?

> <?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;   
> 
> }
> 
> ?>
> 

goofy79
goofy79 25.06.2007 um 17:52:18 Uhr
Goto Top
Hi,

ich habe das obinge script so genommen, jetzt habe ich noch das Problem, dass
ich die Meldung bekomme "Unable to bind to server" welche Packete müssen den
noch auf dem Linux Apache2 laufen ?
nohorn
nohorn 25.06.2007 um 18:43:03 Uhr
Goto Top
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
goofy79
goofy79 29.06.2007 um 13:32:02 Uhr
Goto Top
OK, also wenn ich einen XAMP nehme, dann funktioniert es prima
kann mir noch jemand sagen wie ich gruppen auslesen kann ?

zB alle Gruppen in diesem OU ??

Mach ich das dann einfach über Filter ?
Dackelblick
Dackelblick 22.01.2009 um 11:09:41 Uhr
Goto Top
Wie kann ich an sich eine Ebene früher in einen beliebigen Browser (Firefox, Internet, etcpp.) die aktuellen Anmeldedaten eines XP Rechners auslesen, um sie in eine Loginmaske (Javascript) übertragen? Also der Benutzernamen und ggf die AD/LDAP-Domäne oder Workgroup. Natürlich nicht das Kennwort.
stefan2904
stefan2904 22.01.2009 um 14:43:11 Uhr
Goto Top
ich würd mal behaupten dass ist nicht möglich, da es ein ziemliches risiko darstellt.
Dackelblick
Dackelblick 22.01.2009 um 14:45:31 Uhr
Goto Top
Zitat von @stefan2904:
ich würd mal behaupten dass ist nicht möglich, da es ein
ziemliches risiko darstellt.

hat sich erledigt!
ChrisNbg
ChrisNbg 27.03.2011 um 00:18:03 Uhr
Goto Top
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