Как получить информацию о пользователе из группы безопасности Active Directory, используя LDAP и PHP - PullRequest
5 голосов
/ 13 июля 2010

Как вы можете видеть ниже, я не получаю никакой информации о пользователе, когда я выполняю поиск 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 сказал мне, что это большой НЕТ-НЕТ, и что вместо этого я должен использовать группы безопасности:

Ответы [ 2 ]

3 голосов
/ 13 июля 2010

Запросите объявление так:

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

0 голосов
/ 13 июля 2010

Томалак

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

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

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

до

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

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

...