Как вы можете выполнять поиск в Active Directory через PHP? Без необходимости перекомпиляции PHP. Версия PHP – 5.3
Я хочу найти отображаемое имя лица из своего имени пользователя. Веб-сервер – IIS 6, а PHP – с использованием FastCGI.
Я получаю имя пользователя:
$cred = explode('\\',$_SERVER['REMOTE_USER']); if (count($cred) == 1) array_unshift($cred, "(no domain info - perhaps SSPIOmitDomain is On)"); list($domain, $user) = $cred; return $user;
Итак, как я могу найти название? например DoeJ = John Doe
Редактировать:
Попытка поиска пользователя, но не уверен, как найти «базовое DN». Не иметь прямого доступа к серверу Active Directory или иметь права администратора, поэтому подключайтесь анонимно.
<?php //using ldap bind anonymously // connect to ldap server $ldapconn = ldap_connect("example.co.uk") or die("Could not connect to LDAP server."); if ($ldapconn) { // binding anonymously $ldapbind = ldap_bind($ldapconn); if ($ldapbind) { echo "LDAP bind anonymous successful..."; ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION,3); ldap_set_option($ldapconn, LDAP_OPT_REFERRALS,0); $dn = "CN=Users"; // also tried DC=example,DC=co,DC=uk $filter="(SAMAccountName=username)"; $justthese = array("ou", "sn", "givenname", "mail"); $sr=ldap_search($ldapconn, $dn, $filter, $justthese); $info = ldap_get_entries($ds, $sr); echo $info["count"]." entries returned\n"; } else { echo "LDAP bind anonymous failed..."; } } ?>
Ошибка в ldap_search: Предупреждение: ldap_search () [function.ldap-search]: Поиск: ошибка операций
OK – прежде всего, вам необходимо, чтобы ext/ldap
с вашим сервером Active Directory через интерфейс LDAP. Очевидно, что это требование выполняется с вашей установкой PHP (иначе вы получите ошибки о неопределенных функциях).
Вопрос в том, на каком сервере Windows вы кодируете? Начиная с Windows Server 2003 анонимные привязки по умолчанию отключены , а это значит, что вы не можете выполнить поиск в дереве Active Directory без проверки подлинности с использованием уже имеющегося и авторизованного пользователя. (Чтобы включить анонимные привязки, смотрите здесь – но поскольку у вас нет прав администратора, вы не сможете это изменить)
Вторая проблема – ваше базовое DN, которое фактически является местоположением в вашем дереве LDAP, из которого будет выполняться операция поиска. DN базы нормалей для контейнера пользователей должен быть CN=Users,DC=yourdomain,DC=yourtopleveldomain
, который, например, CN=Users,DC=example,DC=local
.
Фильтр, который вы используете, на самом деле правильный: (SAMAccountName=username)
найдет запись учетной записи для username
. Чтобы использовать переменную имени пользователя, вы можете:
$filter = sprintf('(SAMAccountName=%s)', $user);
Общий поток кода, однако, также кажется правильным.
Подведем итог: сначала вам нужно будет проверить, поддерживает ли ваш Active Directory анонимные привязки, а затем вам придется настроить базовый DN вашего поиска. Если анонимные привязки не разрешены, вам придется использовать пользователя, которому разрешено связываться с Active Directory.
Параметр ldap_get_entries
функции ldap_get_entries
неверен:
$info = ldap_get_entries($ldapconn, $sr);
Протестировано таким образом, и ваш код работает сейчас.
PHP имеет библиотеку LDAP, которую вы можете использовать для запроса активного каталога. Однако он не включен по умолчанию .
Если вы можете использовать его, вы можете посмотреть ldap_search ()
Поскольку вы используете IIS, это означает, что вы используете php для Windows, что в свою очередь означает, что вы можете включить расширение LDAP без перекомпиляции php. Это должно решить большинство ваших проблем.