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

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

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

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

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

Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AngeL
читайте комменты www.php.net/ldap_search

Цитата:
In order to perform the searches on Windows 2003 Server Active Directory you have to set the LDAP_OPT_REFERRALS option to 0:
 
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
 
Without this, you will get "Operations error" if you try to search the whole AD schema (using root of the domain as a $base_dn).
 
As opposed to Windows 2000 Server, where this option was optional and only increased the performance.


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

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, Cheery, я вроде так пыталась сделать до этого, сейчас опять попыталась, теперь вот такую ошибку вижу...  
Partial results and referral received
Может говорит о чем нибудь?
 
Добавлено:
О, нашла на английском сайте ответ  
http://blog.redbranch.net/2008/05/php-ldap-search-root-of-active.html
 
надо было оказывается еще версию протокола указать, я то думала что если работает значит и не надо! Спасибо за подсказки!
 
ответ такой, добавить две строки после соединения
 

Код:
 
ldap_set_option ($ldap_connection, LDAP_OPT_REFERRALS, 0);
ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3);
 

 
УРА

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Маленький коммент для тех кто решит менять пароль (или создавать новых пользователей с паролем) через LDAP под ActiveDirectory:
ВАМ ПРИДЁТСЯ АКТИВИРОВАТЬ SSL для ActiveDirectory... подругому смена пароля не работает.
ЗЫ: у меня вебсервер = апач на винде
Основа взята из статьи (http://greg.cathell.net/php_ldap_ssl.html)
 
- Активируйте ssl для ActiveDirectory
(этот пункт весёлая вещь но он в принципе неплохо микрософтом в хелпе расписан... Уже не помню урлов... Если вспомню добавлю)
- Экспортируйте публичный ключ сертификата и преобразуйте его в base64 вид == .pem файлик (см у грега)
 
 
Теперь самое интересное
подключить php_ldap  
создать файлик c:\OpenLDAP\sysconf\ldap.conf (именно сюда)
в этом файлике должно быть такое содержимое (пути естественно и название файла сертификата рандом)
 
 
TLS_CACERT c:\serv.pem
TLS_CACERTFILE c:\serv.pem
TLS_REQCERT never
 
TLS_CACERT - незаработало я добавил TLS_CACERTFILE
Перезагрузите вебсервер
Теперь все работает.
 
Нюансы:
пароль в простом виде непрокатил. (Функция взята из adLDAP.php, но еёже я видел в инете на паре страниц)

Код:
 
function encode_password($password){
    $password="\"".$password."\"";
    $encoded="";
    for ($i=0; $i <strlen($password); $i++){
        $encoded.="{$password{$i}}\000";
        }
    return ($encoded);
 }
 

Всего записей: 67 | Зарегистр. 10-08-2004 | Отправлено: 14:25 05-01-2009 | Исправлено: LiMan, 14:28 05-01-2009
howisitfeel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
всем привет.
выдергиваю поле lastlogon или lastlogontimestamp
выдает примерно такие цифры 128967588203430496
тогда как функиця time(те настоящее время в формате Unix Epoch) выдает число 1252469684.
помогие разобраться с форматом времени выдоваемом ldap-ом

Всего записей: 6 | Зарегистр. 09-09-2009 | Отправлено: 08:04 09-09-2009
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
howisitfeel
отсчитывает каждые 100 наносекунд от 1 января 1601 года

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 08:21 09-09-2009
howisitfeel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо, проверим
 
Добавлено:
написал функцию, но похоже часы считает неправильно, не могу понять из-за чего.
 

Код:
 
function mdate($i)  
{
    $t=$i/10000000;
 
    $sec=$t%60;
    $t=$t/60;
 
    $min=$t%60;
    $t=$t/60;
 
    $hour=$t%24;
    $day=$t/24;
 
 
    $day=$day+3; #согласно рефеорме календаря папы римского Григория XIII от 1582г.
 
    $day1=$day%1461;
    $year=$day/1461;
    $year=(int)$year;
    $year=$year*4;
    $year=$year+1601;
 
    while(true)
    {
        $tmp=$year%4;
        if($tmp==0)
        {  
            if($day1<367)    break;
            $day1=$day1-367;  
            $year++;
        }
        else
        {  
            if($day1<366) break;    
            $day1=$day1-366;
            $year++;
        }
    }
    $day=$day1;
 
    if($year%4==0)
        $fuckingyear=1;
    else
        $fuckingyear=0;
 
    for($i=1;$i<13;$i++)
    {
        $day1=$day;
        if($i==2)
        {
            $day1 = $day1 - 28 - $fuckingyear;
        }
        else if($i%2==1)
            $day1 = $day1 - 31;
        else
            $day1 = $day1 - 30;
        if($day1<=0)
            break;
        $day=$day1;
    }
 
    $month=$i;
    $str=$year." ".$month." ".$day."  ".$hour.":".$min.":".$sec;
    return $str;
}
 

 
И при таких вот вызовах
    $tmp=$info[$i]["lastlogon"][0];
    $time=mdate($tmp);
Иногда выдает отрицательное значение секунд. Как остаток от деления может быть отрицательным? Не понимаю. Может быть нужно изменить типы переменных, тк php юзаю не так давно, в этом разобраться не могу...

Всего записей: 6 | Зарегистр. 09-09-2009 | Отправлено: 10:14 09-09-2009
Cheery



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

Код:
function FILETIMEtoUNIXtime($FILETIME, $round=true) {
// FILETIME is a 64-bit unsigned integer representing
// the number of 100-nanosecond intervals since January 1, 1601
// UNIX timestamp is number of seconds since January 1, 1970
// 116444736000000000 = 10000000 * 60 * 60 * 24 * 365 * 369 + 89 leap days
if ($round) {
return round(($FILETIME - 116444736000000000) / 10000000);
}
return ($FILETIME - 116444736000000000) / 10000000;
}

далее делаете что хотите с тем временем

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:11 09-09-2009
SergioEmpasaDeParado

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем доброго времени суток, почитал данную тему все отлично расписано, даже где то помогло несколько ошибок исправить. Однако с одной так и не могу разобраться, подскажите кто в теме по ldap+php. В общем есть код:

Код:
 
........
// Проверим, является ли пользователь членом указанной группы.
$result = ldap_search($ldap,$base,"(&(memberOf=".$memberof.")(".$filter2.$username."))");
 
$result_ent = ldap_get_entries($ldap,$result);
}else{die('Пользователь или пароль не соответствует');}}
// Если пользователь найден, т.е. результатов больше 0 (1 должен быть)
if ($result_ent['count'] != 0){echo "Получилось отобразить содержимое";
exit;
}
 
