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