За последние 24 часа нас посетили 54209 программистов и 1728 роботов. Сейчас ищут 893 программиста ...

Подскажите по работе с LDAP

Тема в разделе "Прочие вопросы по PHP", создана пользователем ZeroCoolzz, 24 июл 2015.

  1. ZeroCoolzz

    ZeroCoolzz Новичок

    С нами с:
    16 июл 2015
    Сообщения:
    9
    Симпатии:
    0
    По служебной необходимости пришлось разбираться с LDAP запросами. Все подключается, но не находит ничего. вот текст:

    Код (PHP):
    1.    $filter = "(&(sAMAccountName=Rubtsov.PN))";   // устанавливаем фильтр выборки из AD
    2.     $attr = array("displayName", "mail"); // устанавливаем какие поля нам нужно получить из AD
    3.      
    4.     // устанавливаем соединение с ldap сервером
    5.     $ldap_con = ldap_connect(ldaphost, ldapport) or die("Could not connect to LDAP server.");
    6.     echo "-Соеденяюсь с LDAP сервером: OK</br>";
    7.      
    8.     // Устанавливаем флажки протокола
    9.     ldap_set_option($ldap_con, LDAP_OPT_PROTOCOL_VERSION, 3);  // AD Windows 2003 и выше
    10.     ldap_set_option($ldap_con, LDAP_OPT_REFERRALS, 0);         //Определяет, следовать ли автоматически рефералам, возвращенным сервером LDAP. Зачем нужно - не понятно
    11.      
    12.     // авторизуемся в AD
    13.     $ldapbind = ldap_bind($ldap_con) or die("LDAP bind failed...");
    14.     echo "-Авторизуюсь на LDAP сервере: OK</br>";
    15.      
    16.     // Пытаемся что то получить из AD
    17.     $dn = "DC=office,DC=ipe,DC=corp";
    18.     $search=ldap_search($ldap_con, $dn, $filter, $attr);  // Ищем эти поля, получаем ссылку на результат
    19.     $number_returned = ldap_count_entries($ldap_con,$search); // Получаем количество записей
    20.     echo "-Получаю записи из AD: $number_returned</br>";
    21.     $info = ldap_get_entries($ldap_con, $search);

    Возникло несколько вопросов:
    1. по строчке - $filter = "(&(sAMAccountName=Rubtsov.PN))";
    Как правильно задавать поиск по параметрам? сколько скобок ставить? ставить ли знак& ? в одном примере вообще одни скобки были. Названия параметра брать из самой ActiveDirectory, как там атрибуты называются?
    Мне надо например делать поиск по логину, который в AD хранится, а у нас этот атрибут там называется sAMAccountName.

    2. вопрос по параметру DN для поиска - $dn = "DC=office,DC=ipe,DC=corp";
    в самой AD я так понял нужен параметр distiguishedName. Он в моем случае равен OU=Группа Илим,OU=Users,OU=BRK,DC=office,DC=ipe,DC=corp и это как я понял указание на область для поиска. Я правильно его прописал?

    Помогите пожалуйста разбораться, почему он нифига не находит. Пишет найдено 0.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. ZeroCoolzz

    ZeroCoolzz Новичок

    С нами с:
    16 июл 2015
    Сообщения:
    9
    Симпатии:
    0
    Помогите пожалуйста разобраться
     
  3. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
  4. ZeroCoolzz

    ZeroCoolzz Новичок

    С нами с:
    16 июл 2015
    Сообщения:
    9
    Симпатии:
    0
    Да я все это читал уже сто раз, все так и сделал, уже ни один десяток примеров пересмотрел. Но ничего не находит, хотя запись есть которую я ищу. Поэтому и обратился за помощью. Может я забыл чего сделать?
    Или может кодировка какая не совпадает?
     
  5. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Внимательно посмотрите как написано
    Код (PHP):
    1. ldap_connect(ldaphost, ldapport)
    Советую включить исключения " Ошибки, предупреждения и прочее... ".
    Дабы увидеть косяки кода, возможно, где - то есть косяки.
    Ибо если пых пытается найти неопределенные константы, то ошибок не будет и результат вернет 0.
    Перепишите с нуля, сначала добейтесь результата соединения с базой, а потом результат возвращения из базы, прежде, чем искать в базе, тогда вы поймете, где допустили ошибки.
     
  6. ZeroCoolzz

    ZeroCoolzz Новичок

    С нами с:
    16 июл 2015
    Сообщения:
    9
    Симпатии:
    0
    Переделал код
    Код (PHP):
    1. $attr = array("displayName", "mail"); // устанавливаем какие поля нам нужно получить из AD
    2.  
    3. // устанавливаем соединение с ldap сервером
    4. $ldap_con = ldap_connect(ldaphost, ldapport) or die("Could not connect to LDAP server.");
    5. echo "-Соеденяюсь с LDAP сервером:".$ldap_con."</br>";
    6.  
    7. // Устанавливаем флажки протокола
    8. ldap_set_option($ldap_con, LDAP_OPT_PROTOCOL_VERSION, 3);  // AD Windows 2003 и выше
    9. ldap_set_option($ldap_con, LDAP_OPT_REFERRALS, 0);         //Определяет, следовать ли автоматически рефералам, возвращенным сервером LDAP. Зачем нужно - не понятно
    10.  
    11. // авторизуемся в AD
    12. $ldapbind = ldap_bind($ldap_con);
    13. if ($ldapbind) {
    14.         echo "LDAP-привязка успешна...";
    15.     } else {
    16.         echo "LDAP-привязка не удалась...";
    17.     }
    18.  
    19. // Пытаемся чтото получить из AD 
    20. $dn = "DC=office,DC=ipe,DC=corp";
    21. $search=ldap_search($ldap_con, $dn, '(|(objectclass=person)(samaccountname=*))', $attr);  // Ищем эти поля, получаем ссылку на результат
    22. $number_returned = ldap_count_entries($ldap_con,$search); // Получаем количество записей
    23. echo "-Получаю записи из AD: $number_returned</br>";
    24. $info = ldap_get_entries($ldap_con, $search);
    25. echo $info; 
    Получаю вот такое:
    -Соеденяюсь с LDAP сервером:Resource id #7
    LDAP-привязка успешна...
    -Получаю записи из AD: 0
    Array

    Никаких ошибок нет, в настройках все показывать выставлено.

    А никаких проблем с кодировкой там быть не может? Может в AD какая-нибудь кодировка другая?

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  7. ZeroCoolzz

    ZeroCoolzz Новичок

    С нами с:
    16 июл 2015
    Сообщения:
    9
    Симпатии:
    0
    Решил проблему. Оказывается AD не принимает анонимное подключение. Причем пишет что все нормально, но ничего не находит.
    Указал учетные данные и поиск заработал.
    Осталось дело за малым, убедить админов создать служебную учетку для доступа.