LDAP Zugriffe

LDAP ist die Abkürzung von Lightweight Directory Access Protocol, das sich als Zugriff auf X.500-Standard basierende Verzeichnisinformationen über das Internet/Intranet entwickelt hat. Mittlerwiles hat sich das Als Quasi-Standard bei verschiedenen Anbietern etabliert, Beispiel sind Verzeichnisdienste wie die NDS (Novell Directory Services) und ADS (Active Directory Services von Microsoft). Der "Netscape Calendar Server" (mit Enterprise Server) bietet dies Schnittstelle ebenfalls an. Jedes LDAP soll gleich sein, ist aber in Kleinigkeiten unterschiedlich. Die Strukturierung der Informationen (Objekte) innerhalb des über LDAP angesprochenen Dienstes ist unterschiedlich. Ich habe mit erst einmal einen Freeware X500 / LDAP Browser besorgt um die Informationen über diesen Weg zu sehen. Die Objektnamen und ggf Attribute der Objekte lassen sich so erstmal ansehen bevor man loslegen kann. Hier ein Beispiel wie man aus einer NDS Daten heraus bekommt:

 
$ABTFirma = array(FIBU,IT,MKTG,SEKR); 										    # Contexte in der Firma

$UserAbteilung = array(array());                                               # Benutzer in Abteilung
$User = array();                                                               # alle Angaben des Benutzers
   
# Abteilungesüberschriften / Kontext 
for ($i=0; $i < count($ABTkomtel) ; $i++)
  { $UserAbteilung[$i][] = "Abteilung - " . $ABTFirma[$i] ; }


$ds=ldap_connect("...IP/DNS Namen des LDAP Servers ...");  

if ($ds) 
  { $r=ldap_bind($ds, "cn=Administrator,o=firma", "passwort");      # bind mit Anmeldung
    
    # Contexte Auslesen 

    $sr=ldap_search($ds,"o=firma", "sn=*");  

    $info = ldap_get_entries($ds, $sr);

    for ($i=0; $i<$info["count"]; $i++) 
      { $var = explode("," , $info[$i]["dn"]);
         $cont = explode("=" , $var[1]);
         $Context = $cont[1];
         # einige Angaben aus der NDS (ab Novell 5.0) auslesen
        $UserEintrag = $info[$i]["cn"][0] . ";". $info[$i]["sn"][0] . ";" ;
        $UserEintrag.= $info[$i]["fullname"][0] . ";". $info[$i]["passwordexpirationtime"][0] . ";" ;
        $UserEintrag.= $info[$i]["logingraceremaining"][0] . ";". $info[$i]["facsimiletelephonenumber"][0] . ";";
        $UserEintrag.= $info[$i]["logintime"][0] . ";" ;                 
        $UserEintrag.= $info[$i]["telephonenumber"][0] . ";". $info[$i]["mail"][0] . ";";
        $UserEintrag.= $info[$i]["logindisabled"][0] ;         
        
        # Abteilungsbezeichner vergleichen, wenn gefunden While verlassen, die Laufvari $i ist dann das Array 
        # in dem die Daten des Users eingetragen werden.                                      
        $j=0;                                
        $AnzAbt = count($ABTfirma) ; 
        while ($Context <> $ABTfirma[$j]) :
          $j++;
          if ($j > $AnzAbt) {break ; }   
        endwhile;  

        if ($j <= $AnzAbt) { $UserAbteilung[$j][]= $UserEintrag ;}
        
       }  
  
    ldap_close($ds);

    ... hier die Im Array angelegten Werte in Tabelleform ausgeben...
   }
 else 
  { echo "Unable to connect to LDAP server"; }

Für den Kalenderserver von Netscape habe ich mal folgendes vom Prinzip her gemacht:

# ///////////////////// Definitionen //////////////////
$DatenTel = array();  
$Verbindung = LDAPconnect(); 									# Definition siehe weiter unten
$adminaccount = "DerMasterAccount" ;
 

# ///////////////////// Funktionen //////////////////      

# ------------------------- LDAPconnect() --------------------------------------
# gibt im Falle der Verbindung die Verbindungsnummern und den Wert "true" zurück
function LDAPconnect()
 { $cal = ldap_connect("......");				# LDAP Server IP oder DNS Namen
   $con = array();
   if ($cal)
     { $con[0] = "true";
       $con[1] = $cal ;
     }
   else
     { $con[0] = "false" ;}
   return $con ;  
 }                     

# ------------------------- LDAPclose() --------------------------------------
#      
function LDAPclose()
 { GLOBAL $Verbindung;
    if ($Verbildung[1]) { $resCAL = ldap_close($Verbildung[1]) ;}  
 }

 
# ---------------------function AnzeigeLogin()---------------------------
# Anzeige des Loginfensters
function AnzeigeLogin()
 { GLOBAL $ToDo, $LoginOK;
     
   ... Funktion die ein Anmeldefenster darstellt und die Werte zur Prüfung weitergibt.
     
 }
  
