我可以访问强制执行5密码历史记录限制的Active Directory。您拥有的最后5个密码中的任何密码都不是设置或重置为密码的可行候选者。
我正在使用php并尝试使用ldap调用来重置用户的密码。我可以使用ldap_modify调用重置密码。不幸的是,ldap_modify根本不关心Active Directory的密码历史记录规则,它会将密码重置为您选择的任何内容而没有任何警告或错误。
有没有办法让ldap尊重这个限制?
我已经研究了一段时间,但还没有找到任何可靠的解决方案。任何提示或评论都非常感谢!
答案 0 :(得分:2)
最近我遇到了同样的问题,发现this post。显然,密码修改被视为管理密码重置,您必须为AD指定其他选项以应用其规则。
根据帖子,控件必须在服务器上可用。它存在于Windows Server 2008 R2 Service Pack 1中,可以使用此修补程序在2008 R2中安装:http://support.microsoft.com/?id=2386717
然后在php代码上发出modify命令之前配置选项:
$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(找不到他/她的名字)。 我决定回答这个问题,因为我在寻找同样问题的解决方案时来到这里。
答案 1 :(得分:1)
如果MODIFY因任何原因失败,目录服务器应在MODIFY响应中返回非零结果代码。如果属性约束违规(例如,历史记录中的密码,或自上次密码更改后经过的时间不足,或任何其他属性约束违规),目录服务器必须返回{{的整数结果代码3}}(19)。
LDAP协议不了解服务器实现如何处理密码策略。 LDAP客户端必须使用上述结果代码来确定LDAP请求是否成功。也就是说,LDAP客户端与服务器实现隔离。
用户条目是否受密码策略限制 - 或任何其他属性约束确定 - 取决于服务器,而不是协议。如果MODIFY请求成功,即使客户端期望它失败,问题还在于服务器端或密码策略的约束。