19

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

同じ「無効なログイン」メッセージの代わりに、アカウントがロックされていることを検出し、不満を抱いているユーザーに報告したいと思います。

私が見つけた解決策を探しています:

  • userAccountControl LOCKED フラグは AD では使用されません。
  • 代わりに lockoutTime 属性を使用する必要があります

ロックされたユーザーを見つけるために使用する必要がある LDAP クエリは次のとおりです。

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

または特定のユーザーの場合:

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

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

4

7 に答える 7

13

ゼロの値は、lockoutTimeロックアウトされていないことを意味します。だから、これを試してみてください。

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

実際、上記のクエリはまだ 100% 正しいわけではありません。MSDN の細字部分を読んだ場合、Microsoft は、Lockout-Time属性を属性に追加しLockout-Duration、それを現在の時刻と比較することを提案しています。これは、ロックアウト期間と呼ばれるものがあるためです。ロックアウト期間が経過すると、ユーザーは自動的にロック解除されます。ゼロインはLockout-Duration、管理者がロックを解除するまでアカウントが永久にロックされることを意味します。

このMSDNの記事を参照してください

この属性値は、アカウントが正常にログオンした場合にのみリセットされます。これは、この値がゼロでない可能性があることを意味しますが、アカウントはロックアウトされていません。アカウントがロックアウトされているかどうかを正確に判断するには、この時間に Lockout-Duration を追加し、その結果を現在の時間と比較して、ローカル タイム ゾーンと夏時間を考慮する必要があります。

于 2012-08-07T05:28:18.823 に答える
4

lockoutTime<not set>属性であるため、最も簡単な方法は次を使用することです。

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

空でないエントリの場合。

アップデート:

ただし、この値は、パスワードの有効期限が切れた場合や、パスワードを変更する必要がある場合などにも設定されます。

したがって、次の方法でフィルタリングする必要があります。

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

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

于 2013-06-04T21:07:10.747 に答える
3

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

于 2012-08-24T20:01:21.153 に答える
3

このプロパティ フラグのリストも見つけました: 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

userAccountControlでプロパティのバイナリ AND を作成する必要があります0x002。使用できるすべてのロックされた (無効化された) アカウントを取得するには

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

オペレーター1.2.840.113556.1.4.803については、LDAP マッチング ルールを参照してください。

于 2016-03-16T12:39:26.560 に答える