else{die('К сожалению, вам доступ закрыт');}
........
 

Если имя пользователя на английском (Не логин, а имя пользователя в АД) то прекрасно работает, а если на русском то строка ...if ($result_ent['count'] != 0){... говорит о том что нет такого пользователя в указанной группе. Я думаю что проблема с кодировкой, но как бы ее не менял у меня не получается зайти пользователю с русским именем пользователя. (PHP 5.6.78 + win server 2016 стандарт + iis)

Всего записей: 38 | Зарегистр. 13-04-2018 | Отправлено: 11:31 06-11-2018
Mavrikii

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

Цитата:
но как бы ее не менял

меняли как и где? ну и какая версия ldap?

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 21:20 06-11-2018
SergioEmpasaDeParado

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Менять кодировку пробовал командой:

$username = iconv("CP1251","utf-8",$username);

использовал разные вариации, на одном из форумов пользователю помогло:
$username = iconv("utf-8","utf-8",$username); но у меня не прокатило.
ldap 3 версии

ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);

Всего записей: 38 | Зарегистр. 13-04-2018 | Отправлено: 21:59 06-11-2018
Mavrikii

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

Цитата:
Менять кодировку пробовал командой:

а $username откуда брали?
проверяли преобразование?
v3 должен работать с уникодом.
https://stackoverflow.com/questions/11035359/foreign-characters-and-ldap-what-encoding-charset-does-ldap-expect

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 22:03 06-11-2018
SergioEmpasaDeParado

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
$username взял из ад использую логин пользователя

Код:
 
.....
$filter = "(sAMAccountName=".$_POST['login'].")";
$attr=array("displayname");
 
$search=ldap_search($ldap, $base, $filter,$attr); //Поиск поля атрибута
$number_returned = ldap_count_entries($ldap,$search); // Получаем количество записей
$info = ldap_get_entries($ldap, $search);
for ($i=0; $i<$info["count"]; $i++) {
$res=$info[$i];
$m_name=$res["displayname"];
$username = $m_name[0];
.....
 


Всего записей: 38 | Зарегистр. 13-04-2018 | Отправлено: 22:17 06-11-2018
Mavrikii

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

Цитата:
взял из ад использую логин пользователя  

ну так, наверно, оно уже возвращается в нужной кодировке? проверяли?
проблема может появиться там, где вы позже делаете манипуляции с ним.
ps: мне негде проверить, поэтому лишь идеи.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 22:20 06-11-2018
SergioEmpasaDeParado

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Даже если брать не из ldap а вводить в ручную и формы (Правильное имя пользователя) то он так же не может найти его в группе, на английском же все проходит как надо.

Код:
 
$result = ldap_search($ldap,$base,"(&(memberOf=".$memberof.")(".$filter2.$_POST['username_1']."))");
 

 
Добавлено:
Mavrikii
Я сейчас чуть со смеху не умер
 
Добавлено:
Mavrikii
было:
$result = ldap_search($ldap,$base,"(&(memberOf=".$memberof.")(".$filter2.$username."))");
Стало:
$result = ldap_search($ldap,$base,"(|(memberOf=".$memberof.")(".$filter2.$username."))");
 
Сейчас летает и на отечественном и на западном)

Всего записей: 38 | Зарегистр. 13-04-2018 | Отправлено: 22:21 06-11-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 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