2013-01-16 5 views
6

Qual è il modo migliore per eseguire una ricerca sull'utente corrente per recuperare tutti gli attributi, inclusi i gruppi associati in Active Directory utilizzando LDAP/PHP?LDAP PHP Ottieni attributi utente, inclusi i gruppi associati

Per gli attributi, principalmente solo il nome, il cognome e il nome visualizzato.

Per i gruppi associati, solo i gruppi di cui è membro l'utente, ad esempio la funzione memberOf.

Ho provato alcune opzioni, ma non riesco a ottenere la giusta combinazione filtro/ricerca e la maggior parte degli esempi riguarda il recupero degli elenchi di utenti in cui c'è un gruppo conosciuto.

Ho provato in esecuzione questo dopo un vicolo cieco di successo:

$attributes = array("displayname"); 
$filter = "(&(sAMAccountName=$username))"; 
$result = ldap_search($ds, $ldapconfig['basedn'], $filter, $attributes); 
$entries = ldap_get_entries($ds, $result); 
if($entries["count"] > 0){ 
    echo "displayName: ".$entries[0]['displayname'][0]."<br/>"; 
} else { 
echo("msg:'".ldap_error($ds)."'</br>"); 
} 

che restituisce il seguente errore: "Nessun oggetto".

UPDATE:

Questo è l'ultimo blocco che ho provato e sono in grado di ottenere risultati quando ho print_r la variabile $ informazioni, tuttavia la clausola for è ancora errante fuori da qualche parte. Ho cambiato il BaseDN al solo dc attributi:

$filter="($SearchField=$SearchFor)"; 
$sr=ldap_search($ds, $basedn, $filter, $LDAPFieldsToFind); 
$info = ldap_get_entries($ds, $sr); 

if($info["count"] > 0) { 
    for ($x=0; $x<$info["count"]; $x++) { 
     $sam=$info[$x]['samaccountname'][0]; 
     $giv=$info[$x]['givenname'][0]; 
     $tel=$info[$x]['telephonenumber'][0]; 
     $email=$info[$x]['mail'][0]; 
     $nam=$info[$x]['cn'][0]; 
     $dir=$info[$x]['homedirectory'][0]; 
     $dir=strtolower($dir); 
     $pos=strpos($dir,"home"); 
     $pos=$pos+5; 
      if (stristr($sam, $SearchFor) && (strlen($dir) > 8)) { 
       print "\nActive Directory says that:\n"; 
       print "CN is: ".$nam." \n"; 
       print "SAMAccountName is: ".$sam." \n"; 
       print "Given Name is: ".$giv." \n"; 
       print "Telephone is: ".$tel." \n"; 
       print "Home Directory is: ".$dir." \n"; 
      } 
    } 
    } 

La print_r dei risultati sono:

([count] => 1 [0] => Array ([cn] => Array ([count] => 1 [0] => George) [0] => cn [givenname] => Array ([count] => 1 [0] => George) [1] => givenname [memberof] => Array ([count] => 4 [0] => CN=EQCStaff,CN=Users,DC=EQC,DC=local [1] => CN=RDS Users,OU=Security Groups,OU=Service,DC=EQC,DC=local [2] => CN=SFTP Client Folders,OU=Security Groups,OU=Service,DC=EQC,DC=local [3] => CN=EQC Staff,OU=Security Groups,OU=Service,DC=EQC,DC=local) [2] => memberof [samaccountname] => Array ([count] => 1 [0] => gortiz) [3] => samaccountname [mail] => Array ([count] => 1 [0] => [email protected]) [4] => mail [count] => 5 [dn] => CN=George,OU=Users,OU=Accounts,DC=EQC,DC=local)) 
+0

[Cosa hai provato?] (Http://whathaveyoutried.com) – Phil

+0

Grazie per il commento. Ho modificato la domanda originale con una soluzione che ho provato, che esegue una ricerca per l'attributo nome visualizzato dove sAMAccountName è uguale all'utente corrente. Ha restituito un errore "No such object". –

risposta

5

Ecco uno script che abbiamo per il dumping informazioni dC, forse vi aiuterà a:

<?php 
$ldap_columns = NULL; 
$ldap_connection = NULL; 
$ldap_password = 'top_secret_password'; 
$ldap_username = '[email protected]'.LDAP_DOMAIN; 

//------------------------------------------------------------------------------ 
// Connect to the LDAP server. 
//------------------------------------------------------------------------------ 
$ldap_connection = ldap_connect(LDAP_HOSTNAME); 
if (FALSE === $ldap_connection){ 
    die("<p>Failed to connect to the LDAP server: ". LDAP_HOSTNAME ."</p>"); 
} 

ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version'); 
ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, 0); // We need this for doing an LDAP search. 

if (TRUE !== ldap_bind($ldap_connection, $ldap_username, $ldap_password)){ 
    die('<p>Failed to bind to LDAP server.</p>'); 
} 

//------------------------------------------------------------------------------ 
// Get a list of all Active Directory users. 
//------------------------------------------------------------------------------ 
$ldap_base_dn = 'DC=xyz,DC=local'; 
$search_filter = "(&(objectCategory=person))"; 
$result = ldap_search($ldap_connection, $ldap_base_dn, $search_filter); 
if (FALSE !== $result){ 
    $entries = ldap_get_entries($ldap_connection, $result); 
    if ($entries['count'] > 0){ 
     $odd = 0; 
     foreach ($entries[0] AS $key => $value){ 
      if (0 === $odd%2){ 
       $ldap_columns[] = $key; 
      } 
      $odd++; 
     } 
     echo '<table class="data">'; 
     echo '<tr>'; 
     $header_count = 0; 
     foreach ($ldap_columns AS $col_name){ 
      if (0 === $header_count++){ 
       echo '<th class="ul">'; 
      }else if (count($ldap_columns) === $header_count){ 
       echo '<th class="ur">'; 
      }else{ 
       echo '<th class="u">'; 
      } 
      echo $col_name .'</th>'; 
     } 
     echo '</tr>'; 
     for ($i = 0; $i < $entries['count']; $i++){ 
      echo '<tr>'; 
      $td_count = 0; 
      foreach ($ldap_columns AS $col_name){ 
       if (0 === $td_count++){ 
        echo '<td class="l">'; 
       }else{ 
        echo '<td>'; 
       } 
       if (isset($entries[$i][$col_name])){ 
        $output = NULL; 
        if ('lastlogon' === $col_name || 'lastlogontimestamp' === $col_name){ 
         $output = date('D M d, Y @ H:i:s', ($entries[$i][$col_name][0]/10000000) - 11676009600); 
        }else{ 
         $output = $entries[$i][$col_name][0]; 
        } 
        echo $output .'</td>'; 
       } 
      } 
      echo '</tr>'; 
     } 
     echo '</table>'; 
    } 
} 
ldap_unbind($ldap_connection); // Clean up after ourselves. 
?> 
+2

Essenzialmente ciò che stai facendo è omettere il 4 ° parametro di ldap_search ($ attributes) in modo che tutti gli attributi vengano restituiti. Puoi aggiungere questo alla tua risposta per spiegare come stai ottenendo i dati che desideri per dump/debug –