Использование функций LDAP для получения атрибута Active Directory tokenGroups в PHP - PullRequest
2 голосов
/ 08 июня 2010

Привет,

У меня уже есть работающее соединение с AD, и я могу искать и извлекать из него информацию. Я даже разработал рекурсивный метод, с помощью которого можно получить все группы для данного пользователя. Тем не менее, я бы хотел избежать рекурсии, если это возможно. Одним из способов сделать это является получение атрибута tokenGroups из AD для пользователя, который должен быть списком идентификаторов безопасности для групп, в которые входит указанный пользователь, независимо от того, является ли это членство прямым или косвенным.

Когда я запускаю поиск информации AD пользователя, атрибут tokenGroups даже не находится в нем. Я специально пытался запросить эту информацию (то есть, указав ее с помощью четвертого параметра ldap_search ), но это тоже не сработало.

Спасибо, Дэвид Кис


1 Ответ

4 голосов
/ 10 июня 2010

Решил мою собственную проблему и подумал, что я поставлю ответ здесь, чтобы другие могли его найти. Проблема заключалась в использовании функции ldap_search (). Ответ заключался в том, чтобы использовать функцию ldap_read () вместо ldap_search (). Разница заключается в объеме запроса. Функция поиска использует область действия «sub» (то есть поддерево), а функция чтения - «base». Информация tokenGroups может быть найдена только при использовании области действия «base», поэтому ключом было использование правильной функции PHP.

Как я упоминал выше, я работал с кем-то еще из кода на Perl, чтобы создать свое решение, и сценарий 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 в вашей организации. В первый раз, когда я попытался запустить его (несколько лет назад, так что моя память несколько размыта), у учетной записи, которую мне дали, не было соответствующей авторизации для доступа к информации о группах токенов. Я уверен, что есть другие способы сделать это, но поскольку я переносил чужой код для этого конкретного решения, я так и сделал.

...