Rekursive Suche im Active Directory mit PHP

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Rekursive Suche im Active Directory mit PHP

    Hallo die Herren und Damen...

    #Initialdaten

    PHP 4.4
    IIS 6.1
    AD 2k3

    #Problem

    Wir haben in unserem AD viele OU's und Unter OU's für unsere User (Fachstellenverschachtelung). Aus diesem Grund schlägt natürlich unsere Eigententwicklung zum Teil fehl, weil die User, welche in einer Unter OU sind nicht rekognoziert werden können.

    #Frage
    Gibt es eine Möglichkeit per PHP rekursiv über eine OU zu suchen? Da man ja eigentlich die OU angeben muss, sollte es doch möglich sein, alle anderen OU's unter dieser OU aufzulisten, so dass man eine Schleife machen könnte... Hat schon jemand ne Idee, wie man die OU's auslesen kann?


    Vielen Dank und "äs schöns tägli" aus der Schweiz..
    truth

  • #2
    ldap_search() mit richtigem base dn und passendem Filter sollte dir den ganzen Baum unterhalb des base dn liefern bzw. dessen Teile, die der Filter zulässt.

    Im Manual (http://php.net/ldap) findest du einige Beispiele für Filter und wie man so einen Ergebnisbaum durchläuft.

    Sehr allgemein, ich weiß. Vielleicht etwas Code posten, dann kann man ins Detail gehen.

    Kommentar


    • #3
      bsss.... ;-)

      #Dein Tip...
      Ok, das hilft mir schon extrem weiter... habe da auch ein Scriptbeispiel gefunden, hab aber nur ein kleines Problemchen dabei...

      #Script
      PHP-Code:
      <?php
      $ldap_host 
      "server.domain.tld";
      $base_dn "DC=subdomain,DC=domain,DC=tld";
      $filter "OU=*";
      $ldap_user  "userprincipalname@subdomain.domain.tld";
      $ldap_pass "pass";
      $connect ldap_connect$ldap_host$ldap_port)
               or exit(
      ">>Could not connect to LDAP server<<");
      ldap_set_option($connectLDAP_OPT_PROTOCOL_VERSION3);
      ldap_set_option($connectLDAP_OPT_REFERRALS0);
      $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["count"]; $ii++){
         
      $data $info[$i][$ii];
         echo 
      $data.":&nbsp;&nbsp;".$info[$i][$data][0]."<br>"
      }
      ldap_close($connect);
      ?>
      #Ergebnis...

      354 entries returned
      objectclass: top
      ou: # A (Aircraft Assembly)
      distinguishedname: OU=\# A (Aircraft Assembly),OU=Pilatus Users,DC=subdom,DC=dom,DC=tld
      instancetype: 4
      whencreated: 20040909120657.0Z
      whenchanged: 20041104082818.0Z
      usncreated: 73254
      usnchanged: 1437442
      name: # A (Aircraft Assembly)
      objectguid: xxxxxxxx
      objectcategory: CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=dom,DC=tld
      dscorepropagationdata: 20050314065411.0Z


      #Wetiere Fragen..
      Ich sehe an diesem Script, das er zwar die Schleife macht und wenn ich die Datei ausführe, dann habe ich auch diesen Eintrag und darunter 353 : (also er macht die Schleife richtig, was ja auch kein Wunder ist.. ;-) ). Warum schreibt er aber den unteren Elementen keine Daten mehr raus... ich komm nicht dahinter warum...



      Thx a lot für die Hilfe..
      Gruss
      truth
      Zuletzt geändert von truth[snsga.ch]; 04.08.2005, 13:48.

      Kommentar


      • #4
        PHP-Code:
        for ($i=0$ii<$info["count"]; $ii++) 
        Das habe ich noch nie gesehen und würde mich wundern, wenn es funktioniert.

        Übrigens: Nutze bitte die PHP-Tags des Forums. Macht alles schön bunt und erleichtert so das Codelesen.

        Kommentar


        • #5
          bsss again.. ;-)

          #So noch nicht gesehen...
          Ich auch nicht, aber es muss schon so sein, weil aus folgendem Grund...

          Das Arrayelement $info["count"] steht ja für die Anzahl Treffer welche die Suche ergeben hat (in meinem Beispiel 354)...

          Was ich aber nicht ganz verstehe ist, warum er das $i einbindet obwohl er es nirgend inkrementiell aufzählt. Warum er es braucht sehe ich auch nicht wirklich, aber ich kann es auch nicht rausnehmen oder alles auf $i stellen, dann zeigt er nämlich gar nichts mehr an.. ;-)

          Aber ich sehe, Du scheinst genauso anzustehen wie ich auch.. ;-))

          Gruss
          truth

          Kommentar


          • #6
            Hallo,

            jetzt habe ich rekursiv gelesen und mich schon gefreut, aber war nix.

            Ok, habe null Ahnung wovon Du sprichst (ldap, OU, etc.), aber den Code, wenn er denn, wie Du sagst, funktioniert, würde ich sofort so umschreiben:

            PHP-Code:
            for ($i=0$i<$info["count"]; $i++){
               
            $data $info[0][$i];
               echo 
            $data.":&nbsp;&nbsp;".$info[0][$data][0]."<br>"

            Das alte $i brauchst Du nicht, da sowieso immer 0 (Null) und die Initialisierung von $ii (das neue $i) gehört zwecks Lesbarkeit in die for-Schleife.

            Aber interessant wäre jetzt noch zu wissen, wie denn der Merkmalsname der weiteren Einträge ist?
            Oder lautet dieser immer 'objectclass'?

            Ich gehe mal davon aus, dass Du den Code von
            http://de.php.net/manual/en/function.ldap-search.php
            hast.

            Versuch doch auch mal das Beispiel mit $i, $ii und $iii oder das darüber (vom '15-Aug-2003 10:38' bzw. '19-Aug-2003 08:17').

            Evtl. wirst dann zumindest Du daraus schlau :-)

            Grüße,
            Bernhard
            Zuletzt geändert von verfrellt; 06.08.2005, 00:11.

            Kommentar


            • #7
              Loeschen dieses Beitrags geht nicht, da keine Rechte!
              Zuletzt geändert von verfrellt; 06.08.2005, 00:12.

              Kommentar


              • #8
                Weiß hier eigentlich einer wie das Array genau aussieht?

                Mach mal unter
                PHP-Code:
                <?php
                $info 
                ldap_get_entries($connect$read);
                echo 
                '<pre>' print_r($infotrue) . '</pre>';
                ?>
                und guck dir an, ob das Array überhaupt ne richtige Form hat. Vielleicht sind die Unterverzeichnisse ja auch in anderen Keys als 0 *zuck*

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar


                • #9
                  Hallo Ihr beiden...

                  #First...
                  Danke für Eure Antworten, habe aber nach ein paar Stunden schon mal ein bisschen was herausgefunden.. ;-)

                  PHP-Code:
                   for($i=0;$i count($info); $i++) {echo $i." ".$info[$i][dn]."<br>"; } 
                  Mit dieser Schleife funkt es dann auch, aber was noch komisch ist, dass er mir nur von einer gewissen OU die UnterOU's auflistet, schnall ich im Moment zwar noch nicht, werde aber auch noch dahinter kommen.. ;-)

                  Vielleicht sollte ich auch mal ein paar Bilder von unserem AD machen, damit Ihr Euch das vorstellen könnt... werde mal gucken was sich machen lässt...


                  Gruss
                  truth

                  Kommentar


                  • #10
                    Kannst dir das Bildermalen auch sparen, wenn du ein paar DNs angibst. Aber schreib sie bitte umgekehrt, also die Wurzel zuerst.

                    Aus den Usercomments: BaseDN und Filter besser komplett klein schreiben. Also ou statt OU usw.

                    Kommentar


                    • #11
                      Hallo nochmal!

                      Hat mich jetzt doch interessiert (von wegen ou und so) und so habe ich mir die Doku, die hoffentlich einigermaßen aktuell ist, vorgenommen.

                      "Die Botschaft ist folgende: Sie können keinen Code schreiben um auf einen Verzeichnis-Server zuzugreifen, ohne etwas über dessen Struktur zu wissen. Genauso wenig können Sie eine Datenbank nutzen ohne Kenntnis darüber, was in derselben vorhanden ist."

                      Letzterer Satz gilt so zwar nicht, aber bei LDAP stimmt es möglicherweise.
                      Falls das nun so ist, wie ich es verstehe, können wir Dir wohl nicht helfen!?

                      Deswegen ja auch mein Vorschlag einmal die entsprechenden Beispiele aus dem o. a. von mir geposteten Link ("$i, $ii, $iii") zu versuchen. Aber ghostgamblers print_r() ist noch einfacher (wobei o. a. Botschaft ja dagegen spricht) und gibt wohl den ganzen multidim. array-Inhalt von $info aus. Oder nicht?

                      Mittels dieser Ausgabe müsste eine Anpassung Deines Codes dann doch ein Klacks sein...

                      Zu Deiner Codeoptimierung:
                      PHP-Code:
                      for($i=0;$i count($info); $i++) {echo $i." ".$info[$i][dn]."<br>"; } 
                      Muss es nicht
                      PHP-Code:
                      $info[$i]["dn"
                      (laut Doku) heißen?
                      Oder geht das auch ohne die Anführungszeichen?
                      Wird dasselbe ausgegeben, wie im ersten Beispiel?

                      Insoweit ich die Doku zu count() verstehe, müsstest Du m. M. nach
                      PHP-Code:
                      count$infoCOUNT_RECURSIVE 
                      verwenden, um alle Elemente, also auch die indizierten Merkmale mitzählen zu können.

                      Also print_r() scheint mir auf jeden Fall einen Versuch wert!!!

                      ---

                      Ich habe hierzu auch noch eine Frage an die php Profis:
                      Kann es sein, dass php die Dimensionen eines arrays "flexibel" interpretiert, je nachdem, wie man auf die Dimensionen zugreift?
                      Falls ja, ist das dann nicht ein bug?
                      Falls nein, ist gut :-)

                      -> Ich habe immer ein ungutes Gefühl bei der automatischen Typumwandlung oder Werteinterpretation seitens php, deswegen die Frage.

                      Grüße,
                      Bernhard
                      Zuletzt geändert von verfrellt; 06.08.2005, 00:13.

                      Kommentar

                      Lädt...
                      X