Как получить информацию о пользователе из группы безопасности 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, "[email protected]", "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";

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

Author: BRoebie, 2010-07-13

2 answers

Запросите ОБЪЯВЛЕНИЕ следующим образом:

$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 сортировать ваши записи не хотите, вместо того, чтобы передавать по проводу больше записей, чем вам нужно, и выбрасывать половину из них на клиента.

 3
Author: Tomalak, 2010-07-13 10:07:42

Томалак

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

Если я изменюсь

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

До

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

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

 0
Author: horgen, 2010-07-13 10:56:10