3

私は .NET を使用して DirectoryEntry を作成し、NativeObject メンバーにアクセスして、AD に対してユーザーの資格情報を検証しています。

「ユーザーは次のログオン時にパスワードを変更する必要があります」フラグが設定されているか、ログオン時間が一致しないためにユーザーが現在ログオンを許可されていないために、ログインが失敗する状況がいくつかあります。

これらの状況のいずれかが発生したのか、ユーザーが間違ったパスワードを入力したのかを区別したいと考えています。

パラメーター AuthenticationTypes.None を使用して DirectoryEntry オブジェクトを作成すると、ログインに失敗すると DirectoryServicesCOMException がスローされます。この例外の情報は、たとえば「パスワード変更」フラグが設定されているかどうかを判断するために使用できます。

残念ながら、パスワードが送信されるため、AuthenticationTypes.None の使用は安全な方法ではありません。

パラメータ AuthenticationTypes.Secure を使用して DirectoryEntry オブジェクトを作成すると、DirectoryServicesCOMException ではなく COMException がスローされます。この例外は、常にエラー コード ERROR_LOGON_FAILURE を持つため、非常に一般的です。ユーザーが間違ったパスワードを入力したのか、それともパスワードを変更する必要があるのか​​を区別できません。

MSDN のドキュメントには、次のように記載されています。AuthenticationTypes.Secure が設定されている場合、WinNT プロバイダーは NTLM を使用してクライアントを認証します。これは、COMException のみがスローされる別の動作につながると思います。

動作しますが、安全ではありません:

var de = new DirectoryEntry(path, user, pass, AuthenticationTypes.None);

安全ですが、COMException のみをスローします。

var de = new DirectoryEntry(path, user, pass, AuthenticationTypes.Secure);

最初のオプションは基本認証を使用し、特定の DirectoryServicesCOMException をスローします。2 番目のオプションは NTLM を使用し、汎用の COMException のみをスローします。

ユーザーがパスワードを変更する必要があるかどうか、アカウントがロックされているか有効期限が切れているかどうか、ログオン時間が無効かどうか、またはユーザーが間違ったパスワードを入力したかどうかを検出する方法を知っている人はいますか?

どうもありがとう。

4

0 に答える 0