现在是 2022 年,这仍然是一个相关问题。我必须编写类似的逻辑来查询 Active Directory 并确定用户帐户是否被锁定。接受的答案并没有真正帮助我。这是一个对我有用的示例代码:
function isAccountLocked($ldapconn, $userDn)
{
$read = ldap_read($ldapconn, $userDn, "(objectclass=*)", array("msds-user-account-control-computed")) or die("Not found");
$info = ldap_get_entries($ldapconn, $read);
$attributeValue = 0;
if (array_key_exists("0", $info)) {
if (array_key_exists("msds-user-account-control-computed", $info["0"])) {
if (array_key_exists("0", $info["0"]["msds-user-account-control-computed"])) {
$attributeValue = $info["0"]["msds-user-account-control-computed"]["0"];
}
}
}
return $attributeValue == 16 || $attributeValue == 8388608;
//16 - Account locked (by many unsuccessful login attempts)
//8388608 - Password Expired
//2 - Account disabled -> Not tested.
//check the docs here: https://docs.microsoft.com/en-us/windows/win32/adschema/a-msds-user-account-control-computed
}
另外,您可以在 Linux 终端中使用 ldapsearch 查询 msds-user-account-control-computed 属性。
但是,要在结果中显示它,您必须在过滤器中包含 msds-user-account-control-computed。否则,ldapsearch 默认不会返回。
检查以下示例:
ldapsearch -x -h activedirectoryhost.example.com -LLL -b "dc=example,dc=com" -D "CN=user,OU=SOME_OU,DC=example,DC=com" "(sAMAccountName=user)" -W cn msDS-User-Account-Control-Computed
令人惊讶的是,powershell 查询将返回一个 LockOut 属性,该属性准确地告诉我们想要什么,但其他 ldap 客户端不会返回它。 powershell 查询示例如下:
Get-ADUser user -Properties * | Select-Object LockedOut
这里有一些其他有用的链接:
https://docs.microsoft.com/en-US/troubleshoot/windows-server/identity/useraccountcontrol-manipulate-account-properties#property-flag-descriptions
https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src/ADSchema/a-msds-user-account-control-computed.md.