311
Andi2401
boesi666
dog
Frank
GuentherH

mittels PHP das Windows Active Directory auslesen

Mitglied: docsam
30.03.2006
12:50:47 Uhr
57841 Aufrufe
22 Antworten
Noch nicht bewertet
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.


01.
// Base DN bezeichnet die oberste OU unter der die User zu finden sind.  
02.
$basedn = "ou=MeineUser,dc=domain,dc=de"
03.
$server = "pdc.domain.de" 
04.
 
05.
// 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. 
06.
 
07.
$username = "ldapuser" 
08.
$password = "ldappassw" 
09.
 
10.
$ldap_port = "389" 
11.
 
12.
// LDAP Abfrage  
13.
// ich hab einen erweiterten Filter genommen, da ich nicht nur die User des AD haben wollte, sondern auch Kontakteinträge. 
14.
// $filter = "(&(objectClass=user)(objectCategory=person)(cn=*))"
15.
$filter = "(&(|(objectClass=user)(objectClass=contact))(objectCategory=person)(cn=*))"
16.
 
17.
// Verbindung zum AD herstellen 
18.
$connectid = @ldap_connect($server); 
19.
 
20.
// Ihr könnt dies auch nutzen, um z.B. Usernamen und Passwort z.B. fürs Intranet zu verifizieren. 
21.
$binding = @ldap_bind($connectid,$username,$password) or die("Fehler"); 
22.
 
23.
 
24.
// AD auslesen 
25.
$search = @ldap_search($connectid,$basedn,$filter); 
26.
$result = ldap_get_entries($connectid,$sr); 
27.
 
28.
// in $result sind nun alle User mit allen Informationen enthalten. 

