2012-08-03 213 views
12

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

我想检测到帐户已被锁定,并向受挫用户报告,而不是相同的“无效登录”消息。

在搜索中的溶液,我发现:

  • 的userAccountControl的LOCKED标志不使用AD;
  • 的lockoutTime属性应改为使用

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

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

或特定用户:

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

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

回答

7

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.

+0

我得到'ldap.FILTER_ERROR:{“递减”:“坏搜索过滤器”} '如果使用'(!lockoutTime = 0 )',甚至'(lockoutTime> 0)'。只有'(!lockoutTime> = 1)'似乎可以避免这种情况。 – 2013-01-31 16:38:24

3

另外,我发现lockoutTime不能保证在广告中的所有用户(至少在我们的配置),但会在到达失败锁定尝试的次数来创建。因此,在检查锁定的帐户时,也需要检查“无”或等效项。

+3

我发现这也是如此。如果用户从未锁定帐户,则锁定时间属性不会被设置。如果在任何时候他们已经锁定了他们的账户并且已经登录,但是他们的账户不再被锁定,那么该属性将被设置为0。 – ChadSikorra 2015-02-24 21:09:20

4

lockoutTime<not set>属性,这样最简单的方法是使用:

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

的非空项。

更新:

然而,这个值密码过期也设置密码需要改变等

所以它需要通过过滤:

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

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

1

使用此查询,以获得最好的结果,

GET-ADUser便有-LDAPFilter “(&(objectCategory =人)(objectClass的=用户)(lockoutTime> = 1))” -Properties LockedOut

0

我还发现属性标志的此列表:How to use the UserAccountControl flags

SCRIPT 0x0001 1 
ACCOUNTDISABLE 0x0002 2 
HOMEDIR_REQUIRED 0x0008 8 
LOCKOUT 0x0010 16 
PASSWD_NOTREQD 0x0020 32 
PASSWD_CANT_CHANGE 0x0040 64 
ENCRYPTED_TEXT_PWD_ALLOWED 0x0080 128 
TEMP_DUPLICATE_ACCOUNT 0x0100 256 
NORMAL_ACCOUNT 0x0200 512 
INTERDOMAIN_TRUST_ACCOUNT 0x0800 2048 
WORKSTATION_TRUST_ACCOUNT 0x1000 4096 
SERVER_TRUST_ACCOUNT 0x2000 8192 
DONT_EXPIRE_PASSWORD 0x10000 65536 
MNS_LOGON_ACCOUNT 0x20000 131072 
SMARTCARD_REQUIRED 0x40000 262144 
TRUSTED_FOR_DELEGATION 0x80000 524288 
NOT_DELEGATED 0x100000 1048576 
USE_DES_KEY_ONLY 0x200000 2097152 
DONT_REQ_PREAUTH 0x400000 4194304 
PASSWORD_EXPIRED 0x800000 8388608 
TRUSTED_TO_AUTH_FOR_DELEGATION 0x1000000 16777216 
PARTIAL_SECRETS_ACCOUNT 0x04000000  67108864 

你必须做一个二进制并与0x002财产userAccountControl。为了得到所有锁定(即禁用)帐户,您可以使用

(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2)) 

对于运营商1.2.840.113556.1.4.803看到LDAP Matching Rules

0

(&(objectClass的=用户)(&(lockoutTime = *)(!(lockoutTime = 0 ))))

将返回它们的用户对象,并有一个名为lockoutTime当前属性,它不等于0

相关问题