2012-08-09 101 views
1

我有权访问强制执行5个密码历史记录限制的Active Directory。您拥有的最后5个密码中的任何密码都不是可设置或重置为密码的可行候选项。如何使ldap尊重活动目录中的密码历史记录php

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

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

我已经研究了一段时间,但还没有找到任何固体解决方案。任何提示或意见非常感谢!

回答

1

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

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

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

+0

非常好的解释,谢谢! – 2012-08-10 15:04:18

2

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

根据帖子,该控件必须在服务器上可用。这是目前在Windows Server 2008 R2的Service Pack 1,可以使用此修补程序安装在2008 R2:

$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); 

非常感谢:http://support.microsoft.com/?id=2386717

然后你发布你的PHP代码的修改命令之前配置选项给作者bmaupin(找不到他/她的名字)。 我决定回答这个问题,因为我在寻找解决相同问题的解决方案时登陆了这里。