Pythonのldapモジュールを使用してユーザーログインを検証しています。ログインに失敗すると、ldap.INVALID_CREDENTIALSログインが取得されますが、これはパスワードが間違っているか、アカウントがロックされているためです。 3回目の試行後、アカウントはロックされます。
同じ「無効なログイン」メッセージの代わりに、アカウントがロックされていることを検出し、それをフラストレーションのあるユーザーに報告したいと思います。
私が見つけた解決策を探す:
ロックされたユーザーを見つけるために使用するLDAPクエリは次のとおりです。
(&(objectClass=user)(lockoutTime>=1))
または、特定のユーザーの場合:
(&(objectClass=user)(sAMAccountName=jabberwocky)(lockoutTime>=1))
しかし、これは機能していません。クエリは毎回結果を返しません。
lockoutTime
のゼロの値は、ロックアウトされていないことを意味します。だから、これを試してみてください。
(&(objectClass=user)(!lockoutTime=0))
実際、上記のクエリはまだ完全に正しいわけではありません。 MSDNから詳細を読む場合、MicrosoftはLockout-Time
属性のLockout-Duration
属性を使用して、現在の時刻と比較します。ロックアウト期間と呼ばれるものがあるためです。ロックアウト期間が経過すると、ユーザーは自動的にロック解除されます。ゼロで Lockout-Duration
は、管理者がロックを解除するまでアカウントが永久にロックされることを意味します。
こちらをご覧ください MSDN記事
この属性値は、アカウントが正常にログオンしたときにのみリセットされます。これは、この値がゼロ以外であっても、アカウントがロックアウトされていないことを意味します。アカウントがロックアウトされているかどうかを正確に判断するには、この時間にロックアウト期間を追加し、結果を現在の時間と比較して、ローカルを考慮しますタイムゾーンと夏時間。
lockoutTime
は<not set>
属性を使用するのが最も簡単な方法です。
(&(objectClass=user)(lockoutDuration=*)))
空でないエントリの場合。
更新:
ただし、この値は、パスワードの有効期限が切れたとき、パスワードを変更する必要があるときなどにも設定されます。
そのため、以下でフィルタリングする必要があります。
UserPrincipal userPrincipal = new UserPrincipal(context);
bool isLocked = userPrincipal.IsAccountLockedOut();
ユーザーがパスワードポリシーに違反したためにユーザーがロックアウトされた場合を取得するには、たとえば、パスワードを5回誤って入力しました。
さらに、lockoutTimeはADのすべてのユーザーに対して保証されているわけではありません(少なくともこの構成では)が、ロックアウト試行の失敗回数に達すると作成されます。そのため、ロックされたアカウントをチェックする際には、なしまたは同等のチェックも必要になります。
次のプロパティフラグのリストも見つけました。 serAccountControlフラグの使用方法
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
と0x002
のバイナリANDを作成する必要があります。すべてのロックされた(つまり無効になっている)アカウントを取得するには、
(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))
演算子1.2.840.113556.1.4.803
については、 LDAPマッチングルール を参照してください
このクエリを使用して、最良の結果を取得します。
Get-ADUser -LDAPFilter "(&(objectCategory = Person)(objectClass = User)(lockoutTime> = 1))" -Properties LockedOut
(&(objectClass = user)(&(lockoutTime = *)(!(lockoutTime = 0))))
ユーザーであり、lockoutTimeという名前の現在の属性が0ではないオブジェクトを返します。