Как получить информацию о пользователе в группе безопасности Active Directory с использованием LDAP и PHP

Как вы можете видеть ниже, я не получаю информацию о пользователе, когда я выполняю поиск LDAP в группе безопасности. Я хочу использовать $_SERVER[remote_user] чтобы проверить, является ли пользователь членом этой группы. Я также хотел бы получить информацию об этом пользователе и обновить базу данных sql. Это возможно?

 $dn = "CN=Intra,OU=Common Security Groups,DC=mydomain,DC=local"; $filter = "(member=*)"; $ad = ldap_connect("IP") or die("Couldn't connect to AD!"); ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3); $bd = ldap_bind( $ad, "username@mydomain.local", "password") or die("Can't bind to server."); $sr = ldap_search($ad,$dn,$filter); $entries = ldap_get_entries($ad, $sr); 

print_r($entries);

Возвращает:

 Array ( [count] => 1 [0] => Array ( [objectclass] => Array ( [count] => 2 [0] => top [1] => group ) [0] => objectclass [cn] => Array ( [count] => 1 [0] => Intra ) [1] => cn [description] => Array ( [count] => 1 [0] => Group for (LDAP) INTRANET server access ) [2] => description [member] => Array ( [count] => 4 [0] => CN=Fname1 Lname1,OU=Mail enabled users,OU=Aberdeen,DC=mydomain,DC=local [1] => CN=Fname2 Lname2,OU=Mail enabled users,OU=Forres,DC=mydomain,DC=local [2] => CN=Fname3 Lname3,OU=Houston,DC=mydomain,DC=local [3] => CN=Fname4 Lname4,OU=Mail enabled users,OU=Bergen,DC=mydomain,DC=local ) [3] => member [distinguishedname] => Array ( [count] => 1 [0] => CN=Intra,OU=Common Security Groups,DC=mydomain,DC=local ) [4] => distinguishedname [instancetype] => Array ( [count] => 1 [0] => 4 ) [5] => instancetype [whencreated] => Array ( [count] => 1 [0] => 20100711172407.0Z ) [6] => whencreated [whenchanged] => Array ( [count] => 1 [0] => 20100712063949.0Z ) [7] => whenchanged [usncreated] => Array ( [count] => 1 [0] => 17491499 ) [8] => usncreated [usnchanged] => Array ( [count] => 1 [0] => 17498823 ) [9] => usnchanged [name] => Array ( [count] => 1 [0] => Intra ) [10] => name [objectguid] => Array ( [count] => 1 [0] => ) [11] => objectguid [objectsid] => Array ( [count] => 1 [0] => ) [12] => objectsid [samaccountname] => Array ( [count] => 1 [0] => Intra ) [13] => samaccountname [samaccounttype] => Array ( [count] => 1 [0] => 268435456 ) [14] => samaccounttype [grouptype] => Array ( [count] => 1 [0] => -2147483646 ) [15] => grouptype [objectcategory] => Array ( [count] => 1 [0] => CN=Group,CN=Schema,CN=Configuration,DC=mydomain,DC=local ) [16] => objectcategory [count] => 17 [dn] => CN=Intra,OU=Common Security Groups,DC=mydomain,DC=local ) ) 

Все нормально работало, когда я использовал обычный DN:

 $dn = "OU=Mail enabled users,OU=Bergen,DC=mydomain,DC=local"; 

Но эксперт по AD сказал мне, что это большой НЕТ-НЕТ, и вместо этого я должен использовать группы безопасности: \

Запросите AD следующим образом:

 $dn = "DC=mydomain,DC=local"; $group_DN = "CN=Intra,OU=Common Security Groups,DC=mydomain,DC=local"; $filter = "(&(objectCategory=user)(memberOf=$group_DN))"; // ... $sr = ldap_search($ad, $dn, $filter); 

Посмотрите статью MSDN о синтаксисе фильтра поиска LDAP для информации о более сложных фильтрах.

Обязательно обратите внимание на раздел « Специальные символы » на этой странице. Правильное решение должно передать $group_DN через механизм экранирования, прежде чем использовать его в строке фильтра!

Всегда старайтесь создавать фильтры как можно более конкретными. Более эффективно позволять LDAP-серверу сортировать записи, которые вам не нужны, вместо того, чтобы больше записей переносилось по кабелю, чем вам нужно, и выбрасывать половину из них на клиенте.

Томалак

Я думаю, проблема заключается в том, что не все пользователи в группе безопасности поступают из того же подразделения.

Если я изменю

 $dn = "DC=mydomain,DC=local"; 

в

 $dn = "OU=Bergen,DC=mydomain,DC=local"; 

фильтр работает. Но у меня также есть еще 2 подразделения с пользователями.