LogonUserを使用して、ユーザーのドメイン資格情報のセットを検証しています。
LogonUser(accountName, domain, password,
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, ref token);
不穏な結果:
LogonType Current Password Old password
=========== ============================== ========================
Network Succeeds Succeeds
Batch Fails (0x00000569) Fails (invalid password)
Interactive Succeeds Fails (invalid password)
失敗コード:
0x00000569
:ログオンの失敗: ユーザーは、このコンピューターで要求されたログオンの種類を許可されていません0x0000052E
:ログオン失敗: ユーザー名またはパスワードが不明です
詳細:
- ユーザーが有効な資格情報を入力すると、関数は を返します
true
。 (良い) ユーザーが無効な資格情報を入力すると、関数は を返します
false
。 (良い)ユーザーがパスワードを変更し、新しい有効な資格情報を入力すると、関数は を返します
true
。(良い)ユーザーが無効な資格情報を入力すると、関数は を返します
false
。 (良い)ユーザーが古い資格情報を入力すると、関数は を返します
true
。 (悪い)
注:ユーザーが別のマシン (以前にログオンしたことのないマシン) に移動し、古い資格情報を入力すると、
LogonUser
引き続きtrueが返されます。これは、キャッシングがローカル マシンでは行われていないことを意味しますが、 「ネットワーク上」で行われます。
- ユーザーがパスワードを再度変更し、新しい資格情報を入力すると、関数は を返します
true
。 (良い) - ユーザーが古い資格情報を入力すると、関数は を返します
true
。 (悪い) - ユーザーが古い資格情報を入力すると、関数は を返します
false
。 (良い)
どのように、呼び出すときに、キャッシュされた資格情報LogonUser
を使用しないようにドメインに指示するように指示できますか。
注: ユーザーが古い (または古い古い) パスワードでWindows にログオンしようとすると、無効なパスワード エラーが発生します。
MSDN から:
LOGON32_LOGON_NETWORK
このログオン タイプは、ハイ パフォーマンス サーバーがプレーンテキスト パスワードを認証することを目的としています。LogonUser 関数は、この種類のログオンの資格情報をキャッシュしません。
LOGON32_LOGON_INTERACTIVE
このログオンの種類は、ターミナルサーバー、リモート シェル、または同様のプロセス によってログオンするユーザーなど、コンピューターを対話的に使用するユーザーを対象としています。このログオン タイプには、切断された操作のログオン情報をキャッシュするという追加の費用がかかります。したがって、メール サーバーなどの一部のクライアント/サーバー アプリケーションには不適切です。
LOGON32_LOGON_BATCH
このログオン タイプは、プロセスがユーザーの直接の介入なしにユーザーに代わって実行される可能性があるバッチ サーバーを対象としています。このタイプは、メール サーバーや Web サーバーなど、一度に多数の平文認証の試行を処理する高性能サーバー用でもあります。
私はプレーンテキストのパスワードを認証しているので、LOGON32_LOGON_NETWORK
. 対話型ログオンは資格情報をキャッシュしますが、ここでは許可されていません。Batchは、いつ使用する必要があるかについて文書化されていませんが、単に失敗します。
更新: ドメインは以下のみを許可します。
- 以前のパスワード (それ以降ではない)
- 60分だけ
1 時間の猶予期間を設けているのは、Active Directory の「機能」であることは明らかです。
ただし、猶予期間は必要なく、ドメインの設定も変更したくありません (古いパスワードの使用に 1 時間の猶予期間を許可するドメインの設定がわからないため) .