2013-01-16 10 views
6

Jaki jest najlepszy sposób uruchomienia wyszukiwania na bieżącym użytkowniku w celu pobrania wszystkich atrybutów, w tym skojarzonych grup w usłudze Active Directory przy użyciu LDAP/PHP?PHP LDAP Uzyskaj atrybuty użytkownika, w tym skojarzone grupy

Dla atrybutów, głównie tylko imię, nazwisko i wyświetlana nazwa.

Dla powiązanych grup, tylko te grupy, których członkiem jest użytkownik, na przykład funkcja memberOf.

Wypróbowałem kilka opcji, ale nie mogę uzyskać odpowiedniej kombinacji filtr/wyszukiwanie, a większość przykładów obejmuje pobieranie list użytkowników, którzy mają znaną grupę.

Próbowałem działa to po udanym wiążą:

$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>"); 
} 

która zwraca następujący błąd: „Nie ma takiego obiektu”.

UPDATE:

Jest to ostatni blok próbowałem i jestem w stanie uzyskać wyniki, kiedy print_r zmienną $ informacji, jednak dla klauzuli wciąż błądzących gdzieś. Zmieniłem BaseDN aby tylko dc atrybuty:

$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"; 
      } 
    } 
    } 

print_r wyników to:

([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

[Co próbowaliście?] (Http://whathaveyoutried.com) – Phil

+0

Dzięki za komentowanie. Edytowałem oryginalne pytanie za pomocą jednego z wypróbowanych rozwiązań, które uruchamia wyszukiwanie atrybutu wyświetlanej nazwy, gdzie sAMAccountName jest równy bieżącemu użytkownikowi. Zwrócił błąd "Brak takiego obiektu". –

Odpowiedz

5

Oto skrypt mamy za dumping informacji AD, może to pomoże:

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

Zasadniczo, co robisz, pomijając czwarty parametr ldap_search (atrybuty $), zwracane są wszystkie atrybuty. Możesz dodać to do swojej odpowiedzi, aby wyjaśnić, w jaki sposób otrzymujesz dane, które chcesz zrzutu/debugowania –

Powiązane problemy