Привет, я написал следующий сценарий для обновления пароля для конкретного пользователя
<?php function create_ldap_connection() { $ip = "192.168.168.1"; $ldaps_url = "192.168.168.1"; $port = 389; $ldap_conn = ldap_connect($ldaps_url, $port) or die("Sorry! Could not connect to LDAP server ($ip)"); $password = "password"; $binddn = "CN=Administrator,CN=Users,DC=ad,DC=test,DC=com"; $result = ldap_bind( $ldap_conn, $binddn, $password ) or die(" Error: Couldn't bind to server using provided credentials!"); if($result) { return $ldap_conn; } else { die (" Error: Couldn't bind to server with supplied credentials!"); } } function get_user_dn($ldap_conn, $user_name) { /* Write the below details as per your AD setting */ $basedn = "OU=ITS Users,DC=ad,DC=test,DC=com"; /* Search the user details in AD server */ $searchResults = ldap_search($ldap_conn, $basedn, $user_name); if(!is_resource($searchResults)) die('Error in search results.'); /* Get the first entry from the searched result */ $entry = ldap_first_entry($ldap_conn, $searchResults); $info = ldap_get_entries($ldap_conn, $searchResults); echo $info["count"]." entries returned\n"; return ldap_get_dn($ldap_conn, $entry); } function pwd_encryption($newPassword) { $newPassword = "\"" . $newPassword . "\""; $len = strlen($newPassword); $newPassw = ""; for ($i = 0; $i < $len; $i++) { $newPassw .= "{$newPassword {$i}}\000"; } $userdata["unicodePwd"] = $newPassw; return $userdata; } $user_name = "(|(sn=archieg*)(SamAccountName=archieg*))"; $user_password = "password!1234"; $ldap_conn = create_ldap_connection(); $userDn = get_user_dn($ldap_conn, $user_name); $userdata = pwd_encryption ($user_password); print_r($userdata); //$result = ldap_mod_replace($ldap_conn, $userDn , $userdata); /* Check whether the password updated successfully or not. */ $result = ldap_modify($ldap_conn, $userDn , $userdata); if($result) { echo "Success attempting to modify password in AD"; } else { echo "Error: Please try again later!\n"; $e = ldap_error($ldap_conn); $e_no = ldap_errno($ldap_conn); echo $e . "\n"; echo $e_no . "\n"; } ?>
Однако, когда я запускаю это, я получаю следующую ошибку,
[root@web chpasswd]# php ad_change.php PHP Warning: Module 'intl' already loaded in Unknown on line 0 1 entries returned Array ( [unicodePwd] => "password!1234" ) Error: Please try again later! Server is unwilling to perform 53 [root@web chpasswd]#
Что я здесь делаю неправильно? Я играл с шифрованием, но это тоже не помогло. У меня есть Active Directory Windows Server 2012 R2.
Большое спасибо
Выяснилось, что это не проблема с моим кодом. Мне нужно было установить полномочия центра сертификации на моем сервере. Это то, что я сделал,
Убедитесь, что у вашей установки PHP есть расширения ldap и openssl.
Процедура Windows / Linux
Проверьте параметры файла ldap.conf.
В Windows убедитесь, что существует файл C: \ openldap \ sysconf \ ldap.conf.
Для Linux убедитесь, что файл /etc/openldap/ldap.conf существует. Если это не так, создайте его.
Для Linux и Windows файл ldap.conf должен содержать следующую строку: ** –
TLS_REQCERT никогда
Если вы хотите, чтобы php проверил сертификат ssl сервера ldap с центром сертификации, который выдал сертификат, вам необходимо поместить корневой сертификат здесь: Экспортировать доверенный корневой сертификат. (Подробнее см. Шаг 1 в разделе «Как протестировать LDAP через SSL»).
Используйте эту команду для преобразования DER в PEM:
openssl x509 -in RootCert.der -inform DER -out RootCert.pem -outform PEM
В Windows вы можете загружать двоичные файлы openssl с этих двух сайтов:
http://gnuwin32.sourceforge.net/packages.html
http://www.ShininglightPro.com/
Теперь скопируйте файл rootcert.pem в папку certs:
Для Linux, /etc/openldap/cert/rootcert.pem
Для Windows, C: \ openldap \ sysconf \ certs \ rootcert.pem
Для Linux и Windows файл ldap.conf должен содержать следующую строку:
(Linux) TLS_CACERT /etc/openldap/cert/rootcert.pem
(Windows) TLS_CACERT c: \ OpenLDAP \ sysconf \ certs \ rootcert.pem
Вы можете найти мой последний код на https://github.com/achintha85/AD_User_Password_Change_PHP
Надеюсь, это поможет кому-то в будущем.