2013-01-16 45 views
1

我的任務是實現單一登錄解決方案,以便使用工作機器中存儲的AD憑證將用戶登錄到我的系統。我正在使用ldap_ functions in PHP在PHP中使用PHP搜索更多OU中的用戶

我的問題是,我必須檢查對多個OU(現在大約30)的憑據,我還沒有找到一種方法來從AD系統中獲得這些OU,所以我有一個大量的OU作爲權宜之計。我通過ADexplorer獲得了這份清單。有沒有辦法用PHP來做到這一點?

我的第一語言不是英語,所以我讓阿德里亞諾翻譯這個給我,而且我在理解文檔時也有問題。

在這個階段,我基本上覆制從一個例子此代碼the ldap_search manpage

<?php 
$ds=ldap_connect($ldapserver); 

// 42 OUs in our case 
$dn[]='OU=ABC,DC=xyz,DC=ac,DC=uk'; 
$dn[]='OU=DEF,DC=xyz,DC=ac,DC=uk'; 
// ... 

$totalDns = count($dn); 
for ($i = 0; $i < $totalDns; $i++) { 
    $id[] = $ds; 
} 

$filter = 'samaccountname='.$_POST['username']; 

$result = ldap_search($id,$dn,$filter); 

$search = false; 

foreach ($result as $value) { 
    if(ldap_count_entries($ds,$value)>0){ 
     $search = $value; 
     break; 
    } 
} 

if($search){ 
    $info = ldap_get_entries($ds, $search); 
}else{ 
    $info = 'No results found'; 
} 

更新

我試圖通過弗拉季斯拉夫·羅斯提出的解決方案,並在幾秒鐘後,服務器吐出這個:

mod_fcgid: stderr: PHP Warning: ldap_search() [<a href='function.ldap-search'>function.ldap-search</a>]: Search: Can't contact LDAP server in ... on line 28 

這不會發生,如果我預先特定的OU到相同的搜索。 I.E.如果我做

$sr = ldap_search(
    $ds, 
    "OU=Usuarios,dc=test,dc=com", 
    "ObjectClass=organizationalUnit", 
    array("") 
); 

,而不是

$sr = ldap_search(
     $ds, 
     "dc=test,dc=com", 
     "ObjectClass=organizationalUnit", 
     array("") 
); 

我得到正確的結果。我嘗試將timelimit和sizelimit參數設置爲0,但結果相同。我現在正在諮詢服務器人員,看看他們的限制是什麼。

+0

您可能想要添加代碼,以便清楚您迄今嘗試過的內容。 – hakre

回答

2

嘗試使用ldap_search與過濾對象類=組織單位:

$ds = ldap_connect($AD_server); 
    if(!$ds) die("cannot connect to LDAP server at $AD_server."); 

    $r = ldap_bind($ds, $AD_Auth_User, $AD_Auth_PWD); 
    if(!$r) 
    { 
     ldap_get_option($ds,LDAP_OPT_ERROR_STRING,$error); 
     die("cannot bind to LDAP server at $AD_server ($error)."); 
    }; 

    $sr=ldap_search($ds,"dc=test,dc=com","ObjectClass=organizationalUnit",array("")); 
    $info = ldap_get_entries($ds, $sr); 

    print_r($info); //<--array with OU's you need 

如果您不需要遞歸查詢,用ldap_list代替ldap_search。

+0

測試這個。我收到超時錯誤,但謝謝! –

+0

你說得對。此代碼不適用於AD根目錄,僅適用於其他ou。這可能是一些權利或證書問題。我今天試着修復它。 –

1

這聽起來像你想驗證域中的任何用戶。不要搜索多個DN,只需從域的根目錄搜索一次。因此,而不是使用'OU=ABC,DC=xyz,DC=ac,DC=uk',請使用'DC=xyz,DC=ac,DC=uk'

+0

嘗試過,但它也返回了連接錯誤。我也嘗試過「OU = * ...」,結果相似 –

1

我還沒有找到一種方法來從AD系統

你上面的例子表明獲得這些OU這些OU是直接兒童的DC = XYZ,DC = AC ,DC = UK?如果是的話,最有效的LDAP搜索來找到這些是:

  • 搜索庫:DC = XYZ,DC = AC,DC =英國
  • 搜索範圍:ONELEVEL < - 直接兒童搜索庫的
  • 搜索過濾器:(對象類=組織單元)。

使用這樣相應ldapsearch命令行測試...

ldapsearch -h <hostname> -s onelevel -b "DC=xyz,DC=ac,DC=uk" "(objectclass=organizationalUnit)"