ドメイン コントローラーのシャットダウン時にドメイン メンバーが認証に失敗する

この記事では、ドメイン コントローラー (DC) をシャットダウンするときにアプリケーションがユーザーを認証できない問題を修正します。

適用対象:ウィンドウ 10 – すべてのエディション、Windows Server 2012 R2

元の KB 番号: 2683606

現象

ドメイン上のアプリケーションでは、 NT Local Area Network Manager (NTLM) または Kerberos を使用してユーザーを認証します。 一部のアプリケーションでは、クライアントがアプリケーション サーバーに再接続することが多いパターンがあります。

アプリケーションは主に NTLM を使用する場合に影響を受ける。 Kerberos を使用するアプリケーションは、アプリケーションによって受け入れられた認証に Kerberos 特権属性証明書 (PAC) 検証が使用されている場合にも影響を受ける可能性があります。 いずれの場合も、これらの検証を無効にすることはできません。

このような状況では、DC をシャットダウンすると、両方の DC がネットワーク上で応答せず、ドメイン メンバーが認証に別の DC を選択するまで、アプリケーションがユーザーを認証しない可能性があります。

診断ログとネットワーク トレースに、ユーザー ログオン エラー のログオン エラー、またはエラー 0xc0000064 STATUS_NO_SUCH_USERが表示される場合があります。指定 したアカウントが存在しません。 Kerberos を使用している場合は、エラー 6、 KDC_ERR_C_PRINCIPAL_UNKNOWNが表示されることがあります。

原因

次の 2 つの問題が発生する可能性があります。

  1. DC がシャットダウン フェーズにある場合、通常は、エラー コード 0xc00000dc (STATUS_INVALID_SERVER_STATE) を使用して認証に別の DC を使用するように現在のクライアントに指示します。 この問題が発生しないコード パスがあります。

  2. サーバーは、Netlogon User Datagram Protocol (UDP) クエリでの新しいクライアントへの応答を回避しません。 また、DC がシャットダウン中であるというエラーを受け取ったクライアントは、後の DC 検索で同じ DC を選択することを避けられません。

シャットダウン中にクライアントが DC を選択すると、NTLM 要求または Kerberos 要求が再び失敗します。 この時点で、クライアントは負のキャッシュ モードになり、後で認証要求が失敗します。

NTLM の場合、クライアントはアプリケーション サーバーであるため、動作している DC が選択されるまで新しいクライアントを受け入れることはできません。

解決方法

この問題を回避するには、シャットダウンまたは再起動を開始する前に、DC の Netlogon サービスを停止します。 このアクションを自動化するには、DC のローカル シャットダウン スクリプトに停止タスクを入力します。 ローカル グループ ポリシーにアクセスするには、次の手順に従います。

  1. Gpedit.msc を起動する

  2. [設定] ツリーを開き、[コンピューターの構成>] [Windows 設定] [スクリプトのシャットダウン] > の順に>移動します。

  3. 新しいスクリプト コマンド ラインで、「」と入力 net stop netlogon && net stop kdcします。

レジストリ パラメーター NegativeCachePeriod を低い値に設定することはできますが、クライアントが代替 DC をより頻繁に検索するため、この変更によって問題が完全に回避されることはありません。

詳細

クライアントのNetlogon.logに、DC からエラー コード STATUS_INVALID_SERVER_STATE が表示されます。

<Date><Time> [CRITICAL] NlPrintRpcDebug: I_NetLogonSamLogonExの EEInfo を取得できませんでした: 1761 (0xc00000dcの正当な場合があります)
<日付><時刻> [CRITICAL] <ドメイン>: NlpUserValidateHigher: 状態後のアクセスの拒否: 0xc00000dc 0
<Date><Time> [SESSION] <domain>: NlSetStatusClientSession: 接続状態を c00000dc に設定する
<Date><Time> [SESSION] <domain>: NlSetStatusClientSession: サーバー \\<dc-name1> からバインドを解除します。<ドメイン FQDN> (TCP) 1。

クライアントが DC をいずれかの DC としてシャットダウンしようとすると、次のような結果が得られます。

<日付><時刻> [SESSION] <ドメイン>: NlSessionSetup: セッションのセットアップを試す
<Date><Time> [SESSION] <domain>: NlDiscoverDc: Start Synchronous Discovery
<日付><時刻> [MISC] NetpDcInitializeContext: DSGETDC_VALID_FLAGS は c01ffff1
<日付><時刻> [MAILSLOT] NetpDcPingListIp: ドメイン>: <UDP ping を 10.10.103.87 に送信しました
<Date><Time> [SESSION] NETLOGON_CONTROL_TC_QUERY関数が受信しました。
<日付><時刻> [MAILSLOT] NetpDcPingListIp: ドメイン>: <UDP ping を 10.10.103.93 に送信しました
<日付><時刻> [MAILSLOT] NetpDcPingListIp: ドメイン>: <UDP ping を 10.10.103.92 に送信しました

2 番目の ping は、シャットダウン時に DC に送信されます。

DC は応答しますが、既にクライアントにエラーが返されています。

<日付><時刻> [ログオン] HM-REBOOT: SamLogon: HM-REBOOT-SRV1 からの domain>\test1 の<推移的ネットワーク ログオン (HM-REBOOT-SRV1 経由) が入力されました
<日付><時刻> [ログオン] HM-REBOOT: SamLogon: HM-REBOOT-SRV1 からの domain>\test1 の<推移的ネットワーク ログオン (HM-REBOOT-SRV1 経由) は、0xC00000DCを返します
...
<日付><時刻> [MAILSLOT] UDP LDAP で HM-REBOOT-SRV1 <\domain> (null) から ping を受信しました
<日付><時刻> [MAILSLOT] <ドメイン>: \\<member サーバー> サイトへの Ping 応答 'Sam Logon Response Ex' (null): UDP LDAP の Default-First-Site-Name
<日付><時刻> [MAILSLOT] <ドメイン>: \\<member サーバー> サイトへの Ping 応答 'Sam Logon Response Ex' (null): UDP LDAP の Default-First-Site-Name

次の手順

"NegativeCachePeriod" のリファレンス: