在Python中使用LDAP检测是否锁定了Active Directory用户帐户

2024-06-29 01:13:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python的ldap模块验证用户登录。 当登录失败时,我得到一个ldap.INVALID_CREDENTIALS登录,但这可能是因为密码错误或帐户被锁定。第三次尝试后帐户被锁定。

我想检测帐户是否被锁定,并将其报告给沮丧的用户,而不是相同的“无效登录”消息。

正在搜索我找到的解决方案:

  • AD未使用userAccountControl锁定标志
  • 应该改为使用lockoutTime属性

我应该使用LDAP查询来查找锁定的用户:

(&(objectClass=user)(lockoutTime>=1))

或针对特定用户:

(&(objectClass=user)(sAMAccountName=jabberwocky)(lockoutTime>=1))

但这不起作用,查询每次都不返回结果。


Tags: 模块用户消息密码报告错误帐户解决方案
3条回答

此外,我发现锁定时间并不能保证所有AD用户(至少在我们的配置中是这样),而是在达到锁定失败次数时创建的。因此,在检查锁定账户时,也需要检查无账户或同等账户。

lockoutTime是一个<not set>属性,因此最简单的方法是使用:

(&(objectClass=user)(lockoutDuration=*))) 

对于非空条目。

更新:

但是,当密码过期、需要更改密码等时,也会设置此值

因此需要通过以下方式进行筛选:

UserPrincipal userPrincipal = new UserPrincipal(context);
bool isLocked = userPrincipal.IsAccountLockedOut();

获取用户因违反密码策略而被锁定的情况,例如错误地输入密码5次。

lockoutTime中的值为零表示它没有被锁定。所以,你应该试试这个。

(&(objectClass=user)(!lockoutTime=0)) 

实际上,上面的查询仍然不是100%正确。如果您从MSDN阅读了精细打印,Microsoft建议您将Lockout-Time属性添加到Lockout-Duration属性,然后将其与当前时间进行比较。那是因为有一种叫做锁定持续时间的东西。一旦锁定持续时间过去,用户将自动解锁。在Lockout-Duration中为零意味着帐户将永远锁定,直到管理员将其解锁。

看这个MSDN article

This attribute value is only reset when the account is logged onto successfully. This means that this value may be non zero, yet the account is not locked out. To accurately determine if the account is locked out, you must add the Lockout-Duration to this time and compare the result to the current time, accounting for local time zones and daylight savings time.

相关问题 更多 >