域控制器关闭时域成员身份验证失败

本文修复了关闭域控制器(DC)时应用程序无法对用户进行身份验证的问题。

原始 KB 数: 2683606

现象

域上的应用程序使用 NT 局域网管理器(NTLM)Kerberos 对用户进行身份验证。 某些应用程序具有一种模式,客户端通常会重新连接到应用程序服务器。

应用程序在使用 NTLM 时受到的影响最大。 如果 Kerberos 特权属性证书 (PAC) 验证用于应用程序接受的身份验证,则使用 Kerberos 的应用程序也可能受到影响。 在所有情况下都无法关闭这些验证。

在这种情况下,当你关闭 DC 时,应用程序可能不会对用户进行身份验证,直到 DC 在网络上没有响应,并且域成员选择了其他 DC 进行身份验证。

在诊断日志和网络跟踪中,你可能会看到用户登录错误登录失败,或显示指定帐户不存在的错误0xc0000064 STATUS_NO_SUCH_USER 如果使用 Kerberos,可能会看到错误 6,KDC_ERR_C_PRINCIPAL_UNKNOWN

原因

可能会出现两个问题:

  1. DC 处于关闭阶段时,通常会告知当前客户端使用另一个 DC 进行身份验证,0xc00000dc (STATUS_INVALID_SERVER_STATE) 错误代码。 存在一个代码路径,此问题不会发生。

  2. 服务器不会避免响应 Netlogon 用户数据报协议 (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

<日期><时间> [CRITICAL] NlPrintRpcDebug: 无法获取 EEInfo I_NetLogonSamLogonEx: 1761 (可能合法0xc00000dc)
<日期><时间> [CRITICAL] <域>: NlpUserValidateHigher: 拒绝状态后的访问: 0xc00000dc 0
<日期><时间> [SESSION] <域>: NlSetStatusClientSession: 将连接状态设置为 c00000dc
<日期><时间> [SESSION] <域>: NlSetStatusClientSession: 从服务器 \\<dc-name1> 取消绑定。<domain FQDN> (TCP) 1.

当客户端尝试关闭 DC 作为其中一个 DC 时的结果:

<日期><时间> [SESSION] <域>: NlSessionSetup: 试用会话设置
<日期><时间> [SESSION] <域>: NlDiscoverDc: 启动同步发现
<日期><时间> [MISC] NetpDcInitializeContext: DSGETDC_VALID_FLAGS为 c01ffff1
<日期><时间> [MAILSLOT] NetpDcPingListIp: 域>: <已将 UDP ping 发送到 10.10.103.87
<接收的日期><时间> [SESSION] NETLOGON_CONTROL_TC_QUERY函数。
<日期><时间> [MAILSLOT] NetpDcPingListIp: 域>: <已将 UDP ping 发送到 10.10.103.93
<日期><时间> [MAILSLOT] NetpDcPingListIp: <域>: 已将 UDP ping 发送到 10.10.103.92

第二个 ping 将发送到关闭中的 DC。

DC 会做出响应,尽管它已将错误返回到客户端:

<日期><时间> [LOGON] HM-REBOOT: SamLogon: 通过 HM-REBOOT-SRV1 输入的域>\test1 的<可传递网络登录(通过 HM-REBOOT-SRV1) 输入
<日期><时间> [LOGON] HM-REBOOT: SamLogon: 来自 HM-REBOOT-SRV1 的域>\test1 的<可传递网络登录(通过 HM-REBOOT-SRV1)返回0xC00000DC
...
<在 UDP LDAP 上从 HM-REBOOT-SRV1 <\domain> (null) 收到 ping 的日期><时间> [MAILSLOT]
<日期><时间> [MAILSLOT] <域>:Ping 响应“Sam Logon Response Ex”(null)到 \\<member 服务器> 站点:UDP LDAP 上的 Default-First-Site-Name
<日期><时间> [MAILSLOT] <域>:Ping 响应“Sam Logon Response Ex”(null)到 \\<member 服务器> 站点:UDP LDAP 上的 Default-First-Site-Name

后续步骤

“NegativeCachePeriod”的参考: