Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP + ldap

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Klesk



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сори, не мой день - весь обсмотрелся так и не нашел тему про PHP вроде на 34 страницах где-то была здоровая... хотел туда запостить вопросик
 
1. Установил:
- IIS 5.1
- PHP 4.4.2 + PHP 4.4.2 Win32.
2. В php.ini:
- прописал путь extension_dir = "C:\Inetpub\PHP\extensions"
- раскомментировал extension=php_ldap.dll
3. В настройках безопасности web-сервера:
- отключил анонимный доступ
- включил встроенную проверку подлинности Windows
4. Скопировал:
- PHP\dlls\*.* в System32\
- php4ts.dll в PHP\sapi\
 
5. Проверяю phpinfo() (привожу то, что посчитал интересным):
- Server API : CGI/FastCGI
- LDAP Support : enabled
- AUTH_TYPE : Negotiate
- AUTH_USER : Real_Domen\Real_User
- HTTP_AUTHORIZATION : Negotiate YIII2QYGKwYBBQUC.................
 
Есть скрипт, который не работает:

Цитата:
$host = 'tc.domen.ru';
$port = '389';
$ds = ldap_connect($host,$port);  
$person = 'Иванов';
$dn = 'DC=domen,DC=ru';
$filter = "(|(sn='$person*')(givenName='$person*'))";
$justthese = array('ou','sn','givenName','mail');
$sr = ldap_search($ds, $dn, $filter, $justthese);
$info = ldap_get_entries($ds, $sr);
print $info['count'].' entries returned.';

 
Подскажите пожалуйста в чем ошибка-недоработка?

Всего записей: 208 | Зарегистр. 19-10-2003 | Отправлено: 14:24 28-06-2006 | Исправлено: Klesk, 16:15 28-06-2006
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Klesk
Смешной вопрос.
Цитата:
который не работает

У меня много чего есть что не работает.
Надо или писать что и как "не работает" или не писать вообще.

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 16:04 28-06-2006
Klesk



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KADABRA
Офигенно нужный совет, специально ждал такого вопроса, готовился? Я вот тебе тоже посоветую - нужно либо писать по делу, либо не писать вообще, умничать мы и сами с усами.
 
Бывает, что человеку достаточно прочесть и увидеть ошибку в синтаксисе (или как там его назыавется), например,
 вместо $dn = 'DC=domen,DC=ru'; нужно было писать $dn = 'O=domen,C=ru';
а вместо $filter = "(|(sn='$person*')(givenName='$person*'))"; нужно $filter = "(|(uid='$person*')(givenName='$person*'))";
 
? Сумничай по делу, спасибо большое скажу.

Всего записей: 208 | Зарегистр. 19-10-2003 | Отправлено: 16:20 28-06-2006
Klesk



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем спасибо поиск заработал, но опять же как-то странно...
Неработало потому что версия протокола была 2, нужно версию 3.
Заодно перекодировку запроса добавил.
 

Цитата:
$host = 'tc.domen.ru';  
$port = '389';  
$ds = ldap_connect($host,$port);  
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
$person = 'Иванов';
$person = iconv('CP1251','UTF-8',$person);
$dn = 'DC=domen,DC=ru';
$dn = iconv('CP1251','UTF-8',$dn);
$filter = "(|(sn='$person*')(givenName='$person*'))";
$justthese = array('ou','sn','givenName','mail');
$sr = ldap_search($ds, $dn, $filter, $justthese);
$info = ldap_get_entries($ds, $sr);
print $info['count'].' entries returned.';

 
Почему то данные вместо $dn = 'DC=domen,DC=ru'; берутся только из $ds = 'DC=domen.ru,CN=MicrosoftDNS,CN=System,DC=domen,DC=ru'; а при прямом указании каких-либо OU ничего не находит - "0 entries returned."
 
Может опять какой-нибудь параметр упустил, хм...

Всего записей: 208 | Зарегистр. 19-10-2003 | Отправлено: 09:26 29-06-2006
Klisha



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
$justthese = array('ou','sn','givenName','mail');  

 
Почему-то у меня на эту строчку ругается:  
 

Цитата:
Warning: ldap_search() [function.ldap-search]: Search: Operations error in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\ldap.php on line 12
 
 

И никакого поиска не происходит. Может кто сталкивался?

Всего записей: 683 | Зарегистр. 03-10-2001 | Отправлено: 10:38 11-10-2006
Klesk



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Klisha

Цитата:
ldap.php on line 12

Пиши все первые 12 строк, чтоб понятнее было.

Всего записей: 208 | Зарегистр. 19-10-2003 | Отправлено: 17:53 11-10-2006
Klisha



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Klesk
Использую тобой выше приведенные
12-я строка это
$sr = ldap_search($ds, $dn, $filter, $justthese);

Всего записей: 683 | Зарегистр. 03-10-2001 | Отправлено: 19:49 11-10-2006
Klisha



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Разобрался. Нашел работоспособный скрипт.
Может кому поможет.
Правда вопрос с привильным написанием фильтра возник. Кто знает как его правильно писать?
 
