解決我自己的問題,我想我會把答案在這裏,以便其他人可能會發現它。問題是使用ldap_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帳戶的個人或個人合作。我第一次嘗試運行(幾年前,所以我的記憶有點模糊),我給的帳戶沒有適當的權限來訪問令牌組信息。我相信還有其他方法可以做到這一點,但是因爲我正在爲其他人的代碼移植這個特定的解決方案,所以我就是這麼做的。
不是您的問題的解決方案,但您是否意識到'tokenGroups'將只包含安全組並且沒有通訊組?因此,即使您獲得'tokenGroups'來返回某些內容,結果可能與您當前的實現相比有所不同。 – Lucero 2010-06-07 21:40:46
其實,我並沒有意識到這一點,但對於這個特定的情況,我認爲我應該沒問題。我正在用別人的代碼工作,使用不同的編程語言,並試圖重新創建它。該代碼從同一臺服務器運行並訪問相同的AD並使用tokenGroups。由於該代碼可以得到它們並將它們用於我所需要的,希望我可以找出一種方法使其通過PHP工作。不過謝謝你的警告! – 2010-06-07 21:50:12