2009-11-12 2 views
2

Как вы можете выполнять поиск в Active Directory через PHP? Без необходимости перекомпиляции PHP. PHP версия is 5.3Поиск в Active Directory через PHP

Я хочу найти отображаемое имя лица от имени пользователя. Веб-сервер - 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

Edit:

Попытка для поиска пользователя, но не знаете, как найти "базовый 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-поиск]: Поиск: Операции ошибка

ответ

6

OK - прежде всего, вам необходимо установить ext/ldap для связи с сервером Active Directory через интерфейс LDAP. Очевидно, что это требование выполняется с вашей установкой PHP (иначе вы получите ошибки о неопределенных функциях).

Вопрос сейчас: какой сервер Windows вы кодируете? Начиная с Windows Server 2003 анонимными связями являются disabled by default, что означает, что вы не можете выполнить поиск в дереве Active Directory без проверки подлинности с помощью уже существующего и авторизованного пользователя. (Чтобы включить анонимные привязки см here - но у вас нет никаких прав администратора, вы не сможете изменить)

Вторая проблема заключается ваша базы 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.

+0

Если я использую 'ldapbind = ldap_bind ($ ldapconn);' он возвращает true, поэтому допускайте анонимные привязки. Также попытался «$ filter =» (sAMAccountName = 'username') "; ' поэтому не уверен, что он сбой на уровне фильтра, DN или «$ justthese» – SamWM

+0

Не указывайте имя пользователя в вашей строке фильтра ('$ filter =" (sAMAccountName = имя пользователя) ";' ** NOT ** ' $ filter = "(sAMAccountName = 'username')"; ') И, возможно, я не объяснил это на 100% правильно: Active Directory не позволяет анонимным пользователям читать из записей, кроме' RootDSE', который является абсолютным корнем из Дерево LDAP. Поэтому 'ldap_bind()' действительно может возвращать 'true', но это не означает, что вам разрешено обращаться к дереву LDAP. Учитывая сообщение об ошибке, я предполагаю, что ваша * базовая DN * является первой проблемой для решения. –

-2

PHP имеет LDAP library, который можно использовать для запроса активного каталога. Это не enabled by default.

Если вы можете использовать его, вы можете посмотреть на ldap_search()

+0

Посмотрел на поиск, но не может найти нужный ему запрос для выполнения поиска. – SamWM

-2

Поскольку вы используете IIS, чем это означает, что вы работаете PHP на окнах, что в свою очередь означает, что вы можете позволить LDAP extension без перекомпиляции PHP. Это должно решить большинство ваших проблем.

0

Fisrt параметр ldap_get_entries функции неверен:

$info = ldap_get_entries($ldapconn, $sr); 

Испытано таким образом, и ваш код работает сейчас.

+1

Этот ответ, хотя и полезен, на самом деле не одинок. Возможно, ясно, где это вписывается в код опроса, и как он решает проблему. –

Смежные вопросы