2013-01-16 88 views
6

對當前用戶運行搜索以檢索所有屬性(包括使用LDAP/PHP的Active Directory中的關聯組)的最佳方式是什麼?PHP LDAP獲取用戶屬性,包括關聯組

對於屬性,主要是名字,姓氏和顯示名稱。

對於關聯組,只是用戶所屬的組,例如memberOf函數。

我已經嘗試了幾個選項,但似乎無法獲得正確的過濾器/搜索組合,並且大多數示例都涵蓋了檢索已知組的用戶列表。

我試過成功綁定後,運行以下命令:

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

它返回以下錯誤:「沒有這樣的對象」。

UPDATE:

這是我試過和我能夠在我的print_r的$信息變量,不過對於條款仍在犯錯了的地方,得到的結果最新的塊。我改變了的BaseDN只是直流屬性:

$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的是:

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

[你有什麼嘗試?](http://whathaveyoutried.com) – Phil

+0

感謝您的評論。我用我試過的一個解決方案編輯了原始問題,該解決方案運行搜索顯示名稱屬性,其中sAMAccountName等於當前用戶。它返回了一個「沒有這樣的對象」的錯誤。 –

回答

5

這裏有一個腳本,我們有傾倒廣告的信息,也許它會幫助你:

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

基本上你在做什麼是省略ldap_search的第四個參數($ attributes),所以返回所有的屬性。您可能希望將此添加到您的答案中,以解釋如何獲取要轉儲/調試的數據 –