Mitglied: stefan2904
stefan2904 schreibt am 30.03.2006 um 13:13:48 Uhr
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
Mitglied: stefan2904
stefan2904 schreibt am 04.04.2006 um 09:13:09 Uhr
Dieser Kommentar wurde von einen Moderator als gelöscht markiert!
    Mitglied: docsam
    docsam schreibt am 04.04.2006 um 10:20:26 Uhr
    HI,

    schau Dir mal das Tutorial http://www.administrator.de/index.php?con ... 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ß
    Mitglied: devnull
    devnull schreibt am 05.04.2006 um 10:25:36 Uhr
    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
    Mitglied: docsam
    docsam schreibt am 05.04.2006 um 11:32:45 Uhr
    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
    Mitglied: stpe
    stpe schreibt am 08.04.2006 um 14:36:32 Uhr
    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
    Mitglied: stefan2904
    stefan2904 schreibt am 09.04.2006 um 19:37:36 Uhr
    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
    Mitglied: stpe
    stpe schreibt am 11.04.2006 um 18:25:31 Uhr
    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
    Mitglied: rbaumann
    rbaumann schreibt am 16.05.2006 um 13:29:05 Uhr
    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
    Mitglied: SaschaOrt
    SaschaOrt schreibt am 23.08.2006 um 05:22:33 Uhr
    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)
    Mitglied: keksprinz
    keksprinz schreibt am 01.12.2006 um 10:27:10 Uhr
    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
    Mitglied: stefan2904
    stefan2904 schreibt am 01.12.2006 um 16:59:33 Uhr
    naja, du musst das ldap modul für php laden.
    Mitglied: keksprinz
    keksprinz schreibt am 04.12.2006 um 08:15:23 Uhr
    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
    Mitglied: stefan2904
    stefan2904 schreibt am 04.12.2006 um 18:16:10 Uhr
    also bei meiner php installation war das modul schon dabei, ich musste nur mehr das kommentarzeichen in der php.ini entfernen...
    Mitglied: ottl05
    ottl05 schreibt am 02.03.2007 um 08:35:49 Uhr
    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?

    01.
    <?php 
    02.
     
    03.
    //domain infos 
    04.
     $ldap_server = "ldap://server.xxx.local"; 
    05.
     $auth_user = "ldap@xxx.local"; 
    06.
     $auth_pass = "xxx"; 
    07.
     $newline = "
    08.
    "; 
    09.
     $comma = ","; 
    10.
      
    11.
    // Set the base dn for the search 
    12.
    $base_dn = "OU=Anwender,OU=1User,DC=xxx,DC=local"; 
    13.
      
    14.
    // Show only user persons 
    15.
    $filter = "(&(objectClass=user)(objectCategory=person)(cn=*))";  
    16.
     
    17.
    // Enable to show only users 
    18.
    //$filter = "(&(objectClass=user)(cn=$*))";  
    19.
     
    20.
    // Enable to show everything 
    21.
    //$filter = "(cn=*)";  
    22.
     
    23.
    // Enable to show only computers 
    24.
    // $filter = "(&(objectClass=computer)(cn=*))"; 
    25.
     
    26.
    // connect to server 
    27.
    if (!($connect=@ldap_connect($ldap_server))) { 
    28.
         die("Could not connect to ldap server"); 
    29.
    30.
     
    31.
    // Needed for W2003 AD.. 
    32.
    ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3); 
    33.
    ldap_set_option($connect, LDAP_OPT_REFERRALS, 0); 
    34.
     
    35.
    // bind to server 
    36.
    if (!($bind=@ldap_bind($connect, $auth_user, $auth_pass))) { 
    37.
         die("Unable to bind to server"); 
    38.
    39.
     
    40.
    // Restrict errors 
    41.
    $errors_level = ini_get("error_reporting"); 
    42.
    error_reporting(0); 
    43.
     
    44.
    //*********** the search *************** 
    45.
     
    46.
    // search active directory 
    47.
    if (!($search=@ldap_search($connect,$base_dn,$filter))) { 
    48.
         die("Unable to search ldap server"); 
    49.
    }   
    50.
        
    51.
    // Find out what we can see 
    52.
    $number_returned = ldap_count_entries($connect,$search); 
    53.
    $info = ldap_get_entries($connect, $search);    
    54.
     
    55.
    //Number of hits 
    56.
    echo "number of entries " . $number_returned . $newline;   
    57.
     
    58.
     
    59.
    //the result 
    60.
    echo "givenName, sn, title, homePhone, facsimileTelephoneNumber, mail, company, streetAddress, postalCode, l, extensionAttribute2". $newline; 
    61.
    for ($i=0; $i<$info["count"]; $i++) { 
    62.
     
    63.
       echo "". $info[$i]["givenName"][0].$comma; 
    64.
       echo "". $info[$i]["sn"][0].$comma; 
    65.
       echo "". $info[$i]["title"][0].$comma; 
    66.
       echo "". $info[$i]["homePhone"][0].$comma; 
    67.
       echo "". $info[$i]["facsimileTelephoneNumber"][0].$comma; 
    68.
       echo "". $info[$i]["mail"][0].$comma; 
    69.
       echo "". $info[$i]["company"][0].$comma; 
    70.
       echo "". $info[$i]["streetAddress"][0].$comma; 
    71.
       echo "". $info[$i]["postalCode"][0].$comma; 
    72.
       echo "". $info[$i]["l"][0].$comma; 
    73.
       echo "". $info[$i]["extensionAttribute2"][0]; 
    74.
       echo "".$newline;  
    75.
     
    76.
    77.
     
    78.
    ?>
    Mitglied: ottl05
    ottl05 schreibt am 02.03.2007 um 09:10:42 Uhr
    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?

    01.
    > <?php 
    02.
    >  
    03.
    > //domain infos 
    04.
    >  $ldap_server = 
    05.
    > "ldap://server.xxx.local"; 
    06.
    >  $auth_user = "ldap@xxx.local"; 
    07.
    >  $auth_pass = "xxx"; 
    08.
    >  $newline = " 
    09.
    > "; 
    10.
    >  $comma = ","; 
    11.
    >   
    12.
    > // Set the base dn for the search 
    13.
    > $base_dn = 
    14.
    > "OU=Anwender,OU=1User,DC=xxx,DC=local"; 
    15.
    >   
    16.
    > // Show only user persons 
    17.
    > $filter = 
    18.
    > "(&(objectClass=user)(objectCategory=person)(cn=*))"; 
    19.
    >  
    20.
    >  
    21.
    > // Enable to show only users 
    22.
    > //$filter = 
    23.
    > "(&(objectClass=user)(cn=$*))"; 
    24.
    >  
    25.
    >  
    26.
    > // Enable to show everything 
    27.
    > //$filter = "(cn=*)";  
    28.
    >  
    29.
    > // Enable to show only computers 
    30.
    > // $filter = 
    31.
    > "(&(objectClass=computer)(cn=*))"; 
    32.
    >  
    33.
    > // connect to server 
    34.
    > if (!($connect=@ldap_connect($ldap_server))) 
    35.
    > { 
    36.
    >      die("Could not connect to ldap 
    37.
    > server"); 
    38.
    > } 
    39.
    >  
    40.
    > // Needed for W2003 AD.. 
    41.
    > ldap_set_option($connect, 
    42.
    > LDAP_OPT_PROTOCOL_VERSION, 3); 
    43.
    > ldap_set_option($connect, 
    44.
    > LDAP_OPT_REFERRALS, 0); 
    45.
    >  
    46.
    > // bind to server 
    47.
    > if (!($bind=@ldap_bind($connect, $auth_user, 
    48.
    > $auth_pass))) { 
    49.
    >      die("Unable to bind to 
    50.
    > server"); 
    51.
    > } 
    52.
    >  
    53.
    > // Restrict errors 
    54.
    > $errors_level = 
    55.
    > ini_get("error_reporting"); 
    56.
    > error_reporting(0); 
    57.
    >  
    58.
    > //*********** the search *************** 
    59.
    >  
    60.
    > // search active directory 
    61.
    > if 
    62.
    > (!($search=@ldap_search($connect,$base_dn,$filter))) 
    63.
    > { 
    64.
    >      die("Unable to search ldap 
    65.
    > server"); 
    66.
    > }   
    67.
    >     
    68.
    > // Find out what we can see 
    69.
    > $number_returned = 
    70.
    > ldap_count_entries($connect,$search); 
    71.
    > $info = ldap_get_entries($connect, $search); 
    72.
    >    
    73.
    >  
    74.
    > //Number of hits 
    75.
    > echo "number of entries " . 
    76.
    > $number_returned . $newline;   
    77.
    >  
    78.
    >  
    79.
    > //the result 
    80.
    > echo "givenName, sn, title, homePhone, 
    81.
    > facsimileTelephoneNumber, mail, company, 
    82.
    > streetAddress, postalCode, l, 
    83.
    > extensionAttribute2". $newline; 
    84.
    > for ($i=0; $i<$info["count"]; 
    85.
    > $i++) { 
    86.
    >  
    87.
    >    echo "". 
    88.
    > $info[$i]["givenName"][0].$comma; 
    89.
    >    echo "". 
    90.
    > $info[$i]["sn"][0].$comma; 
    91.
    >    echo "". 
    92.
    > $info[$i]["title"][0].$comma; 
    93.
    >    echo "". 
    94.
    > $info[$i]["homePhone"][0].$comma; 
    95.
    >    echo "". 
    96.
    > $info[$i]["facsimileTelephoneNumber"][0].$comma; 
    97.
    >    echo "". 
    98.
    > $info[$i]["mail"][0].$comma; 
    99.
    >    echo "". 
    100.
    > $info[$i]["company"][0].$comma; 
    101.
    >    echo "". 
    102.
    > $info[$i]["streetAddress"][0].$comma; 
    103.
    >    echo "". 
    104.
    > $info[$i]["postalCode"][0].$comma; 
    105.
    >    echo "". 
    106.
    > $info[$i]["l"][0].$comma; 
    107.
    >    echo "". 
    108.
    > $info[$i]["extensionAttribute2"][0]; 
    109.
    >    echo "".$newline;  
    110.
    >  
    111.
    > } 
    112.
    >  
    113.
    > ?> 
    114.
    > 
    >
    Mitglied: goofy79
    goofy79 schreibt am 25.06.2007 um 17:52:18 Uhr
    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 ?
    Mitglied: nohorn
    nohorn schreibt am 25.06.2007 um 18:43:03 Uhr
    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
    Mitglied: goofy79
    goofy79 schreibt am 29.06.2007 um 13:32:02 Uhr
    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 ?
    Mitglied: Dackelblick
    Dackelblick schreibt am 22.01.2009 um 11:09:41 Uhr
    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.
    Mitglied: stefan2904
    stefan2904 schreibt am 22.01.2009 um 14:43:11 Uhr
    ich würd mal behaupten dass ist nicht möglich, da es ein ziemliches risiko darstellt.
    Mitglied: Dackelblick
    Dackelblick schreibt am 22.01.2009 um 14:45:31 Uhr
    Zitat von stefan2904:
    ich würd mal behaupten dass ist nicht möglich, da es ein
    ziemliches risiko darstellt.

    hat sich erledigt!
    Mitglied: ChrisNbg
    ChrisNbg schreibt am 27.03.2011 um 00:18:03 Uhr
    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
    mehr ...Ähnliche Beiträge