PHP:如何锁定活动目录用户帐户?

时间:2014-01-10 09:13:02

标签: php active-directory

我有一个工作脚本,允许我解锁用户帐户(通过将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

但该帐户仍处于解锁状态。

你知道我该怎么做吗? 提前谢谢。

5 个答案:

答案 0 :(得分:2)

LDAP绑定尝试不算作登录尝试。使用LogonUserCreateProcessWithLogon等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);