# --------------------------- -----------------------------------
# .
function AnmeldenCAL()
  { GLOBAL $Verbindung, $LoginOK, $adminaccount , $AnmeldeAccount,$Anmeldepwd,$ToDo, $SuchWert;
    $ConNrCAL = $Verbindung[1];
    if (!isset($LoginOK)) { $LoginOK= 0 ;  }

    $userCAL = "uid=" . $AnmeldeAccount  ; 
    $userCALDN = $userCAL . ",o=xxxx.xxx" ;  							#meistens Domainname der Firma
    
    if (isset($Anmeldepwd) && (strlen($Anmeldepwd) > 0 ))
     {  $dsCAL=@ldap_bind($ConNrCAL , $userCALDN, $Anmeldepwd); 
        if ($dsCAL) 
         { $id = ldap_search($ConNrCAL, "o=xxxx.xxx" , $userCAL);   # ganzen Server durchsuchen
           if ($id)                                                                  
             { $countCAL = ldap_count_entries($ConNrCAL, $id);  
               # $dsCAL=ldap_bind($ConNrCAL , $userCALDN, $Anmeldepwd);    
               if ($countCAL == 1)                                                    
                 {  if ($dsCAL)                                                       
                     { if ($adminaccount <> $AnmeldeAccount) 
                        { $SuchWert = $AnmeldeAccount ;
                          $SuchTyp = "account" ; 
                        }  
                          $LoginOK = 1; 
                     }
                   else                                                              
                     { echo "PWD falsch ! Bitte erneut anmelden.";
                       $LoginOK = 0; 
                     }
              } 
           else
            { echo " Ungültiger Account ! " ;
              $LoginOK = 0;  
            }
        } 
       else
        { echo " Account nicht gefunden ( $AnmeldeAccount ) !" ;
          $LoginOK = 0; }
   
      if ($AnmeldeAccount <> $adminaccount) { $SuchWert = $AnmeldeAccount ; } 
      if ($dsCAL) { $res = @ldap_unbind($dsCAL2); } 
      }
     else 
       { echo " Account / PWD falsch ! Bitte erneut anmelden." ;}
     
     }
   else 
    { echo "PWD leer !Bitte erneut anmelden. " ;}

 }

# --------------------------- -----------------------------------
# Im Kalender suchen.
function SuchenKalender($suchtyp,$suchwert)
 { GLOBAL $Verbindung, $adminaccount, $AnmeldeAccount, $Anmeldepwd;
   $ConNrCAL = $Verbindung[1];
   
   switch ($suchtyp)
    { case "account": 
                 $userCAL = "uid=" . $suchwert ; 
          break;
      case "nachname": 
                 $userCAL = "sn=" . $suchwert; 
          break;
      case "vorname": 
                 $userCAL = "givenname=" . $suchwert; 
          break;

      default:   $userCAL = "uid=" . $suchwert ; 
     }
                                                           
   $FullDN = "uid=" . $AnmeldeAccount . ",o=komtel.net" ;  
   $dsCAL=ldap_bind($ConNrCAL, $FullDN ,$Anmeldepwd);

   $Scal = ldap_search($ConNrCAL, "o=xxxx.xxx" , $userCAL);    # ganzen Server durchsuchen
   $countCAL = ldap_count_entries($ConNrCAL, $Scal);  
   $CALdata = ldap_get_entries($ConNrCAL, $Scal);   
   
   if ($countCAL == 1)
     { AnzeigeTeleNummerDS($CALdata);
     }
   else
    { if ($countCAL == 0) 
        { echo " KEINE Einträge im Server gefunden - keine Änderung möglich " ; }
      if ($countCAL > 1) 
        { echo " $countCAL Einträge im Server gefunden, bitte auswählen durch anklicken." ; 
          AnzeigeTeleNummernListe($CALdata);
        }
      
     }

   if ($Scal) { $res = ldap_unbind($ConNrCAL); }
   
 }
... nicht alle verwendeten Funktionen sind aufgelistet !

# ///////////////////// Hauptroutine //////////////////
if ($Verbindung[0] == "true")
  { if (!isset($Anmeldepwd)) 
     { AnzeigeLogin();
     }
    else 
    { AnmeldenCAL(); 

      if ($LoginOK == 1)
        { switch ($ToDo)
               { case "abgleich":
                   DatensatzAendern($SuchWert,$CalMail);  
                   break; 
                 case "suchen": 
                   SuchenKalender($SuchTyp,$SuchWert);
                    if ($AnmeldeAccount == $adminaccount) { SuchFormAnzeigen($SuchWert);  }
                  break;
                 default:
                    if ($AnmeldeAccount == $adminaccount)
                      { SuchFormAnzeigen(""); }
                    else 
                      { SuchenKalender("account",$SuchWert); }
              
                }  

         }
      else
        { AnzeigeLogin(); }
          
     }                                  
    

    
   LDAPclose();
    
  }                                    

else 
  { if (!$Verbindung[1]) { echo "Mit Kalenderserver keine Verbindung zustandegekommen "  ; }    
  }

 

Verwendungshinweis: Um das Script zu verwenden einfach diese Datei über den Browser speichern und dann mit einem Texteditor oder Dreamweaver / FirstPage etc. bearbeiten. Das Script darf für jeden frei verwendet werden, soweit der Autor / Quelle genannt wird. Wer nützliche Links / Scripte hat darf die mir auch gerne zur Verfügung stellen..