Dan*_*eis 17 python active-directory python-ldap
我正在使用python的ldap模块验证用户登录.登录失败时,我会收到ldap.INVALID_CREDENTIALS登录信息,但这可能是因为密码错误或帐户被锁定.在第3次尝试后帐户被锁定.
我想检测到该帐户已被锁定并向受挫的用户报告,而不是相同的"无效登录"消息.
寻找解决方案我发现:
我应该用来查找锁定用户的LDAP查询是:
(&(objectClass=user)(lockoutTime>=1))
Run Code Online (Sandbox Code Playgroud)
或者对于特定用户:
(&(objectClass=user)(sAMAccountName=jabberwocky)(lockoutTime>=1))
Run Code Online (Sandbox Code Playgroud)
但这不起作用,查询每次都不返回任何结果.
Har*_*wok 12
值为零lockoutTime意味着它没有被锁定.所以,你应该试试这个.
(&(objectClass=user)(!lockoutTime=0))
Run Code Online (Sandbox Code Playgroud)
实际上,上述查询仍然不是100%正确.如果您从MSDN读取了精细打印,Microsoft建议您将Lockout-Time属性添加到Lockout-Duration属性,然后将其与当前时间进行比较.那是因为存在一种称为锁定持续时间的事情.锁定持续时间过后,用户将自动解锁.Zero in Lockout-Duration表示帐户被永久锁定,直到管理员解锁.
请参阅此MSDN文章
仅当帐户成功登录时,才会重置此属性值.这意味着此值可能不为零,但帐户未锁定.要准确确定帐户是否已锁定,您必须将锁定持续时间添加到此时间,并将结果与当前时间进行比较,并考虑当地时区和夏令时.
我还发现了这个属性标志列表: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
Run Code Online (Sandbox Code Playgroud)
userAccountControl您必须将属性与进行二元与0x002。为了获得所有锁定(即禁用)的帐户,您可以使用
(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))
Run Code Online (Sandbox Code Playgroud)
对于操作员,1.2.840.113556.1.4.803请参阅LDAP 匹配规则