我有一个工作脚本,允许我解锁用户帐户(通过将lockouttime AD属性设置为0) 像这样的东西:
$entry["lockouttime"][0]=0;
$mod=ldap_mod_replace($ds,$dn,$entry)
现在我想做相反的事情:锁定帐户。 我已经读过 lockouttime是一个系统属性,而且活动目录不允许我们将其值设置为0的其他值。
所以我尝试使用用户帐户和密码错误绑定到服务器,但这似乎不起作用。
for($i=0;$i<10;$i++){
ldap_bind($ds,$dn, "theWrongPasswd");
}
运行此将显示此错误
Warning: ldap_bind(): Unable to bind to server: Invalid credentials
但该帐户仍处于解锁状态。
你知道我该怎么做吗? 提前谢谢。
答案 0 :(得分:2)
LDAP绑定尝试不算作登录尝试。使用LogonUser和CreateProcessWithLogon等API会生成登录尝试。
答案 1 :(得分:1)
通过userAccountControl
的{{1}}旗帜LOCKOUT
锁定用户无法。此标志与AD的密码策略相关,如果登录尝试次数过多,系统将设置。我自己尝试过:在设置了标志并将更改提交给AD后,值没有改变 - 没有抛出异常。
禁用帐户可以实现您想要做的同样的事情。为此,您必须设置0x0010
标记(ACCOUNTDISABLE
)。
这是所有UAC标志的列表:http://support.microsoft.com/kb/305144/en-us
答案 2 :(得分:0)
查看http://support.microsoft.com/kb/305144表示普通帐户的UAC值为512。
锁定0x0010 16 NORMAL_ACCOUNT 0x0200 512
我认为将其设置为528(锁定+普通帐户)将锁定用户帐户。
$entry["userAccountControl"][0]=512;
$mod=ldap_mod_replace($ds,$dn,$entry);
答案 3 :(得分:0)
我建议您使用会话变量自行计算失败的绑定尝试,并根据此自行锁定帐户。
要锁定帐户,您需要累积用户帐户控制选项并设置UserAccountControl属性。
引用http://support.microsoft.com/kb/305144,锁定将是:
$controlOption["useraccountcontrol"][0] = '514';
$mod = ldap_modify($ds, $dn, $controlOption);
514值来自NORMAL_ACCOUNT(512)+ ACCOUNTDISABLE(2)。
解锁将是NORMAL_ACCOUNT,512的值。
最终代码:
for ($i = 0; $i < 10; $i++) {
$result = ldap_bind($ds, $dn, "theWrongPasswd");
if (!$result) {
$_SESSION['failed-login']++;
}
if ($_SESSION['failed-login'] >= $maxCount) {
$controlOption["useraccountcontrol"][0] = 512 + 2;
$mod = ldap_modify($ds, $dn, $controlOption);
}
}
答案 4 :(得分:-1)
试试这个:
解锁:
$acctEntry["lockouttime"][0] = '1';
$mod = ldap_modify($ds, $dn, $acctEntry);
要锁定:
$acctEntry["lockouttime"][0] = '0';
$mod = ldap_modify($ds, $dn, $acctEntry);
启用:
$acctEntry["useraccountcontrol"][0] = '512';
$mod = ldap_modify($ds, $dn, $acctEntry);
要禁用:
$acctEntry["useraccountcontrol"][0] = '514';
$mod = ldap_modify($ds, $dn, $acctEntry);