PHP/Linux и Active Directory (AD)

Руководств в сети много, но не смотря на это я убил пару дней для того, чтоб мой PHP/apache/linux заработал в связке с windows 2003 server.


PHP должен быть собран с поддержкой ldap.

<?php
echo "<pre>n";

$ldaprdn  = 'domain\username‘;     // user - ldap rdn or dn
$ldappass = ‘pass‘;                      // пароль
$basedn = "OU=Department,DC=domain,DC=company,DC=ua";
        //место в Active Directory где живет username
        // Если вы понятия не имеете откуда это взять -
        // попробуйте такое:
        // CSVDE -v -n -f AD.csv
        // запускать из коммандной строки на контроллере домена,
        // в результате получите довольно удобный файлиик AD.csv

// connect to ldap server
$ldapconn = ldap_connect("ldap://domain.controller")
        // по-хорошему надо ldaps:, но для начала пойдет и так
        or die("Could not connect to LDAP/AD server.");
        // Если не получается тут - смотрим файрвол. 

if (!$ldapconn) {
         ldapShowErr($ldapconn);   // Самое главное - почему нет связи?
         exit("ldapconn failed\n");

// binding to ldap server
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);

// verify binding
if ($ldapbind) {
	echo "LDAP bind successful\n";    // Успешно
} else {
	echo "LDAP bind failed\n";    // Авторизация не прошла
	ldapShowErr($ldapconn);    // почему не прошла?
	exit;
}

//——srch—-
$filter = "(cn=*)";

if (!($search=ldap_search($ldapconn, $basedn, $filter))) {
	echo "Unable to search ldap server<br>n";
	echo "msg:’".ldap_error($ldapconn)."’</br>n";   //check the message again
	ldapShowErr($ldapconn);        // опять смотрим, почему ldap не пускает
	exit;
}

$number_returned = ldap_count_entries($ldapconn,$search);
$info = ldap_get_entries($ldapconn, $search);
echo "The number of entries returned is $number_returnedn";

for ($i=0; $i<$info["count"]; $i++) {
echo "==$i====n";
var_dump($info[$i]);   

}

//=================================
function ldapShowErr($ldapconn){        // дает код ошибки в 16-ричном виде
	ldap_get_option($ldapconn,LDAP_OPT_ERROR_NUMBER,$optErrorNumber);
	// 525 account does not exist or username is invalid
	// 52e unknown user name or bad password
	// 530 not permitted to logon at this time
	// 531 not permitted to logon from this workstation
	// 532 password expired
	// 533 account disabled
	// 701 account expired
	// 773 user must reset password
	// 775 account is currently locked out
	echo "Err ".ldap_errno($ldapconn).": ".ldap_error($ldapconn);
        echo "#$optErrorNumbern";
	ldap_get_option($ldapconn,LDAP_OPT_ERROR_STRING,$optError);
        // ошибка LDAP/AD человеческим языком
	echo "#$optErrorn";
}
?>

Возможно, вам понадобится:
родные пхп функции лдап-а
Полный список ошибок можно посмотреть тут
В процессе экспериментов несколько раз получил “account is currently locked out” - и если бы не детальный разбор ошибок соединения, то еще долго бился бы головой о стену, поскольку это выглядело как невразумительное “invalid credentials”.

» » » » »

Оставить комментарий - Feel free to ask me in English

Он появится после того, как будет одобрен. - All comments are pre-moderated.

Внимание! Пожалуйста, не пишите в комментарии [url=... или [url]... - это будет считаться спамом. Если хотите дать ссылку - пишите просто адрес, до 2х на один коммент.
Attention! Please don't use "[url=..." or "[url]..." in comment's body or it will be deleted as spam
If you want to send me a link just type url, up to 2 urls in one comment.

Спасибо за отзыв! Thank you for a comment!