2010-06-07 123 views
2

問候,使用LDAP函數來獲取的Active Directory tokenGroups在PHP屬性

我已經有一個工作連接到AD並可以搜索並從中檢索信息。我甚至開發了一種遞歸方法,通過它可以檢索給定用戶的所有組。但是,如果可能的話,我想避免遞歸。一種方法是從AD獲取用戶的tokenGroups屬性,該屬性應該是指定用戶具有成員資格的組的SID列表,無論該成員資格是直接還是間接。

但是,當我運行搜索用戶的AD信息時,tokenGroups屬性甚至不在其中。我嘗試了特別要求這些信息(即使用第四個參數ldap_search來指定它),但那也沒有奏效。

謝謝, 戴維·基斯


+0

不是您的問題的解決方案,但您是否意識到'tokenGroups'將只包含安全組並且沒有通訊組?因此,即使您獲得'tokenGroups'來返回某些內容,結果可能與您當前的實現相比有所不同。 – Lucero 2010-06-07 21:40:46

+0

其實,我並沒有意識到這一點,但對於這個特定的情況,我認爲我應該沒問題。我正在用別人的代碼工作,使用不同的編程語言,並試圖重新創建它。該代碼從同一臺服務器運行並訪問相同的AD並使用tokenGroups。由於該代碼可以得到它們並將它們用於我所需要的,希望我可以找出一種方法使其通過PHP工作。不過謝謝你的警告! – 2010-06-07 21:50:12

回答

4

解決我自己的問題,我想我會把答案在這裏,以便其他人可能會發現它。問題是使用l​​dap_search()函數。答案是使用ldap_read()函數而不是ldap_search()。區別在於請求的範圍。搜索功能使用「sub」(即子樹)的範圍,而讀取功能使用「base」。 tokenGroups信息只有在使用「base」範圍時才能找到,因此使用正確的PHP函數是關鍵。

正如我上面提到的,我正在從別人的代碼中創建我的解決方案,並且perl腳本使用了一個名爲「search」的函數來執行LDAP請求,從而導致我的錯誤路徑。

感謝那些看過這個問題的人!

-

按照註釋中的要求,這裏的代碼解決方案的基礎。我從我使用的對象中提取,所以這可能不是100%,但它會很接近。另外,在這個剪切過程中沒有聲明的變量(例如$ server,$ user,$ password)反正我不會知道你的AD憑證!

$ldap = ldap_connect($server); 
ldap_bind($ldap, $user, $password); 
$tokengroups = ldap_read($ldap, $dn, "CN=*", array("tokengroups"))); 
$tokengroups = ldap_get_entries($ldap, $tokengroups); 

在這一點上,$tokengroups是我們的結果作爲數組。它應該有計數指數以及其他一些信息。要提取實際的羣組,您需要執行以下操作:

$groups = array(); 
if($tokengroups["count"] > 0) { 
    $groups = $tokengroups[0]["tokengroups"]; 
    unset($groups["count"]); 

    // if you want the SID's for your groups, you can stop here. 
    // if you want to decode the SID's then you can do something like this. 
    // the sid_decode() here: http://www.php.net/manual/en/function.unpack.php#72591 

    foreach($groups as $i => &$sid) { 
     $sid = sid_decode($sid); 

     $sid_dn = ldap_read($ldap, "<SID=$sid>", "CN=*", array("dn")); 
     if($sid_dn !== false) { 
      $group = ldap_get_entries($ldap, $sid_dn); 
      $group = $group["count"] == 1 ? $group[0]["dn"] : NULL; 
      $groups[$i] = $group; 
     } 
    } 
} 

這就是基礎知識。有一個警告:您可能需要與在您的組織管理AD帳戶的個人或個人合作。我第一次嘗試運行(幾年前,所以我的記憶有點模糊),我給的帳戶沒有適當的權限來訪問令牌組信息。我相信還有其他方法可以做到這一點,但是因爲我正在爲其他人的代碼移植這個特定的解決方案,所以我就是這麼做的。

+0

你可以提供一個鏈接或某些東西給你找到給定用戶的所有組的解決方案嗎? – wondergoat77 2014-06-19 23:59:10

+1

@ wondergoat77當然。往上看。 – 2014-06-20 12:11:12

+0

感謝發佈 – wondergoat77 2014-06-20 16:02:31

相關問題