2015-03-20 3 views
1

Я новичок в LDAP и Active Directory. Я пытаюсь получить идентификатор электронной почты аутентифицированного пользователя, используя следующий код. Однако, когда я запускаю его, все, что я получаю, это массив с 0 в нем.Почему этот запрос LDAP возвращает массив только с 0

Вот код

$server ='ldaps://DOMAIN'; 
$username = 'DOMAIN\UID'; 
$password = 'PASSWORD'; 

$base_dn = 'dc=DOMAIN'; 
$search_filter = 'dn=UID'; 
$attributes = ['mail']; 

$ldap = ldap_connect($server); 
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0); 
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); 
ldap_bind($ldap, $username, $password); 
$search = ldap_search($ldap, $base_dn, $search_filter, $attributes); 
$data = ldap_get_entries($ldap, $search); 

foreach($data as $dataPoint) 
    { 
     echo $dataPoint; 
     echo "<hr>"; 
    } 

Это выводит только на 0 с горизонтальной линией под ним.

Самое сложное, что здесь нет сообщения об ошибке, и я не очень хорошо знаком с LDAP и с Active Directory.

Любая идея, почему это может произойти.

+1

Поиск LDAP может быть болью - особенно если вы не знакомы с созданной структурой. Я обнаружил, что загрузка браузера MS AD (небольшое приложение, которое позволяет вам просматривать структуру в виде дерева подобно тому, как это делает) намного проще обеспечить, чтобы выполняемые вами поисковые запросы выполняли правильный поиск. Как только вы это сделаете, данные действительно возвращаются в массив с МНОГИМИ полями - поэтому попробуйте использовать print_r, чтобы просмотреть каждый бит, возвращенный, чтобы найти нужные элементы, содержащие идентификатор электронной почты. – Fluffeh

+0

Спасибо тонну !! это помогло мне больше всего. Проблема была в моем базовом домене, была способна определить правильную причину только для браузера AD – TDsouza

+0

Нет проблем, я помню, когда я впервые начал выполнять поиск LDAP, это было чертовски, пока друг не предложил мне просмотреть дерево, чтобы убедиться, что я использовал правильные запросы :) – Fluffeh

ответ

0

Я вижу несколько вещей, которые потенциально могут быть причиной проблем из кода выше:

  • ли вы на самом деле имели в виду использовать ldaps://? Обычно это не то, что вы хотите сделать. Если вы хотите использовать зашифрованное соединение, вы должны использовать ldap_start_tls, и звонок должен быть сделан после ldap_connect. Для тестирования я бы просто изменил его на ldap://.
  • Ваша переменная $base_dn, кажется, отсутствует часть домена. Это не должно быть имя NETBIOS вашего домена, а скорее полное доменное имя. Так что, если ваш домен был domain.com, тогда база dn была бы dc=domain,dc=com.
  • Ваш фильтр поиска ($search_filter) не был правильно сформирован. Если вы пытаетесь получить объект пользователя из LDAP данного имени учетной записи, вы можете использовать фильтр поиска, как: (sAMAccountName=UID)

Чтобы получить лучшее представление о том, что может идти неправильно, то вы можете использовать ldap_error и назвать его после того, как вы подключаетесь: echo "Error: ".ldap_error($ldap);. Вы можете сделать это после любого связанного с LDAP-вызова, чтобы получить дополнительную информацию о том, что, возможно, пошло не так.

+0

да, проблема была в базовом домене благодаря вам, и $ fluffeh смог определить правильный формат и исправить соответственно – TDsouza

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