2012-08-03 52 views
12

私はPythonのLDAPモジュールを使用してユーザーログインを検証しています。 ログインに失敗すると、ldap.INVALID_CREDENTIALSログインが表示されますが、パスワードが間違っているか、アカウントがロックされている可能性があります。アカウントは3回目の試行後にロックされます。PythonでLDAPを使用してActive Directoryユーザーアカウントがロックされているかどうかを検出します

私は、アカウントがロックされていることを検出し、同じ「無効なログイン」メッセージではなく、欲求不満のユーザーに報告したいと考えています。

Iが見出さ溶液探し:でuserAccountControl LOCKEDフラグはADで使用されていない

  • lockoutTimeの属性ではなく

使用する必要があり、私はロックされたユーザーを検索するために使用されなければならないLDAPクエリは次のとおりです。

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

または特定のユーザーのために:

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

しかし、これが機能していない場合、クエリは毎回結果を返しません。

答えて

7

lockoutTimeの値が0の場合、ロックアウトされていないことを意味します。だから、これを試してみるべきです。

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

実際、上記のクエリはまだ100%正しくありません。 MSDNから細かい印刷物を読む場合は、Lockout-Duration属性にLockout-Time属性を追加し、それを現在の時刻と比較することをお勧めします。ロックアウト期間と呼ばれるものがあるからです。ロックアウト期間が過ぎると、ユーザーは自動的にロック解除されます。 Lockout-Durationの0は、管理者がロックを解除するまでアカウントが永久にロックされていることを意味します。

はまたこの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

と等しくないlockoutTimeの名前の存在属性を持つことになります'使用しているなら'(!lockoutTime = 0 ) '、あるいは'(lockoutTime> 0) 'であってもよい。 '(!lockoutTime> = 1)'だけがこれを避けているようです。 –

3

を参照してください、私はlockoutTimeのは(少なくとも私達の構成で)AD内のすべてのユーザーのために保証されていないことがわかったが、失敗したロックアウト試行回数に達した時に作成されます。したがって、ロックされたアカウントをチェックする際には、Noneまたは同等のものを確認する必要があります。

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

空でないエントリの:最も簡単な方法は使用することがあるので、

+3

私はこれも同様であることがわかりました。ユーザーが自分のアカウントをロックアウトしていない場合、属性 'lockoutTime'は設定されません。いつでもアカウントをロックアウトしてログインしているがアカウントがロックされていない場合、属性は0に設定されます。 – ChadSikorra

4

lockoutTime<not set>属性です。

更新:

ただし、この値は、パスワードの有効期限が切れたときに設定され、パスワードは変更する必要があるなど

だから、それはによってフィルタリングする必要があります

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

へユーザーがパスワードポリシーに違反したためにユーザーがロックアウトされた場合、たとえばパスワードを5回間違って入力した場合などがあります。

1

使用このクエリを最高の結果を得るために、

のGet-ADUser -LDAPFilter "(&(objectCategoryの=人)(objectClassの=ユーザー)(lockoutTimeの> = 1))" -Properties LockedOut

0

あなたが0x002でバイナリ-ANDの性質userAccountControlをしなければならない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 

:私はまた、プロパティフラグのリストを見つけました。すべてのロックを取得するためには(つまり無効)を使用すると、オペレータ1.2.840.113556.1.4.803について

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

を使用することができますアカウント(LDAP Matching Rules

0

(&(objectClassの=ユーザー)(&(lockoutTimeの= *)を参照してください!(lockoutTimeの= 0 {「DESC」:「悪い検索フィルタ」}))))

私は `ldap.FILTER_ERRORを取得し、ユーザーのオブジェクトを返し、0

関連する問題