Windows AD重置密码报错:Warning: ldap_mod_replace(): Modify: Insufficient access

现象

通过AD的某个账号绑定LDAP,使用ldap_mod_replace修改密码时报错:Warning: ldap_mod_replace(): Modify: Insufficient access
DEBUG模式的详细错误:res_error: <00000005: SecErr: DSID-031A11EF, problem 4003 (INSUFF_ACCESS_RIGHTS)

原因

绑定LDAP的用户不具有【重置密码(Reset password)】的权限,导致报错。

解决方法

创建用户组收容绑定LDAP的用户,并且通过委派控制(Delegate Control)来添加【重置密码(Reset password)】的权限即可成功修改。

修改密码实例的核心代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 建立连接
// 加密通信连接LDAP服务器,无视自签名错误
$ldapConn = ldap_connect('ldaps://ad.test.com', 636);
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER);
// 开发环境可以开启DEBUG模式,便于排错
// ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

// 设置新密码
$entry["unicodePwd"] = iconv("UTF-8", "UTF-16LE", '"' . $newPassword . '"');

// 调用ldap_mod_replace修改密码。注意:$userDn 需要有【重置密码(Reset password)】的权限。
ldap_mod_replace($ldapConnection, $userDn, $entry);

一个相关错误的解释

###”LdapErr: DSID-0C09050E, comment: AcceptSecurityContext error
表示 LDAP 认证失败,可能的原因

  1. 用户密码已过期
  2. 用户需要在首次登录时更改密码,但当前客户端不支持密码更改
  3. 账户被锁定

顺便安利一个好用免费的域信息查询/排错工具

NetTools
NetTools 拥有超过 90 种功能,旨在帮助您排除故障、查询、报告和更新 Active Directory 和其他基于 LDAP 的目录,
是您进行 AD 故障排除的一站式助手。此外,借助其功能强大且功能丰富的 LDAP 客户端(拥有超过280 个预定义查询),您可以轻松简化 AD 管理。
最好的一点是什么?它完全免费!