Здравствуйте. Не совсем хорошо (а точнее почти никак) разбираюсь в работе с ActiveDirectory через PHP. Суть моей задачи в том что бы при выходе авторизовать пользователя и в сессию положить его имя, id и группы в которые он входит. Используя LDAP я смог нормально подключится и проверить существования пользователя (функцией ldap_bind). А когда стало нужно извлечь данные о пользователе то я запоролся. Вот используемый код : (Имя пользователя "one", пароль "123abc!", имя машины "dipl", имя домена "diplom.local") PHP: $ldap_addr = "192.168.244.5"; $g_res = ldap_connect($ldap_addr); if($g_res) { print "Connected to ladp-server<br />"; } else { print "can`t connect to addr {$ldap_addr}"; exit; } $bind_user = ldap_bind($g_res, "one@diplom.local", "123abc!"); if ($bind_user) { print "User binded!<br />"; } else { print "can`t bind user!<br />"; exit; } $sr=ldap_search($g_res,"dc=dipl,dc=diplom,dc=local", "(samaccountname=one)", array("*") ); $info = ldap_get_entries($g_res, $sr); var_dump($info); Всё хорошо работает до вызова ldap_search. Проблема в строке "dc=dipl,dc=diplom,dc=local". Если честно то я даже не знаю что туда писать. Нашёл расшифровки для всего того что можно в ней указать (o,cn,dc и т.д.) но не знаю что в эти параметры поместить и какие из них обязательны. Я знаю имя машины и домена, их и пишу. Но при любом случае функция выдаёт ошибку: "Warning: ldap_search() [function.ldap-search]: Search: No such object in ... on line ..." Помогите пожалуйста, третий день мучаюсь. Буду благодарен за любые подсказки! P.S. в редакторе запросов AD нужный мне запрос выглядит вот так: "(&(objectCategory=person)(objectClass=user)(name=one))"
при настройке LDAP я сталкивался с access-list. В которых прописывается доступ к полям! Так вот если неправильно этим пользоваться, то вполне вероятно получить такой результат! Советую капать в этом направлении!
Это AD, если биндится и пользователя находит, значит дело не в "access-list". Советую поставить Softerra LDAP Browser, подключиться к AD с теми реквизитами которые ты использщуешь в PHP и произвосети поиск из неё. Она покажет шаблон поиска, который можно скопировать и использовать в функции... Там же и поля поглядишь и со структурой получше познакомишься. Сам долго поначалу тыкался когда парочку служб интегрировал..
demond, спасибо за отзыв. Я в гугле видел подобную проблему. Там всё решилось через разрешение доступа хоста. У меня немного другое. Действительно проблема была в запросе. Dronga! Спасибо огромное! Всё скачал, разобрался. Запрос (web_admin - Это группа к которой принадлежит пользователь) выдал всё что мне нужно! Наконец-то я всё решил =))) Спасибо! сейчас просто методом подбора найду что требуется =) P.S. а почему я выбрал +10 репутации Дронги, а прибавилось всего 3? =О
Dronga, а где мне в древе нужно порыться что бы узнать группу пользователя по его логину? Покопался сейчас, но могу только найти имя и фамилию (в списке членов определённой группы), а вот логин никак =(
Всё, сделал окончательно. Вдруг кому пригодится. Вот запрос: $sr=ldap_search($g_res,"CN=Users,DC=diplom,DC=local", "samaccountname=one", array("*") ); показываем все данные по пользователю указанного домена (diplom.local) =)
Народ. Нужна ваша помощь. Я новичек в этом деле. Дело обстоит так. Вот код PHP: <?php $ldaphost = "ldap://vihor.vihor.local"; $ldapconn = ldap_connect($ldaphost); if($ldapconn) { echo("Подключение установлено!<br>"); echo("$ldapconn<br>"); } else { echo("Неа, не получается...<br>"); } $ldaprdn1 = "uid=panin_d,ou=users,ou=vt,dc=vt,dc=local"; $ldaprdn2 = "ou=users,ou=vt,dc=vt,dc=local"; $ldaprdn3 = "panin_d@vt.local"; $ldaprdn4 = "ou=vt,dc=vt,dc=local"; $ldappass = "123"; $ldapbind = ldap_bind($ldapconn, $ldaprdn1, $ldappass); if ($ldapbind) { echo "Привязка прошла успешно! $ldaprdn1"; } else { echo "Не удается привязаться к каталогу... $ldaprdn1"; } $ldapbind = ldap_bind($ldapconn, $ldaprdn2, $ldappass); if ($ldapbind) { echo "Привязка прошла успешно! $ldaprdn2"; } else { echo "Не удается привязаться к каталогу...$ldaprdn2"; } $ldapbind = ldap_bind($ldapconn, $ldaprdn3, $ldappass); if ($ldapbind) { echo "Привязка прошла успешно! $ldaprdn3"; } else { echo "Не удается привязаться к каталогу...$ldaprdn3"; } $ldapbind = ldap_bind($ldapconn, $ldaprdn4, $ldappass); if ($ldapbind) { echo "Привязка прошла успешно! $ldaprdn4"; } else { echo "Не удается привязаться к каталогу...$ldaprdn4"; } ldap_close($ldapconn); ?> Я не могу привязаться к папке. Ошибка такая: Unable to bind to server: Protocol error in... прошу помощи. http://s57.radikal.ru/i158/0904/15/40342e9d1ccc.jpg вот ссылка скришота ldap-каталога.
1. Попробуй заменить имя контроллера на его IP. 2. Скорее всего проблема связана с неправильной установкой соединения. Смотри с версиями протокола какие есть завязки. И смотри специфичные для твоего LDAP-сервера примочки. Какой LDAP-сервер используется?