Скрипт:
 
$fields = array("name", "mail", "telephonenumber", "description");
    $ldap_port = "389";
    $filter = "cn=".iconv ('CP1251','UTF-8', "А*");;
    $ldap_user ="<domain>\test";
    $ldap_pass = "pass";
    $i = 0;
 
$connect = ldap_connect("10.x.x.x");
 
            ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
             ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
            $bind = ldap_bind($connect, $ldap_user, $ldap_pass);
            echo $bind;
            $read = ldap_search($connect, "dc=<domain>, dc=spb, dc=ru", $filter, $fields );
             print  $read;
            if ( $info = ldap_get_entries($connect, $read) )
            {
                for( $ligne = 0; $ligne<$info["count"]; $ligne++)
                {
                        $name = @iconv( 'UTF-8', 'CP1251', $info[$ligne][$fields[0]][0] );
                                $email = @$info[$ligne][$fields[1]][0];
                                           $phone = @$info[$ligne][$fields[2]][0];
                        $desc = @iconv('UTF-8', 'CP1251', $info[$ligne][$fields[3]][0]);
 
                               if ( isset($email) )
                        $result .= '<tr><td><p>&nbsp;'.$name.'</p></td>'
                              .'<td><p><a href="mailto:'.$email.'">'.$email.'</a></p></td>'
                                  .'<td><p>&nbsp;'.$phone.'</p></td>'
                              .'<td><p>&nbsp;'.$desc.'</p></td></tr>';
                }
            }
 
            ldap_close($connect);
 
    print $result.'</table><br>';
 
 
Добавлено:
И еще вопрос: при выполнении запроса "*" выдает надпись:
 
Warning: ldap_search() [function.ldap-search]: Partial search results returned: Sizelimit exceeded.
 
Может кто знает как с этим бороться?

Всего записей: 683 | Зарегистр. 03-10-2001 | Отправлено: 15:49 12-10-2006
Klesk



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Дак видимо у тебя авторизации не было, если apache используешь, у меня то IIS.

Цитата:
$ldap_user ="<domain>\test";  
$ldap_pass = "pass";  

 

Цитата:
Sizelimit exceeded.

Там вроде ограничение в 3000 строк, я так и не нашел решения. Там типа next своеобразного должно быть, типа выдать следующую порцию результатов поиска.

Всего записей: 208 | Зарегистр. 19-10-2003 | Отправлено: 16:05 12-10-2006
Klisha



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Klesk
А не пробовал ли ты случаем получать данные о прнадлежности пользователя к группам? мне это все надо ради определения принадлежности к группам. Но как это сделать - пока идей нет.

Всего записей: 683 | Зарегистр. 03-10-2001 | Отправлено: 19:34 12-10-2006
Klesk



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Klisha
Вот именно это я и хотел сделать...
Но в том то все и дело, что не смог реализовать этот next ) - до пользователей добраться и не смог, у меня какие-то служебные записи в первые 3000 попадали.
А так то наверное можно потом инфу получить о принадлежности к той или иной группе. Можно еще попробовать в инете покопаться, вдруг что новое найдется по данному вопросу...
Если что найдешь - пиши сюда, тоже интересна тема.

Всего записей: 208 | Зарегистр. 19-10-2003 | Отправлено: 17:00 15-10-2006
Klisha



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Код выводящий усеров и информацию по ним:

Код:
 
$ldap_host = "192.168.0.1";
   $ldap_port = "389";
   $base_dn = "cn=users,dc=test,dc=spb, dc=ru";
   $filter = iconv ('CP1251','UTF-8',"(&(objectClass=user)(cn=*))");
   $ldap_user ="test\admin";
   $ldap_pass = "password";
 
   $connect = ldap_connect( $ldap_host, $ldap_port);
   ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
   print $connect;
    ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
   $bind = ldap_bind($connect, $ldap_user, $ldap_pass);
   echo "<br>bind:".$bind;
   $read = ldap_search($connect, $base_dn, $filter);
   printf ($read);
   $info = ldap_get_entries($connect, $read);
   echo $info["count"]." entrees retournees<BR><BR>";
   for($ligne = 0; $ligne<$info["count"]; $ligne++)
   {
       for($colonne = 0; $colonne<$info[$ligne]["count"]; $colonne++)
       {
           $data = @iconv('UTF-8', 'CP1251',$info[$ligne][$colonne]);
           echo @iconv('UTF-8', 'CP1251',$data).":".@iconv('UTF-8', 'CP1251',$info[$ligne][$data][0])."<BR>";
       }
       echo "<BR>";
   }
ldap_close($connect);
 

 
если поменять строчку

Код:
 
$filter = iconv ('CP1251','UTF-8',"(&(objectClass=user)(cn=*))");
 

на

Код:
 
$filter = iconv ('CP1251','UTF-8',"(&(objectClass=group)(cn=*))");
 

то получим список групп.
Если правильно написмать этот фильтр то, судя по всему можно получить список членов группы, но как его написать я пока не знаю и в инете нигде примеров не нашел.

