2012-08-03 186 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

相關問題