Linux环境PHP无需COM组件通过管理员账号修改AD用户密码的方法
基于PHP LDAP扩展的AD密码修改方案(Linux环境可用)
前置要求
- 首先安装启用PHP的ldap扩展,Linux下可通过
apt install php-ldap(Debian/Ubuntu)或者yum install php-ldap(CentOS/RHEL)安装,安装后确认php.ini中extension=ldap.so配置已启用 - AD端必须配置LDAPS(LDAP over SSL/TLS),AD修改密码操作强制要求加密通道,默认使用636端口,需要提前把AD的根证书导入到Linux服务器的信任证书存储中,避免TLS校验失败
- 操作使用的管理员账号必须拥有对应AD用户的密码重置权限,无需待修改用户的原密码
实现代码
<?php // AD配置参数 $ldapHost = 'ldaps://替换为你的AD服务器地址'; // 必须使用ldaps协议 $ldapPort = 636; $adminDn = '管理员账号完整DN,示例:CN=admin,OU=Users,DC=domain,DC=com'; $adminPwd = '管理员账号密码'; $targetUserDn = '待修改用户的完整DN,示例:CN=testuser,OU=Users,DC=domain,DC=com'; $newPwd = '待设置的新密码'; // 必须符合AD的密码复杂度要求 // 初始化LDAP连接 $ldapConn = ldap_connect($ldapHost, $ldapPort); if (!$ldapConn) { die("LDAP连接失败"); } // 配置LDAP适配AD的参数要求 ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3); // AD要求使用LDAPv3协议 ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0); // 绑定管理员账号 $bindResult = ldap_bind($ldapConn, $adminDn, $adminPwd); if (!$bindResult) { die("管理员账号绑定失败:" . ldap_error($ldapConn)); } // 处理密码格式:AD的unicodePwd字段要求为UTF-16LE编码,且前后必须包裹双引号 $encodedNewPwd = mb_convert_encoding('"' . $newPwd . '"', 'UTF-16LE', 'UTF-8'); // 执行密码替换操作 $userData['unicodePwd'] = $encodedNewPwd; $modifyResult = ldap_mod_replace($ldapConn, $targetUserDn, $userData); if ($modifyResult) { echo "密码修改成功"; } else { echo "密码修改失败:" . ldap_error($ldapConn); } // 释放连接 ldap_unbind($ldapConn); ldap_close($ldapConn); ?>
常见问题排查
- LDAPS连接失败:先检查AD的636端口是否对Linux服务器开放,再通过
openssl s_client -connect AD服务器地址:636命令测试证书信任状态,确认Linux服务器已信任AD的SSL证书 - 权限报错:确认管理员账号拥有目标用户所在OU的重置密码权限,且目标用户的完整DN填写正确
- 无效属性值报错:确认新密码符合AD的密码复杂度、长度、历史重复限制,且密码编码格式正确,必须为包裹双引号的UTF-16LE编码
内容的提问来源于stack exchange,提问作者John Roberts
相关产品推荐
相关产品推荐

