2017-05-29 100 views
0

我剛剛使用LDAP,所以也許我只是不想找正確的東西,或者這是不可能的。來自羣組的LDAP PHP數據

我在活動目錄中工作,其中有學生在他們的班級組。現在我需要來自某個班級的所有學生的電子郵件地址。我確實通過LDAP連接到了Active Directory,但是因爲我實際上不知道如何處理這個問題,所以我沒有任何代碼可以顯示。

回答

0

由於它是活動目錄,因此您必須使用服務帳戶進行綁定,然後才能搜索目錄。之後成功結合,你可以一個名爲「ICS-1」這樣的組中檢索所有用戶的電子郵件地址:

// $conn = ldap_connect() 
// ldap_bind() 
$basedn = "dc=rug,dc=nl" 
$classname = "ICS-1" 
$filter = "(&(objectClass=groupOfNames)(cn=" . $classname ."))" 
$search = ldap_search($conn, $basedn, $filter, array("dn")) 
$groupdn = $search[0]["dn"] 
$filter = "(&(objectClass=user)(memberOf=" . $groupdn ."))" 
$search = ldap_search($conn, $basedn, $filter, array("mail")) 

$basedn是命名上下文存儲您的組和用戶。請參閱available documentation以瞭解ldap_函數的正確語法。

0

你需要確定你的類,像這樣的dn

cn=classname,ou=classes,dc=domain,dc=com

當你有這樣的信息,最有效的方法來檢索郵件是:

// retrieve the members of this group : 
$result = ldap_read ($AD , "<dn of the class>" , (objectClass=*) , ["member"]); 
// Get the entry 
$entry = ldap_get_entries ($AD ,$result); 
/* The entry should be an array like this : 
$entry = [ 
    "count" => 1, 
    "0" => [ 
    "dn" => "<dn of the class>", 
    "member" => [...] 
    ] 
] 
*/ 
// After that you can iterate through the members to read each user entry 
$mails = []; 
for ($i=0; $i< $entry[0]["member"]["count"]; $i++) { 
    $studentDN = $entry[0]["member"][$i]; 
    $r = ldap_read ($AD , $studentDN , (objectClass=*) , ["mail"]); 
    $e = ldap_get_entries ($AD ,$r); 
    // $e is structured similarly to the previous $entry so the mail is at : 
    $mails[] = $e[0]["mail"][0]; 
} 

我不太瞭解Active Directory,因此您應該仔細檢查屬性名稱以符合您的需求,但總體而言,它是在知道DN的DN時循環LDAP目錄的最快/最有效的方式e組。

由於LDAP目錄經過優化以實現快速閱讀,因此服務器逐一讀取每個條目以獲取屬性比在所有用戶上搜索匹配屬性更容易,然後獲取所有郵件並一次性返回一切。