使用 PHP 发布更新 AD 密码
Issue updating AD password using PHP
您好,我编写了以下脚本来更新特定用户的密码
<?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}}[=11=]0";
}
$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]#
我在这里做错了什么?我一直在玩弄加密,但这也无济于事。我有 Windows Server 2012 R2 Active Directory。
非常感谢
事实证明这不是我的代码的问题。我必须在我的服务器上设置证书颁发机构。这就是我所做的,
确保您的 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向颁发证书的证书颁发机构验证ldap服务器的ssl证书,您需要将根证书放在这里:
导出受信任的根证书。 (有关详细信息,请参阅如何通过 SSL 测试 LDAP 中的步骤 1)。
使用此命令将 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 复制到证书文件夹:
对于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
上找到我的最新代码
希望这对以后的人有所帮助。
您好,我编写了以下脚本来更新特定用户的密码
<?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}}[=11=]0";
}
$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]#
我在这里做错了什么?我一直在玩弄加密,但这也无济于事。我有 Windows Server 2012 R2 Active Directory。
非常感谢
事实证明这不是我的代码的问题。我必须在我的服务器上设置证书颁发机构。这就是我所做的,
确保您的 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向颁发证书的证书颁发机构验证ldap服务器的ssl证书,您需要将根证书放在这里: 导出受信任的根证书。 (有关详细信息,请参阅如何通过 SSL 测试 LDAP 中的步骤 1)。
使用此命令将 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 复制到证书文件夹:
对于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
上找到我的最新代码希望这对以后的人有所帮助。