web-dev-qa-db-ja.com

PythonでLDAPを使用してActive Directoryユーザーアカウントがロックされているかどうかを検出する

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

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

私が見つけた解決策を探す:

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

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

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

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

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

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

17
Daniel Reis

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

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

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

こちらをご覧ください MSDN記事

この属性値は、アカウントが正常にログオンしたときにのみリセットされます。これは、この値がゼロ以外であっても、アカウントがロックアウトされていないことを意味します。アカウントがロックアウトされているかどうかを正確に判断するには、この時間にロックアウト期間を追加し、結果を現在の時間と比較して、ローカルを考慮しますタイムゾーンと夏時間。

12
Harvey Kwok

lockoutTime<not set>属性を使用するのが最も簡単な方法です。

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

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

更新:

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

そのため、以下でフィルタリングする必要があります。

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

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

4
nzpcmad

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

3
user917089

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

プロパティuserAccountControl0x002のバイナリANDを作成する必要があります。すべてのロックされた(つまり無効になっている)アカウントを取得するには、

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

演算子1.2.840.113556.1.4.803については、 LDAPマッチングルール を参照してください

2

このクエリを使用して、最良の結果を取得します。

Get-ADUser -LDAPFilter "(&(objectCategory = Person)(objectClass = User)(lockoutTime> = 1))" -Properties LockedOut

1
Rizwan Ranjha

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

ユーザーであり、lockoutTimeという名前の現在の属性が0ではないオブジェクトを返します。

0
Jonas