2013-01-16 34 views
6

Cách tốt nhất để chạy tìm kiếm trên người dùng hiện tại là truy xuất tất cả các thuộc tính, bao gồm các nhóm được liên kết trong Active Directory bằng LDAP/PHP là gì?PHP LDAP Nhận thuộc tính người dùng, bao gồm các nhóm liên kết

Đối với thuộc tính, chủ yếu chỉ là tên, họ và tên hiển thị.

Đối với các nhóm được liên kết, chỉ các nhóm mà người dùng là thành viên của, chẳng hạn như hàm memberOf.

Tôi đã thử một vài tùy chọn, nhưng dường như không thể kết hợp bộ lọc/tìm kiếm phù hợp và hầu hết các ví dụ bao gồm việc truy xuất danh sách người dùng có nhóm đã biết.

Tôi đã cố gắng chạy này sau một ràng buộc thành công:

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

nào trả về lỗi sau: "Không có đối tượng như vậy".

UPDATE:

Đây là khối mới nhất Tôi đã thử và tôi có thể nhận được kết quả khi tôi print_r biến $ thông tin, tuy nhiên đối với khoản vẫn erring ra ở đâu đó. Tôi đã thay đổi BaseDN để chỉ dc thuộc tính:

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

Các print_r các kết quả như sau:

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

[Bạn đã thử gì?] (Http://whathaveyoutried.com) – Phil

+0

Cảm ơn bạn đã bình luận. Tôi đã chỉnh sửa câu hỏi gốc với một giải pháp mà tôi đã thử, chạy tìm kiếm thuộc tính tên hiển thị nơi sAMAccountName bằng với người dùng hiện tại. Nó trả về lỗi "No such object". –

Trả lời

5

Dưới đây là một kịch bản chúng tôi đã cho bán phá giá thông tin AD, có lẽ nó sẽ giúp bạn:

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

Về cơ bản những gì bạn đang làm là bỏ qua tham số 4 của ldap_search (thuộc tính $) để tất cả các thuộc tính được trả về. Bạn có thể muốn thêm câu trả lời này vào câu trả lời của bạn để giải thích cách bạn nhận được dữ liệu bạn muốn cho dump/debug –

Các vấn đề liên quan