Всего записей: 683 | Зарегистр. 03-10-2001 | Отправлено: 10:09 16-10-2006
Klisha



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Эврика!
Получение списка членов группы можно организовать вот как:

Код:
 
 
$ldap_host = "192.168.0.1";  
   $ldap_port = "389";  
   $base_dn = iconv ('CP1251','UTF-8',"cn=<название группы>").",cn=users,dc=test,dc=spb, dc=ru";
   $filter = iconv ('CP1251','UTF-8',"(&(objectClass=*)(cn=*))");  
   $ldap_user ="test\admin";  
   $ldap_pass = "password";  
 
   $connect = ldap_connect( $ldap_host, $ldap_port);  
   ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);  
   print $connect;  
    ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);  
   $bind = ldap_bind($connect, $ldap_user, $ldap_pass);  
   echo "<br>bind:".$bind;  
   $read = ldap_search($connect, $base_dn, $filter);  
   printf ($read);  
$entry = ldap_first_entry($connect, $read);
   $attrs = ldap_get_attributes($connect,$entry);
for ($i=0; $i < $attrs["count"]; $i++) {
   $attr_name = $attrs[$i];
   for ($j=0; $j < $attrs[$attr_name]["count"]; $j++) {
     echo "<br>"."$attr_name: ".iconv('UTF-8', 'CP1251',$attrs["$attr_name"][$j])."\n";
   }
   }
 
 

 
Может у кого есть идеи как по логину пользователя получить все группы в которые он входит?

Всего записей: 683 | Зарегистр. 03-10-2001 | Отправлено: 10:31 18-10-2006
Demer

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
тема возможно уже забыта ... но всеже я спрошу... искользовал я поледний скрипт ... и возникла проблема в виде ошибки... :
 
"Resource id #1
bind:1Resource id #2
Warning: ldap_get_attributes(): supplied argument is not a valid ldap result entry resource in C:\corp_server\htdocs\corp\test.php on line 18"
 
объяните почему такое может быть?
 
смысл в том что я делаю корпоративный сайт, и надо добиться того, чтобы из актив деректори интерисующие меня данные были перенесены в SQL, но для начала мне необходимо вытащить хотябы какие-нить данные из АД

Всего записей: 29 | Зарегистр. 27-02-2007 | Отправлено: 12:51 18-07-2007
LiMan

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если вдруг кто-то в поиске.
 
http://adldap.sourceforge.net/
 
Наверное самый лучший способ интеграции.

Всего записей: 67 | Зарегистр. 10-08-2004 | Отправлено: 12:53 06-11-2008
AngeL



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LiMan, спасибо, неплохие скрипты...
Вопрос такой, может кто сталкивался, вобщем вот код
PHP 5.2.4.4, Apache 2.2, AD на другом компе на WS2003
 

Код:
//подключаемся к базе
$ldapconn = ldap_connect($ldaphost);
//авторизируемся
$ldapbind = ldap_bind($ldapconn,$ldapuser,$ldappassword);
//определяем параметры поиска
$dc="DC=TEST,DC=RU";
$filter="(objectClass=*)";
//непосредственно поиск
$search=@ldap_search($ldapconn, $dc, $filter);
 

 
ну так вот, такой поиск у меня вылетает с ошибкой, такой код

Код:
//подключаемся к базе
$ldapconn = ldap_connect($ldaphost);
//авторизируемся
$ldapbind = ldap_bind($ldapconn,$ldapuser,$ldappassword);
//определяем параметры поиска
$dc="CN=Users,DC=TEST,DC=RU";
$filter="(objectClass=*)";
//непосредственно поиск
$search=@ldap_search($ldapconn, $dc, $filter);
 

 
работает нормально и все выдает. Кто нибудь сталкивался стакой проблемой?
Просто мне нужны объекты начиная с корневой ветки, потому что юзеры разбросаны по разным веткам корневой директории.
 

Всего записей: 69 | Зарегистр. 19-05-2004 | Отправлено: 10:29 03-12-2008
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AngeL

Цитата:
такой поиск у меня вылетает с ошибкой

c какой ошибкой?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 02:12 04-12-2008
AngeL



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
Ошибка Operations error

Всего записей: 69 | Зарегистр. 19-05-2004 | Отправлено: 05:43 04-12-2008
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AngeL

Цитата:
Ошибка Operations error  

так а кто ее выдает?? php, что ли? попробуйте убрать @ перед функциями

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 06:11 04-12-2008
AngeL



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Попробовала, результат  
Warning: ldap_search() [function.ldap-search]: Search: Operations error in  
Ну да, я использую функции
ldap_error($ldapconn)
$err_no = ldap_errno($ldapconn);
и
ldap_err2str($err_no)
 
думаю, может у меня доступа нет в корневой каталог....

Всего записей: 69 | Зарегистр. 19-05-2004 | Отправлено: 07:15 04-12-2008 | Исправлено: AngeL, 07:18 04-12-2008
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP + ldap


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru