1

我有权访问强制执行 5 个密码历史记录限制的 Active Directory。您拥有的最后 5 个密码中的任何密码都不适合设置或重置为您的密码。

我正在使用 php 并尝试使用 ldap 调用来重置用户的密码。我可以使用 ldap_modify 调用很好地重置密码。不幸的是,ldap_modify 根本不关心 Active Directory 的密码历史规则,它会将密码重置为您选择的任何内容,而不会出现警告或错误。

有什么办法让 ldap 尊重这个限制?

我已经研究了一段时间,但没有找到任何可靠的解决方案。非常感谢任何提示或评论!

4

2 回答 2

2

最近我遇到了同样的问题,发现了这篇文章。显然,密码修改被认为是管理密码重置,您必须为 AD 指定其他选项以应用其规则。

根据帖子,该控件必须在服务器上可用。它存在于 Windows Server 2008 R2 Service Pack 1 中,并且可以使用此修补程序安装在 2008 R2 中:http: //support.microsoft.com/ ?id=2386717

然后在对 php 代码发出修改命令之前配置选项:

$ctrl1 = array(
    // LDAP_SERVER_POLICY_HINTS_OID for Windows 2012 and above
    "oid" => "1.2.840.113556.1.4.2239",
    "value" => sprintf("%c%c%c%c%c", 48, 3, 2, 1, 1));

$ctrl2 = array(
    // LDAP_SERVER_POLICY_HINTS_DEPRECATED_OID for Windows 2008 R2 SP1 and above
    "oid" => "1.2.840.113556.1.4.2066",
    "value" => sprintf("%c%c%c%c%c", 48, 3, 2, 1, 1));

if (!ldap_set_option($ds, LDAP_OPT_SERVER_CONTROLS, array($ctrl1, $ctrl2))) {
    error_log("ERROR: Failed to set server controls");
}

$result = ldap_mod_replace($ds, $dn, $entry);

非常感谢帖子作者 bmaupin(找不到他/她的名字)。我决定回答这个问题,因为我在寻找相同问题的解决方案时来到这里。

于 2014-11-05T17:46:59.997 回答
1

如果 MODIFY 因任何原因失败,目录服务器应在 MODIFY 响应中返回非零结果代码。在违反属性约束的情况下(例如,历史中的密码,或自上次密码更改以来经过的时间不足,或任何其他属性约束违反),目录服务器必须返回约束违反的整数结果代码(19)。

LDAP 协议不知道服务器实现如何处理密码策略。LDAP 客户端必须使用上述结果代码来确定 LDAP 请求是否成功。也就是说,LDAP 客户端与服务器实现是隔离的。

用户条目是否受密码策略 - 或任何其他属性约束确定 - 取决于服务器,而不是协议。如果 MODIFY 请求成功,即使客户端期望它失败,则问题出在服务器端或密码策略的约束。

于 2012-08-09T18:31:41.963 回答