检测是否Active Directory用户帐户中使用Python LDAP锁定(Detect if

2019-06-26 18:12发布

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

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

寻找解决的办法,我发现:

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

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

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

或为特定用户:

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

但是,这是行不通的,该查询返回每次都没有结果。

Answer 1:

的零值lockoutTime意味着它不锁定。 所以,你应该试试这个。

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

其实,上面的查询仍然不是100%正确。 如果你读从MSDN印刷精美,微软建议你到添加Lockout-Time属性的Lockout-Duration与当前时间属性,然后进行比较。 这是因为有这样叫锁定时间的事情。 一旦锁定时间的推移,用户自动解锁。 零Lockout-Duration意味着该帐户被永远锁,直到管理员解锁。

看到这个MSDN文章

当帐户登录到成功此属性值仅重置。 这意味着,这个值可能不为零,但该帐户未锁定。 为了准确地确定帐户被锁定,您必须将锁定,时间到这个时间和结果比较当前的时间,占本地时区和夏令时。



Answer 2:

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

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

对于非空项。

更新:

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

因此,需要通过过滤:

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

获得该用户将被锁定,因为他们违反了密码策略,例如输入了错误的密码5倍的情况。



Answer 3:

另外,我发现lockoutTime不能保证在AD所有用户(至少在我们的配置),但会在到达锁定失败尝试的次数来创建。 因此,在检查锁定帐户,检查无或等同将需要为好。



Answer 4:

我还发现属性标志的此列表: 如何使用UserAccountControl标志

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

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

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

对于运营商1.2.840.113556.1.4.803见LDAP匹配规则



Answer 5:

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

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



Answer 6:

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

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



文章来源: Detect if an Active Directory user account is locked using LDAP in Python