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”.