<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AdminPackStudio</title>
    <description>The latest articles on DEV Community by AdminPackStudio (@adminpackstudio).</description>
    <link>https://dev.to/adminpackstudio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4167635%2F08f935ad-f91f-42f5-9f97-43e9754d3e9f.png</url>
      <title>DEV Community: AdminPackStudio</title>
      <link>https://dev.to/adminpackstudio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adminpackstudio"/>
    <language>en</language>
    <item>
      <title>WinRM Cannot Complete the Operation: A Read-First Name, Port, Listener, Firewall Profile, and TrustedHosts Triage</title>
      <dc:creator>AdminPackStudio</dc:creator>
      <pubDate>Mon, 19 Oct 2026 18:46:54 +0000</pubDate>
      <link>https://dev.to/adminpackstudio/winrm-cannot-complete-the-operation-a-read-first-name-port-listener-firewall-profile-and-c8m</link>
      <guid>https://dev.to/adminpackstudio/winrm-cannot-complete-the-operation-a-read-first-name-port-listener-firewall-profile-and-c8m</guid>
      <description>&lt;p&gt;Helpdesk: "From JUMP01, &lt;code&gt;Enter-PSSession -ComputerName FS02&lt;/code&gt; fails with 'Connecting to remote server FS02 failed with the following error message : WinRM cannot complete the operation. Verify that the specified computer name is valid, that the computer is accessible over the network, and that a firewall exception for the WinRM service is enabled and allows access from this computer.' RDP to FS02 works, and &lt;code&gt;Invoke-Command&lt;/code&gt; to FS01 from the same box works. A forum post says to run &lt;code&gt;Set-Item WSMan:\localhost\Client\TrustedHosts -Value *&lt;/code&gt; here and &lt;code&gt;Enable-PSRemoting -SkipNetworkProfileCheck -Force&lt;/code&gt; on every server. Can we do that?"&lt;/p&gt;

&lt;p&gt;Not yet. &lt;strong&gt;The &lt;em&gt;WinRM cannot complete the operation&lt;/em&gt; error isn't an authentication failure. It's the client telling you it never got a WS-Management answer from that name on that port: the name resolved somewhere else, the path or a network firewall dropped TCP 5985, the WinRM service or its listener isn't there, the Windows Firewall rule on the target is off or scoped to the local subnet, the target's network profile flipped to Public, or a proxy got in the way.&lt;/strong&gt; Microsoft's own copy of the message, from Server Manager's troubleshooting guide, says as much: "Windows Remote Management (WinRM) cannot complete the operation. Verify that the specified computer name is valid, that the computer is accessible over the network, and that a firewall exception for the Windows Remote Management service is enabled and allows access from this computer. By default, the WinRM firewall exception for public profiles limits access to remote computers within the same local subnet." TrustedHosts doesn't touch any of that. Microsoft describes it as an authentication setting: "you should consider the TrustedHosts setting to be the list of hosts for which you wish to suppress the error generated by being unable to verify the server's identity." Work through it as a chain: &lt;strong&gt;which command, which name, from where, and what else works?&lt;/strong&gt; → &lt;strong&gt;what does the whole error say?&lt;/strong&gt; → &lt;strong&gt;does the name resolve to the right address, and does TCP 5985 answer?&lt;/strong&gt; → &lt;strong&gt;does WinRM itself answer (&lt;code&gt;Test-WSMan&lt;/code&gt;)?&lt;/strong&gt; → &lt;strong&gt;on the target: is the service running and is there a listener on the right addresses?&lt;/strong&gt; → &lt;strong&gt;is the firewall rule on, in which profile, scoped to which addresses, and what profile is the network in?&lt;/strong&gt; → &lt;strong&gt;is a proxy in the path?&lt;/strong&gt; → &lt;strong&gt;once it connects, does the error change to an authentication one?&lt;/strong&gt; → &lt;strong&gt;change one link&lt;/strong&gt; → &lt;strong&gt;prove it from the same client.&lt;/strong&gt; &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;Test-WSMan&lt;/code&gt;, &lt;code&gt;Get-Service&lt;/code&gt;, &lt;code&gt;winrm enumerate winrm/config/listener&lt;/code&gt;, &lt;code&gt;Get-WSManInstance&lt;/code&gt;, &lt;code&gt;Get-NetConnectionProfile&lt;/code&gt;, &lt;code&gt;Get-NetFirewallRule&lt;/code&gt;, &lt;code&gt;Get-NetFirewallAddressFilter&lt;/code&gt;, &lt;code&gt;netsh winhttp show advproxy&lt;/code&gt;, and &lt;code&gt;setspn -Q&lt;/code&gt; are the sources for that chain. Set TrustedHosts to &lt;code&gt;*&lt;/code&gt; just in case and you've told every PowerShell session on that box to skip server identity checks for every name, while the firewall rule that dropped the packet is still dropping it.&lt;/p&gt;

&lt;p&gt;If the same server also fails Kerberos to file shares or SQL with a target name error, &lt;a href="https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak"&gt;The Target Principal Name Is Incorrect&lt;/a&gt; covers the DNS, password, and SPN side. If the remoting failure shows up during Hyper-V live migration or remote host management, &lt;a href="https://dev.to/adminpackstudio/hyper-v-live-migration-failed-event-21502-a-read-first-switch-processor-version-and-kerberos-181f"&gt;Hyper-V Live Migration Failed (Event 21502)&lt;/a&gt; covers the migration side. This post covers &lt;strong&gt;"a Windows client or server that fails &lt;code&gt;Enter-PSSession&lt;/code&gt;, &lt;code&gt;Invoke-Command&lt;/code&gt;, &lt;code&gt;New-PSSession&lt;/code&gt;, &lt;code&gt;Test-WSMan&lt;/code&gt;, Windows Admin Center, Server Manager, or Hyper-V Manager to a Windows Server target with 'WinRM cannot complete the operation', with or without the related 'connection to the remote host was refused', 'client cannot connect to the destination', 'cannot process the request', or OperationTimeout errors, and you need a read-first path before you set TrustedHosts to *, open the Public firewall rule to Any, or re-run Enable-PSRemoting everywhere."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read the whole error, not the first five words.&lt;/strong&gt; &lt;em&gt;WinRM cannot complete the operation&lt;/em&gt; means no answer came back; "The WinRM client cannot process the request" and "WinRM cannot process the request" mean an answer came back and authentication failed. They have different fixes (Step 2).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prove the path before the service.&lt;/strong&gt; &lt;code&gt;Test-NetConnection -ComputerName FS02 -Port 5985&lt;/code&gt; tells you whether the name resolves and TCP 5985 answers from this client. A failure there is DNS, routing, or a firewall, not PowerShell (Step 3).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Test-WSMan&lt;/code&gt; is the cheapest WinRM probe.&lt;/strong&gt; Microsoft: it "submits an identification request that determines whether the WinRM service is running on a local or remote computer." Without &lt;code&gt;-Authentication&lt;/code&gt; it's sent anonymously, so it separates a missing listener from missing rights (Step 4).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A running service isn't a listener.&lt;/strong&gt; Microsoft: "By default, no WinRM listener is configured. Even if the WinRM service is running, WS-Management protocol messages that request data can't be received or sent." A policy-made listener with an empty filter listens on nothing (Step 5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Public profile is the classic cause.&lt;/strong&gt; Microsoft: Enable-PSRemoting "also creates a firewall rule for public networks that allows remote access only from computers in the same local subnet." A server whose NIC fell to Public answers its own subnet and nobody else (Step 6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TrustedHosts is for authentication, not reachability.&lt;/strong&gt; Microsoft: "The computers in the trusted hosts list aren't authenticated." Use it only for the IP-address or workgroup case it was made for, with a specific entry (Steps 8 and 9).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where in the chain did it break?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What should be true&lt;/th&gt;
&lt;th&gt;Typical symptom when it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Symptom captured&lt;/td&gt;
&lt;td&gt;The exact command, the name or IP typed, the client and target, their domain or workgroup, the tool, the network path, and which other targets work&lt;/td&gt;
&lt;td&gt;"Remoting is broken on FS02" with no client, no command, and no note that RDP works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Error read&lt;/td&gt;
&lt;td&gt;The full message is copied and classified as no answer, refused, timeout, name resolution, or authentication&lt;/td&gt;
&lt;td&gt;Every remoting error treated as the same problem and fixed with TrustedHosts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Name and path&lt;/td&gt;
&lt;td&gt;The name resolves to the target's current address, and TCP 5985 (or 5986) answers from this client&lt;/td&gt;
&lt;td&gt;A stale A record, a second NIC registered in DNS, or a network firewall between sites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. WinRM answers&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Test-WSMan&lt;/code&gt; returns the identity response from this client&lt;/td&gt;
&lt;td&gt;Port open but no WS-Management answer, or a different service on the port&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Service and listener&lt;/td&gt;
&lt;td&gt;WinRM is Running, a listener exists for the transport you use, and ListeningOn lists the target's addresses&lt;/td&gt;
&lt;td&gt;Service disabled on a client OS; a policy listener with an empty IPv4 filter; a changed port&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Firewall and profile&lt;/td&gt;
&lt;td&gt;The WinRM inbound rule is enabled for the profile the NIC is actually in, with a remote address scope that includes this client&lt;/td&gt;
&lt;td&gt;NIC in Public, rule scoped to Local subnet, or a policy that disabled the rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Proxy&lt;/td&gt;
&lt;td&gt;No WinHTTP or session proxy sends WinRM traffic somewhere it shouldn't go&lt;/td&gt;
&lt;td&gt;A machine-wide WinHTTP proxy left from a deployment tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Authentication&lt;/td&gt;
&lt;td&gt;Once it connects, the account and method work: Kerberos by name, or NTLM by IP with TrustedHosts or HTTPS and explicit credentials&lt;/td&gt;
&lt;td&gt;Error changes to "cannot process the request" and someone sets TrustedHosts to &lt;code&gt;*&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Change&lt;/td&gt;
&lt;td&gt;One link fixed on the right side (client or target), with the reason written down&lt;/td&gt;
&lt;td&gt;Enable-PSRemoting, TrustedHosts &lt;code&gt;*&lt;/code&gt;, firewall Any, and a proxy reset all in one go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Proof&lt;/td&gt;
&lt;td&gt;The same command from the same client works, and still works after a reboot and a policy refresh&lt;/td&gt;
&lt;td&gt;Works today, fails after the next reboot when the profile drops to Public again&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1: Capture the symptom (read-only)
&lt;/h2&gt;

&lt;p&gt;Write these on the ticket first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The exact command and what was typed for the computer name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Short name, FQDN, and IP address take different authentication paths, and the error text names which one failed (Steps 2 and 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The client it ran from, and the target&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Most fixes are on one side only: TrustedHosts and proxy are on the client; the service, listener, firewall rule, and profile are on the target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Domain, trusted domain, workgroup, or Microsoft Entra-only on each side&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kerberos works only by name inside a domain or across a trust; everything else is NTLM and needs HTTPS or TrustedHosts (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The tool: PowerShell, Windows Admin Center, Server Manager, Hyper-V Manager, or a monitoring product&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;They all use WinRM, but each wraps the error in its own text; Server Manager and WAC have their own documented checks (Step 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The network path: same subnet, another site, VPN, or another VLAN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Public-profile rule allows only the local subnet, so "works from the server next to it, fails from the jump box" is a clue (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What else works from the same client to the same target&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RDP, ping, SMB, or &lt;code&gt;Invoke-Command&lt;/code&gt; to a neighbor narrow it to the WinRM port, rule, or service on this target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What changed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A new server build, an in-place upgrade, a NIC or VLAN change, a new GPO, a security baseline, or a deployment tool that set a proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then branch on what you see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it usually means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;em&gt;WinRM cannot complete the operation&lt;/em&gt; to one target only&lt;/td&gt;
&lt;td&gt;The path, the listener, the firewall rule, or the profile on that target&lt;/td&gt;
&lt;td&gt;Steps 3 to 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The same error from one client to every target&lt;/td&gt;
&lt;td&gt;Something on the client: a proxy, DNS, or an outbound firewall&lt;/td&gt;
&lt;td&gt;Steps 3 and 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It works from the same subnet but not from another&lt;/td&gt;
&lt;td&gt;The Public-profile rule scoped to the local subnet, or a network firewall&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It works by FQDN but not by IP address&lt;/td&gt;
&lt;td&gt;Not a reachability problem at all; IP means NTLM, which needs TrustedHosts or HTTPS&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The connection to the remote host was refused"&lt;/td&gt;
&lt;td&gt;Something answered and refused; usually no listener on that port&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The WinRM client cannot process the request" or "WinRM cannot process the request"&lt;/td&gt;
&lt;td&gt;The connection worked and authentication failed&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Access is denied"&lt;/td&gt;
&lt;td&gt;The account isn't allowed on the endpoint, or the shell isn't elevated for local WSMan changes&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It started after an in-place upgrade or a client OS rebuild&lt;/td&gt;
&lt;td&gt;Client versions of Windows have the WinRM service disabled by default; a reset profile or trusted hosts list&lt;/td&gt;
&lt;td&gt;Steps 5 and 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server Manager shows the target as not accessible&lt;/td&gt;
&lt;td&gt;Microsoft's table puts this error under "Target computer not accessible" network connection errors&lt;/td&gt;
&lt;td&gt;Steps 3 and 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hyper-V Manager can't connect to a remote host&lt;/td&gt;
&lt;td&gt;Microsoft's Hyper-V page: "To manage remote Hyper-V hosts, enable remote management on both the local computer and the remote host."&lt;/td&gt;
&lt;td&gt;Steps 5 and 6 on the host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Admin Center can reach some servers but not others&lt;/td&gt;
&lt;td&gt;Microsoft's WAC page: test &lt;code&gt;Enter-PSSession&lt;/code&gt; from the gateway itself&lt;/td&gt;
&lt;td&gt;Steps 3 to 6 from the gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2: Read the whole error (read-only)
&lt;/h2&gt;

&lt;p&gt;Copy the full text, including the part after the first sentence. In PowerShell, the last error holds it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: the full text of the last remoting error, and its error ID&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="bp"&gt;$Error&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Exception&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="bp"&gt;$Error&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FullyQualifiedErrorId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then match it against Microsoft's messages. They look alike and they point at different links:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Microsoft's message (excerpt)&lt;/th&gt;
&lt;th&gt;Where Microsoft lists it&lt;/th&gt;
&lt;th&gt;What it tells you (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Windows Remote Management (WinRM) cannot complete the operation. Verify that the specified computer name is valid, that the computer is accessible over the network, and that a firewall exception for the Windows Remote Management service is enabled and allows access from this computer."&lt;/td&gt;
&lt;td&gt;Server Manager troubleshooting guide, "Target computer not accessible"&lt;/td&gt;
&lt;td&gt;No WS-Management answer came back; name, path, firewall rule, profile, or listener (Steps 3 to 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The connection to the remote host was refused. Verify that the WS-Management service is running on the remote host and configured to listen for requests on the correct port and HTTP URL."&lt;/td&gt;
&lt;td&gt;about_Remote_Troubleshooting, enable remoting sections&lt;/td&gt;
&lt;td&gt;The host answered and refused; usually no listener on that port, or remoting disabled (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The client cannot connect to the destination specified in the request. Verify that the service on the destination is running and is accepting requests."&lt;/td&gt;
&lt;td&gt;about_Remote_Troubleshooting, proxy and firewall policy sections&lt;/td&gt;
&lt;td&gt;A proxy in the way, or a policy-made listener with no addresses (Steps 5 and 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The WinRM client cannot process the request because the server name cannot be resolved."&lt;/td&gt;
&lt;td&gt;Server Manager troubleshooting guide, name resolution error&lt;/td&gt;
&lt;td&gt;DNS on the client can't find that name (Step 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The WS-Management service cannot complete the operation within the time specified in OperationTimeout."&lt;/td&gt;
&lt;td&gt;about_Remote_Troubleshooting, timeout errors&lt;/td&gt;
&lt;td&gt;The session connected and a command ran too long; not a connection problem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The WinRM client cannot process the request. If the authentication scheme is different from Kerberos, or if the client computer is not joined to a domain, then HTTPS transport must be used or the destination machine must be added to the TrustedHosts configuration setting."&lt;/td&gt;
&lt;td&gt;about_Remote_Troubleshooting, IP address and workgroup sections&lt;/td&gt;
&lt;td&gt;Connected; NTLM was needed and neither HTTPS nor TrustedHosts was set (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Default authentication may be used with an IP address under the following conditions: the transport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided."&lt;/td&gt;
&lt;td&gt;Server Manager troubleshooting guide, Default authentication error&lt;/td&gt;
&lt;td&gt;Connected by IP; same fix as the row above, plus &lt;code&gt;-Credential&lt;/code&gt; (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"WinRM cannot process the request. The following error with errorcode 0x80090322 occurred while using Kerberos authentication: An unknown security error occurred."&lt;/td&gt;
&lt;td&gt;Server Manager troubleshooting guide, Kerberos security error&lt;/td&gt;
&lt;td&gt;Connected; Kerberos failed, often an SPN or a name that points at another account (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The I/O operation has been aborted because of either a thread exit or an application request."&lt;/td&gt;
&lt;td&gt;about_Remote_Troubleshooting, operation failure&lt;/td&gt;
&lt;td&gt;WinRM stopped or restarted while the command ran; Microsoft's fix is to start the service and retry&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two details matter when you compare with forum posts. First, the text PowerShell prints usually says &lt;em&gt;WinRM&lt;/em&gt; where Microsoft's Server Manager copy says &lt;em&gt;Windows Remote Management (WinRM)&lt;/em&gt;, and &lt;em&gt;the WinRM service&lt;/em&gt; where it says &lt;em&gt;the Windows Remote Management service&lt;/em&gt;; read it as the same no-answer case (our reading). Second, Microsoft's Server Manager table lists the same no-answer text for workgroup targets where TrustedHosts was already set, and gives the cause as "a subnet timeout error occurs if the user has not changed the default subnet restrictions for computers in workgroups". That's the firewall scope (Step 6), not authentication: adding the server to TrustedHosts a second time won't change it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Does the name resolve, and does the port answer? (read-only)
&lt;/h2&gt;

&lt;p&gt;Run these from the client that fails, by the same name the failing command used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only, on the client: what the name resolves to from here&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FS02.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;A_AAAA&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the client: name resolution, route, and TCP 5985 (WinRM over HTTP) in one test&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FS02.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;5985&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-InformationLevel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Detailed&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the client: TCP 5986 (WinRM over HTTPS), if the command uses -UseSSL&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FS02.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;5986&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, on the target's console or an RDP session (remoting to it is the thing that's broken), read the addresses it actually has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only, on the target: its IPv4 addresses, to compare with what DNS returned on the client&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetIPAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AddressFamily&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPv4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InterfaceAlias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PrefixLength&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ports are Microsoft's defaults: "PowerShell Remoting with WinRM listens on the following ports" HTTP 5985 and HTTPS 5986, and the Invoke-Command reference adds "The default ports are 5985 (WinRM port for HTTP) and 5986 (WinRM port for HTTPS)." Older guidance with port 80 and 443 is from before WinRM 2.0; Microsoft's HTTPS article: "On earlier versions of Windows, WinRM HTTP uses port 80 and WinRM HTTPS uses port 443."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DNS returns an address the target doesn't have&lt;/td&gt;
&lt;td&gt;A stale record, a second adapter registered in DNS, or the wrong zone; the client is knocking on another box. Fix DNS before anything else&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The name doesn't resolve at all&lt;/td&gt;
&lt;td&gt;Microsoft's "The WinRM client cannot process the request because the server name cannot be resolved." case, or a short name with no matching DNS suffix on this client; try the FQDN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;TcpTestSucceeded : True&lt;/code&gt; on 5985&lt;/td&gt;
&lt;td&gt;The path and something listening on the port are fine from this client; go to Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;TcpTestSucceeded&lt;/code&gt; False, and the same test from a server in the target's own subnet is True&lt;/td&gt;
&lt;td&gt;The target's rule allows only the local subnet (the Public profile case), or a network firewall between the subnets blocks 5985 (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;TcpTestSucceeded&lt;/code&gt; False from everywhere, RDP to the target works&lt;/td&gt;
&lt;td&gt;Nothing is listening on 5985, or the host firewall drops it for every source (Steps 5 and 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ping fails but TCP succeeds&lt;/td&gt;
&lt;td&gt;ICMP is blocked; ignore ping and trust the TCP result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5985 fails, 5986 succeeds&lt;/td&gt;
&lt;td&gt;The target only has an HTTPS listener; use &lt;code&gt;-UseSSL&lt;/code&gt; or add an HTTP listener deliberately (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If the path fails only from one site or VPN, check the network firewall between them for TCP 5985 before you touch the server. Microsoft's Server Manager guide gives the same first suspect for this message: "The network connecting the client and server is offline, or there is a problem with the target server's connection to the network."&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Does WinRM itself answer? (read-only)
&lt;/h2&gt;

&lt;p&gt;An open port isn't proof that WinRM is behind it. &lt;code&gt;Test-WSMan&lt;/code&gt; asks WinRM directly. Microsoft: it "submits an identification request that determines whether the WinRM service is running on a local or remote computer."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only, on the client: anonymous identify request to the default port&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-WSMan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FS02.contoso.com&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the client: the same request with authentication (also returns the OS version)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-WSMan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FS02.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Authentication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Default&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the client: over HTTPS, if the target has an HTTPS listener&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-WSMan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FS02.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseSSL&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft explains why the first one is useful: "If you do not specify the Authentication parameter, the Test-WSMan request is sent to the remote computer anonymously, without using authentication." So the two forms split the problem:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Anonymous &lt;code&gt;Test-WSMan&lt;/code&gt; fails with the same "cannot complete the operation" text&lt;/td&gt;
&lt;td&gt;WinRM isn't reachable from here; Steps 5 and 6 on the target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anonymous works, &lt;code&gt;-Authentication Default&lt;/code&gt; fails&lt;/td&gt;
&lt;td&gt;Reachability is fine; it's an authentication problem (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both work, &lt;code&gt;Enter-PSSession&lt;/code&gt; still fails&lt;/td&gt;
&lt;td&gt;The session endpoint, permissions, or a session proxy option; Steps 5, 7, and 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Test-WSMan&lt;/code&gt; by FQDN works, by IP address fails&lt;/td&gt;
&lt;td&gt;IP means NTLM; see Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;-UseSSL&lt;/code&gt; fails with a certificate error&lt;/td&gt;
&lt;td&gt;The HTTPS listener exists; its certificate doesn't match the name or isn't trusted (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For Windows Admin Center, run the same tests from the gateway, not from your browser's machine: it's the gateway that opens the WinRM session. Microsoft's WAC page says a failed &lt;code&gt;Enter-PSSession&lt;/code&gt; from the gateway "might relate to WinRM issues, network connectivity problems, or authorization issues."&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: On the target, is the service running and is there a listener? (read-only)
&lt;/h2&gt;

&lt;p&gt;Read these on the target, from its console or RDP, in an elevated PowerShell window. Microsoft: "You must have administrative rights to view or change settings for the local computer in the WSMan: drive."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only, on the target: the WinRM service and its startup type&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WinRM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartType&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the target: the listeners, in Microsoft's form&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;winrm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;enumerate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;winrm/config/listener&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the target: the same listeners through PowerShell, with Source and ListeningOn&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WSManInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;winrm/config/listener&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Enumerate&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the target: the service settings (auth methods, IPv4Filter, IPv6Filter, ports)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;winrm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;winrm/config&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the target: does WinRM answer locally, before the network is involved?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-WSMan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;localhost&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the target: the session endpoints and who may use them&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-PSSessionConfiguration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Permission&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's defaults to compare with: "On server versions of Windows, the WinRM service startup type is Automatic. However, on client versions of Windows, the WinRM service is disabled by default." And remoting is on by default on servers: "Windows Server 2012 and newer releases of Windows Server are enabled for PowerShell remoting by default." So a Windows Server target without a listener had it removed or never got the default, usually by policy, an image, or a hardening script (our reading).&lt;/p&gt;

&lt;p&gt;Read the listener output against Microsoft's listener properties:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Microsoft's default or description&lt;/th&gt;
&lt;th&gt;What to look for (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;td&gt;"The value must be either HTTP or HTTPS. The default is HTTP."&lt;/td&gt;
&lt;td&gt;The transport your command uses exists; &lt;code&gt;-UseSSL&lt;/code&gt; needs an HTTPS listener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Port&lt;/td&gt;
&lt;td&gt;"WinRM 2.0: The default HTTP port is 5985."&lt;/td&gt;
&lt;td&gt;Anything else needs &lt;code&gt;-Port&lt;/code&gt; on the client; Server Manager can't use a changed port&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Address&lt;/td&gt;
&lt;td&gt;"Specifies the address for which this listener is being created."&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;*&lt;/code&gt; for all addresses, or the right one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enabled&lt;/td&gt;
&lt;td&gt;"The default value is True."&lt;/td&gt;
&lt;td&gt;False means it exists and does nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source&lt;/td&gt;
&lt;td&gt;Microsoft's policy example shows &lt;code&gt;Source : GPO&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A policy owns it; local edits won't stick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ListeningOn&lt;/td&gt;
&lt;td&gt;"Specifies the IPv4 and IPv6 addresses that the listener uses."&lt;/td&gt;
&lt;td&gt;Empty means it listens on nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The empty ListeningOn case is Microsoft's own example. When the listener policy is misconfigured: "A configuration error in the policy results in an empty value for the ListeningOn property." The fix is in the policy: Microsoft's remoting help says "Enable the policy and specify the IPv4 and IPv6 filters." Its remoting help names the policy Allow automatic configuration of listeners, under Computer Configuration\Administrative Templates\Windows Components\Windows Remote Management (WinRM)\WinRM service; Microsoft's Server Manager page names the setting in that folder "Allow remote server management through WinRM". Read both names as the same listener policy when you look for it in your GPOs (our reading).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WinRM Stopped or Disabled&lt;/td&gt;
&lt;td&gt;Nothing to answer; on a client OS that's the default, on a server something disabled it (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No listener at all&lt;/td&gt;
&lt;td&gt;Remoting was never enabled or was removed; &lt;code&gt;Test-WSMan -ComputerName localhost&lt;/code&gt; fails too (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Listener &lt;code&gt;Source : GPO&lt;/code&gt;, &lt;code&gt;ListeningOn : {}&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Microsoft's policy misconfiguration case: the IPv4 or IPv6 filter in the listener policy is blank or excludes the target's addresses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Listener on a port other than 5985 or 5986&lt;/td&gt;
&lt;td&gt;Microsoft: "If the default authentication mechanism or the WinRM listener port number on a remote server has been changed from default settings, Server Manager cannot communicate with the remote server."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Test-WSMan -ComputerName localhost&lt;/code&gt; works, remote fails&lt;/td&gt;
&lt;td&gt;The service and listener are fine; it's the firewall rule, profile, or path (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;winrm e winrm/config/listener&lt;/code&gt; fails locally with error 0x80338012&lt;/td&gt;
&lt;td&gt;Microsoft's local-functionality case: "This problem may occur if the Window Remote Management service and its listener functionality are broken." (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoints without your group in Permission&lt;/td&gt;
&lt;td&gt;Remote sessions will fail with Access is denied after the connection works; Microsoft: connect with "a user account that's a member of the Administrators or Remote Management Users group on the remote computer"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two listeners on the same port with different addresses&lt;/td&gt;
&lt;td&gt;Microsoft: "If two listener services with different IP addresses are configured with the same port number and computer name, then WinRM listens or receives messages on only one address."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 6: Is the firewall rule on, for the right profile and scope? (read-only)
&lt;/h2&gt;

&lt;p&gt;This is the step that matches the second half of the message, "By default, the WinRM firewall exception for public profiles limits access to remote computers within the same local subnet." Read the profile first, then the rules, on the target:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only, on the target: the network category of each connected adapter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetConnectionProfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InterfaceAlias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NetworkCategory&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the target: the WinRM inbound rules, whether they're on, for which profile, and the action&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'WINRM*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Action&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the target: the remote address scope of each WinRM rule&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'WINRM*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallAddressFilter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Rule'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RemoteAddress&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the target: the local port on each WinRM rule&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'WINRM*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallPortFilter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalPort&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the target: the rules group policy delivers (the RSOP store), which local edits can't override&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-PolicyStore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RSOP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterScript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DisplayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*Remote Management*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Action&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's rule names come from the Enable-PSRemoting and remoting help pages: &lt;code&gt;WINRM-HTTP-In-TCP&lt;/code&gt; and &lt;code&gt;WINRM-HTTP-In-TCP-NoScope&lt;/code&gt; in its client example, and &lt;code&gt;WINRM-HTTP-In-TCP-PUBLIC&lt;/code&gt; for the Public rule on servers. The display name you'll see in the console is "Windows Remote Management (HTTP-In)". Microsoft also warns: "The name of the firewall rule can be different for different versions of Windows." That's why the read above uses a wildcard.&lt;/p&gt;

&lt;p&gt;What Microsoft says the defaults are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Microsoft's text&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Servers, private and domain networks&lt;/td&gt;
&lt;td&gt;"the Enable-PSRemoting cmdlet creates firewall rules that allow unrestricted remote access."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Servers, public networks&lt;/td&gt;
&lt;td&gt;"It also creates a firewall rule for public networks that allows remote access only from computers in the same local subnet."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clients, public networks&lt;/td&gt;
&lt;td&gt;"By default, it fails on public networks, but if you use the SkipNetworkProfileCheck parameter, Enable-PSRemoting succeeds and creates a firewall rule that allows traffic from the same local subnet."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Any Windows&lt;/td&gt;
&lt;td&gt;"On public networks, the default Windows Firewall rule allows PowerShell Remoting connections only from within the same subnet."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;winrm quickconfig&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"The command winrm quickconfig creates a firewall exception only for the current user profile."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A domain-joined server's adapter shows NetworkCategory Public&lt;/td&gt;
&lt;td&gt;Domain detection failed on that adapter (no DC reachable when the network was identified, wrong DNS, or a second adapter); the Public rule's local-subnet scope now applies to everyone else&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NetworkCategory DomainAuthenticated, the Domain rule enabled and Allow&lt;/td&gt;
&lt;td&gt;The host firewall isn't the block for domain traffic; look at the path (Step 3) or a third-party firewall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The WinRM rule for the active profile is disabled or missing&lt;/td&gt;
&lt;td&gt;Something removed or disabled it; check RSOP first, then the local rule (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RemoteAddress &lt;code&gt;LocalSubnet&lt;/code&gt; on the rule for the active profile&lt;/td&gt;
&lt;td&gt;Exactly the "same local subnet" restriction in the message; clients in other subnets get no answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The rule exists in RSOP disabled, or the policy blocks local rules&lt;/td&gt;
&lt;td&gt;A GPO owns it; a local &lt;code&gt;Enable-PSRemoting&lt;/code&gt; or &lt;code&gt;Set-NetFirewallRule&lt;/code&gt; won't stick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LocalPort isn't 5985&lt;/td&gt;
&lt;td&gt;Someone moved the listener or the rule; they must match each other and the client's &lt;code&gt;-Port&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On the policy side, Microsoft names two settings. The Windows Firewall: Allow local port exceptions policy decides whether local rules apply at all: "This policy allows members of the Administrators group to create a firewall exception for the Windows Remote Management (WinRM) service." And for Server Manager's version of this message, Microsoft's advice is the same read: "Try verifying that Windows Firewall exceptions have been enabled on the target server for Windows Remote Management (WinRM) inbound rules."&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Is a proxy in the path? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft: "Because PowerShell remoting uses the HTTP protocol, it is affected by HTTP proxy settings." Read the machine-wide WinHTTP setting and any session option on the client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only, on the client: the WinHTTP advanced proxy setting (Microsoft's current form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;netsh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;winhttp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;show&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;advproxy&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the client: the older form, deprecated but still present on many builds&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;netsh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;winhttp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;show&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the client: a session option set in this session or in a profile script&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$PSSessionOption&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's proxy notes for WinRM: "By default, WinHTTP is not configured to use a proxy server." and, for WinRM 1.1 and earlier, "the WinRM client relies on the Windows HTTP services (WinHTTP) proxy configuration." On the session side, New-PSSessionOption's ProxyAccessType accepts IEConfig, WinHttpConfig, AutoDetect, NoProxyServer, and None, and "The default value is None."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WinHTTP shows direct access, &lt;code&gt;$PSSessionOption&lt;/code&gt; empty&lt;/td&gt;
&lt;td&gt;No proxy on this client; move on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A WinHTTP proxy with no bypass for internal names&lt;/td&gt;
&lt;td&gt;Left by a deployment, update, or security tool; WinRM traffic to internal servers may go to the proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;$PSSessionOption&lt;/code&gt; set with ProxyAccessType in a profile script&lt;/td&gt;
&lt;td&gt;Every remoting command in that session inherits it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The error is "The client cannot connect to the destination specified in the request." rather than "cannot complete the operation"&lt;/td&gt;
&lt;td&gt;Microsoft lists that text under its proxy section; this is the more likely step for it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft's proxy page is also clear about HTTP through a proxy: "If the proxy server requires authentication, the WinRM clients and servers must use HTTPS." A design that sends WinRM to internal servers through an authenticating proxy over HTTP is the problem, not a setting (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: When it connects, does the error change to authentication? (read-only)
&lt;/h2&gt;

&lt;p&gt;Often, fixing the profile or the rule turns "cannot complete the operation" into one of the "cannot process the request" messages. That's progress: the connection works and the authentication path is now the question. Microsoft's rules for which path you get:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;How you connect&lt;/th&gt;
&lt;th&gt;What Microsoft says happens&lt;/th&gt;
&lt;th&gt;What it needs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;By computer name, inside a domain or across a trust&lt;/td&gt;
&lt;td&gt;"When a client connects to a domain server using its computer name, the default authentication protocol is Kerberos."&lt;/td&gt;
&lt;td&gt;A working SPN for the name you typed; no TrustedHosts needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;By IP address&lt;/td&gt;
&lt;td&gt;"Kerberos authentication doesn't support IP addresses. When you specify an IP address, NTLM authentication is used."&lt;/td&gt;
&lt;td&gt;"Configure the computer for HTTPS transport or add the IP addresses of the remote computers to the TrustedHosts list on the local computer." and &lt;code&gt;-Credential&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;From or to a workgroup computer&lt;/td&gt;
&lt;td&gt;"When the local computer isn't in a domain, you must meet the following requirements"&lt;/td&gt;
&lt;td&gt;HTTPS or TrustedHosts, "Verify that a password is set on the workgroup-based computer.", and &lt;code&gt;-Credential&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Between Microsoft Entra-only joined machines&lt;/td&gt;
&lt;td&gt;"WinRM considers the Microsoft Entra-only joined machines as workgroup machines."&lt;/td&gt;
&lt;td&gt;Microsoft's TrustedHosts and SPN prefix fix (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On the IP and workgroup rows, Microsoft adds: "Use the Credential parameter in all remote commands. This is required even when you connect as the current user." The Invoke-Command reference says the same: "To use an IP address in the value of ComputerName, the command must include the Credential parameter."&lt;/p&gt;

&lt;p&gt;Read what the client already trusts, and the SPNs behind the name you typed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only, on the client: the current TrustedHosts list&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WSMan:\localhost\Client\TrustedHosts&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, any domain-joined machine: which account holds the HTTP SPN for the target's names&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;setspn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Q&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HTTP/FS02.contoso.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;setspn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Q&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HTTP/FS02&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: the SPNs registered on the target's computer account&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;setspn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-L&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FS02&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the client: request a ticket for the target's HTTP SPN, to see the Kerberos error directly&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;klist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HTTP/FS02.contoso.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WinRM's Kerberos SPN is HTTP/ plus the name. Microsoft's New-PSSessionOption reference explains the classic conflict: the IncludePortInSPN option "Includes the port number in the Service Principal Name (SPN) used for Kerberos authentication", and it exists because "For example, an IIS application that allows for Kerberos authentication can require the default SPN to be registered to a user account that differs from the computer account." If &lt;code&gt;setspn -Q HTTP/FS02.contoso.com&lt;/code&gt; returns a service account instead of the FS02 computer account, that's your Kerberos failure (our reading of Microsoft's text).&lt;/p&gt;

&lt;p&gt;Read the authentication errors against Microsoft's Server Manager table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Microsoft's message (excerpt)&lt;/th&gt;
&lt;th&gt;Microsoft's cause (excerpt)&lt;/th&gt;
&lt;th&gt;Next (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"error with errorcode 0x80090322 occurred while using Kerberos authentication: An unknown security error occurred."&lt;/td&gt;
&lt;td&gt;One listed cause: "The Service Principal Name (SPN) for the remote computer name and port does not exist."&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;setspn -Q&lt;/code&gt; reads above; the SPN side of &lt;a href="https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak"&gt;The Target Principal Name Is Incorrect&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"error with errorcode 0x80090311 occurred while using Kerberos authentication: There are currently no logon servers available to service the logon request."&lt;/td&gt;
&lt;td&gt;"Client is in a domain, but the domain controller for the client computer is not accessible."&lt;/td&gt;
&lt;td&gt;The client's own DC path, not the target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The following error occurred while using Kerberos authentication: Cannot find the computer"&lt;/td&gt;
&lt;td&gt;Workgroup target by name, an untrusted domain, or a misspelled domain name&lt;/td&gt;
&lt;td&gt;Explicit credentials and TrustedHosts for the workgroup case; fix the name for the typo case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Default authentication may be used with an IP address under the following conditions"&lt;/td&gt;
&lt;td&gt;Connecting by IP without TrustedHosts or HTTPS&lt;/td&gt;
&lt;td&gt;Connect by name, or meet the IP conditions deliberately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"If the authentication scheme is different from Kerberos, or if the client computer is not joined to a domain, then HTTPS transport must be used or the destination machine must be added to the TrustedHosts configuration setting."&lt;/td&gt;
&lt;td&gt;Workgroup or non-Kerberos connection&lt;/td&gt;
&lt;td&gt;HTTPS, or a specific TrustedHosts entry (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two cases look like remoting failures and aren't this one. First, Access is denied after the session opens: the account isn't in Administrators or Remote Management Users on the target, or the endpoint's Permission excludes it (Step 5). Second, the second hop: "Access to the resource on ServerC is denied, because the credentials you used to create the PowerShell Remoting session aren't passed from ServerB to ServerC." That's delegation, and Microsoft's second-hop page lists the options in order of preference, starting with CredSSP and resource-based Kerberos constrained delegation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: Change one link (a change)
&lt;/h2&gt;

&lt;p&gt;Fix the link the reads pointed at, on the side it's on, and nothing else. Write down the before value for each.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service stopped or disabled (target).&lt;/strong&gt; Set it back to Microsoft's server default and start it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change, on the target: WinRM to Automatic and running&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WinRM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-StartupType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Automatic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WinRM&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a policy or baseline set it to Disabled, fix it there, or the next refresh puts it back (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No listener, missing rules, or default endpoints removed (target).&lt;/strong&gt; Enable-PSRemoting puts back Microsoft's defaults. What it does, per Microsoft: it runs Set-WSManQuickConfig, which "Starts the WinRM service.", "Sets the startup type on the WinRM service to Automatic.", "Creates a listener to accept requests on any IP address.", and "Enables a firewall exception for WS-Management communications.", then sets up and enables the session configurations and restarts WinRM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change, on the target only, in an elevated Windows PowerShell window: restore the remoting defaults&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Enable-PSRemoting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it only on the target that needs it. Microsoft: "Because the configuration starts listeners, it's prudent to run it only where it's needed." Run it in Windows PowerShell if you manage Windows PowerShell endpoints; Microsoft warns that in PowerShell 7 it "only affects endpoints created with PowerShell version 6 and greater". &lt;code&gt;-SkipNetworkProfileCheck&lt;/code&gt; does nothing on a server: Microsoft says it "has no effect on server versions of Windows, that by default, have a local subnet firewall rule for public networks."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Listener functionality broken (target, error 0x80338012 on local &lt;code&gt;winrm&lt;/code&gt; commands).&lt;/strong&gt; Microsoft's two steps, in order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;winrm invoke Restore winrm/Config
winrm quickconfig
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Policy listener with an empty filter (GPO).&lt;/strong&gt; Edit the listener policy in the GPO that applies to the target and fill in the IPv4 and IPv6 filters (Microsoft: "Wildcards ( *) are permitted."), or narrow them to the address ranges the servers use. Then read &lt;code&gt;Get-WSManInstance winrm/config/listener -Enumerate&lt;/code&gt; again after the next policy refresh: ListeningOn should list the server's addresses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adapter in the Public profile on a domain server (target).&lt;/strong&gt; Fix why domain detection failed: DNS servers on that adapter, a DC reachable from that adapter's network, a second adapter that shouldn't be registering. Microsoft's Set-NetConnectionProfile can change Public to Private but not to Domain: "You cannot set the DomainAuthenticated type by using this cmdlet. The server automatically sets the value of DomainAuthenticated when the network is authenticated to a domain controller." For an adapter that truly isn't on a domain network (a backup or storage VLAN with no DC), Microsoft's form is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change, on the target: mark one non-domain adapter Private (not a fix for a domain adapter that should be DomainAuthenticated)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-NetConnectionProfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-InterfaceAlias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Ethernet 2'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NetworkCategory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Private&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rule scoped to the local subnet, and the clients really live elsewhere (target or GPO).&lt;/strong&gt; Microsoft's example opens the Public rule to everywhere: &lt;code&gt;Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP-PUBLIC' -RemoteAddress Any&lt;/code&gt;. Read its warning first: "The firewall rule for public networks is meant to protect the computer from potentially malicious external connection attempts. Use caution when removing this rule." We'd add only the management subnet instead (our form):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change, on the target: keep the local subnet and add only the admin or jump-box subnet to the Public WinRM rule&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'WINRM-HTTP-In-TCP-PUBLIC'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RemoteAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalSubnet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10.50.0.0/24&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the rule comes from a GPO, change it in the GPO; a local edit won't win.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proxy in the path (client).&lt;/strong&gt; If the WinHTTP proxy isn't needed on that machine, Microsoft's reset is &lt;code&gt;netsh winhttp reset proxy&lt;/code&gt;, which "Resets the WinHTTP proxy setting to DIRECT." If something else on the box needs it, leave it and bypass the proxy for remoting only (our form):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change, for this session only, on the client: no proxy for this remoting connection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$so&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-PSSessionOption&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ProxyAccessType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NoProxyServer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Enter-PSSession&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FS02.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-SessionOption&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$so&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;IP address or workgroup target (client).&lt;/strong&gt; Prefer connecting by name with Kerberos. If you must use NTLM, prefer HTTPS on the target; otherwise add the one host, not &lt;code&gt;*&lt;/code&gt;. Microsoft: "The value that you set for the TrustedHosts item affects all users of the computer." Save the current value, then add to it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read first, on the client: keep the current value somewhere you can restore it from&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$curValue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WSMan:\localhost\Client\TrustedHosts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$curValue&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Change, on the client: append one host to the existing list (Microsoft's -Concatenate form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WSMan:\localhost\Client\TrustedHosts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.20.30.40'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Concatenate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Microsoft Entra-only joined machines, Microsoft's documented fix is a TrustedHosts value plus the client SPN prefix change: "To resolve this issue, set the default SPN prefix to HOST by running the following command". Apply that only to the Entra-only case it was written for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTPS instead of TrustedHosts (target).&lt;/strong&gt; Microsoft: "WinRM HTTPS requires a local computer Server Authentication certificate with a CN matching the hostname to be installed. The certificate mustn't be expired, revoked, or self-signed." With the certificate in place, run &lt;code&gt;winrm quickconfig -transport:https&lt;/code&gt; on the target, open TCP 5986 ("Open port 5986 for HTTPS transport to work."), and connect with &lt;code&gt;-UseSSL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPN on the wrong account (domain).&lt;/strong&gt; If HTTP/FS02 is registered to a service account for a web app, either move that app to its own name, or use &lt;code&gt;New-PSSessionOption -IncludePortInSPN&lt;/code&gt; for remoting so the client asks for HTTP/FS02:5985. Moving SPNs breaks the other service if you get it wrong; &lt;a href="https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak"&gt;The Target Principal Name Is Incorrect&lt;/a&gt; covers reading SPNs before changing them. Microsoft's &lt;code&gt;setspn&lt;/code&gt; note: "you should use setspn -S instead because it verifies that there are no duplicate SPNs."&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 10: Prove it from the same client (read-only, and again after a reboot)
&lt;/h2&gt;

&lt;p&gt;Run the same reads from the client that failed, by the name users type, then again after the target reboots and after the next policy refresh. A profile that drops to Public at boot, or a GPO that turns the rule back off, only shows up then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only, on the client: the path, the WinRM answer, and a real remote command&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FS02.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;5985&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-WSMan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FS02.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Authentication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Default&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Invoke-Command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FS02.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ScriptBlock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$PSVersionTable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PSVersion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the client: TrustedHosts holds only what you meant to add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WSMan:\localhost\Client\TrustedHosts&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only, on the target after a reboot: still the right profile, rule, and listener&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetConnectionProfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InterfaceAlias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NetworkCategory&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'WINRM*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Action&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WSManInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;winrm/config/listener&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Enumerate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the tool was Windows Admin Center, run the &lt;code&gt;Invoke-Command&lt;/code&gt; from the gateway; if it was Server Manager, refresh the server in the pool and read its Manageability column.&lt;/p&gt;

&lt;p&gt;Pass criteria (our reading): &lt;code&gt;TcpTestSucceeded&lt;/code&gt; True on the port you use from every client subnet that needs it; &lt;code&gt;Test-WSMan -Authentication Default&lt;/code&gt; returns the product version; &lt;code&gt;Invoke-Command&lt;/code&gt; by the FQDN users type returns output without &lt;code&gt;-Credential&lt;/code&gt; inside the domain; the adapter is DomainAuthenticated (or deliberately Private for a non-domain network) after a reboot; the WinRM rule for that profile is enabled with a scope you chose; ListeningOn lists the server's addresses; TrustedHosts is empty or holds specific entries with a written reason; and the original command works from the original client.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common false starts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;False start&lt;/th&gt;
&lt;th&gt;Why it doesn't help (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setting TrustedHosts to &lt;code&gt;*&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;It doesn't change reachability, and Microsoft: "The computers in the trusted hosts list aren't authenticated." It affects every user on the client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adding the server to TrustedHosts again&lt;/td&gt;
&lt;td&gt;Microsoft's workgroup rows with TrustedHosts already set still fail on the subnet restriction; the fix is the rule scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running &lt;code&gt;Enable-PSRemoting -SkipNetworkProfileCheck&lt;/code&gt; on a server&lt;/td&gt;
&lt;td&gt;Microsoft: the parameter "has no effect on server versions of Windows"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opening the Public rule to Any on every server&lt;/td&gt;
&lt;td&gt;Microsoft's warning: the rule "is meant to protect the computer from potentially malicious external connection attempts." Fix the profile, or add one subnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running &lt;code&gt;winrm quickconfig&lt;/code&gt; and assuming every profile is covered&lt;/td&gt;
&lt;td&gt;Microsoft: it "creates a firewall exception only for the current user profile."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restarting the WinRM service on the client&lt;/td&gt;
&lt;td&gt;The client doesn't need a listener; the missing answer is on the target or the path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Editing a local rule or listener that a GPO owns&lt;/td&gt;
&lt;td&gt;The next policy refresh puts the GPO's version back; read RSOP and &lt;code&gt;Source : GPO&lt;/code&gt; first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Treating ping as the test&lt;/td&gt;
&lt;td&gt;ICMP and TCP 5985 are filtered separately; &lt;code&gt;Test-NetConnection -Port 5985&lt;/code&gt; is the test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switching to an IP address to get around a DNS problem&lt;/td&gt;
&lt;td&gt;That moves you from Kerberos to NTLM and into the TrustedHosts case; fix the name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disabling the Windows Firewall to test&lt;/td&gt;
&lt;td&gt;It hides which rule or profile was wrong, and someone forgets to turn it back on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setting LocalAccountTokenFilterPolicy for a reachability error&lt;/td&gt;
&lt;td&gt;Microsoft: it "disables user account control (UAC) remote restrictions for all users of all affected computers." It's for local-admin access, not for "cannot complete"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When a change is justified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WinRM disabled on the target&lt;/td&gt;
&lt;td&gt;Automatic and Running, and fix the policy or baseline that disabled it&lt;/td&gt;
&lt;td&gt;Starting it by hand on every reboot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No listener or missing default rules&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Enable-PSRemoting -Force&lt;/code&gt; on that target only&lt;/td&gt;
&lt;td&gt;Running it on every machine in the estate just in case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Policy listener with ListeningOn empty&lt;/td&gt;
&lt;td&gt;Fill in the listener policy's IPv4 and IPv6 filters in the GPO&lt;/td&gt;
&lt;td&gt;Local &lt;code&gt;winrm&lt;/code&gt; edits the GPO overwrites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain server in the Public profile&lt;/td&gt;
&lt;td&gt;Fix domain detection (DNS, DC path, extra adapter)&lt;/td&gt;
&lt;td&gt;Opening the Public rule to Any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Admins in another subnet blocked by the local-subnet scope&lt;/td&gt;
&lt;td&gt;Add the management subnet to the rule scope, in the GPO if it's policy-managed&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;-RemoteAddress Any&lt;/code&gt; on every server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network firewall between sites drops 5985&lt;/td&gt;
&lt;td&gt;A rule for 5985 (or 5986) from the admin subnets to the servers&lt;/td&gt;
&lt;td&gt;Moving admins onto the server subnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WinHTTP proxy left by a tool&lt;/td&gt;
&lt;td&gt;Reset it if nothing needs it, or &lt;code&gt;-ProxyAccessType NoProxyServer&lt;/code&gt; for remoting&lt;/td&gt;
&lt;td&gt;Leaving it and routing WinRM through the proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workgroup, Entra-only, or IP-only targets&lt;/td&gt;
&lt;td&gt;HTTPS listener with a proper certificate, or a specific TrustedHosts entry&lt;/td&gt;
&lt;td&gt;TrustedHosts &lt;code&gt;*&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP SPN registered to a service account&lt;/td&gt;
&lt;td&gt;Move the app's name, or &lt;code&gt;-IncludePortInSPN&lt;/code&gt; for remoting&lt;/td&gt;
&lt;td&gt;Deleting the SPN without reading who uses it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does "WinRM cannot complete the operation" mean?&lt;/strong&gt;&lt;br&gt;
The client sent a WS-Management request to that name and port and got no usable answer. Microsoft's text names the checks: "Verify that the specified computer name is valid, that the computer is accessible over the network, and that a firewall exception for the Windows Remote Management service is enabled and allows access from this computer." It's reachability, not authentication; the authentication errors say "cannot process the request" instead (Steps 2 to 6).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What port does WinRM use?&lt;/strong&gt;&lt;br&gt;
TCP 5985 for HTTP and TCP 5986 for HTTPS. Microsoft: "Starting in WinRM 2.0, the default listener ports configured by Winrm quickconfig are port 5985 for HTTP transport, and port 5986 for HTTPS." Older Windows used 80 and 443 (Step 3).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I fix "the WinRM firewall exception for public profiles limits access to remote computers within the same local subnet"?&lt;/strong&gt;&lt;br&gt;
Read the target's network profile first. On a domain server, Public usually means domain detection failed on that adapter; fix that and the Domain rule applies. If clients in another subnet really need access on a Public network, add their subnet to the Public WinRM rule rather than opening it to Any (Steps 6 and 9).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I set TrustedHosts to * to fix WinRM?&lt;/strong&gt;&lt;br&gt;
No. TrustedHosts is for NTLM connections by IP address or to workgroup machines, and Microsoft describes it as the list of hosts "for which you wish to suppress the error generated by being unable to verify the server's identity." It doesn't fix a firewall, profile, or listener problem. When you need it, add specific hosts with &lt;code&gt;-Concatenate&lt;/code&gt;, or use HTTPS (Steps 8 and 9).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does Enter-PSSession work by name but not by IP address?&lt;/strong&gt;&lt;br&gt;
By name inside a domain, remoting uses Kerberos. Microsoft: "Kerberos authentication doesn't support IP addresses. When you specify an IP address, NTLM authentication is used." NTLM needs HTTPS or a TrustedHosts entry on the client, plus &lt;code&gt;-Credential&lt;/code&gt; (Step 8).&lt;/p&gt;




&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak"&gt;The Target Principal Name Is Incorrect&lt;/a&gt; (when the error turns into a Kerberos or SPN failure once the connection works)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/hyper-v-live-migration-failed-event-21502-a-read-first-switch-processor-version-and-kerberos-181f"&gt;Hyper-V Live Migration Failed (Event 21502)&lt;/a&gt; (when remoting fails between Hyper-V hosts during migration or remote host management)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt; (when the same firewall, profile, or NIC also blocks RPC between the same servers)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free checklist
&lt;/h2&gt;

&lt;p&gt;Setting TrustedHosts to &lt;code&gt;*&lt;/code&gt; on every admin box, or opening the Public WinRM rule to Any on every server, before anyone read which link dropped the request, is a change made everywhere at once. So is a Conditional Access policy enforced before anyone read the report-only results. The free &lt;strong&gt;Conditional Access pre-enforcement checklist&lt;/strong&gt; keeps break-glass accounts, pilot groups, and report-only review on one page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=winrm-cannot-complete-the-operation" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=winrm-cannot-complete-the-operation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the &lt;strong&gt;Intune &amp;amp; M365 Admin Starter Pack&lt;/strong&gt; pairs with this triage: &lt;a href="https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=winrm-cannot-complete-the-operation" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=winrm-cannot-complete-the-operation&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Admin Pack Studio; not affiliated with Microsoft. Steps 1-8 and 10 are read-only checks: &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;Get-NetIPAddress&lt;/code&gt;, &lt;code&gt;Test-WSMan&lt;/code&gt;, &lt;code&gt;Get-Service&lt;/code&gt;, &lt;code&gt;winrm enumerate&lt;/code&gt;, &lt;code&gt;winrm get&lt;/code&gt;, &lt;code&gt;Get-WSManInstance&lt;/code&gt;, &lt;code&gt;Get-PSSessionConfiguration&lt;/code&gt;, &lt;code&gt;Get-NetConnectionProfile&lt;/code&gt;, &lt;code&gt;Get-NetFirewallRule&lt;/code&gt;, &lt;code&gt;Get-NetFirewallAddressFilter&lt;/code&gt;, &lt;code&gt;Get-NetFirewallPortFilter&lt;/code&gt;, &lt;code&gt;netsh winhttp show advproxy&lt;/code&gt;, &lt;code&gt;netsh winhttp show proxy&lt;/code&gt;, &lt;code&gt;Get-Item&lt;/code&gt; on the WSMan: drive, &lt;code&gt;setspn -Q&lt;/code&gt;, &lt;code&gt;setspn -L&lt;/code&gt;, &lt;code&gt;klist get&lt;/code&gt;, and &lt;code&gt;Invoke-Command&lt;/code&gt; with a read-only script block. Setting the WinRM service startup type, starting it, running &lt;code&gt;Enable-PSRemoting&lt;/code&gt;, &lt;code&gt;winrm invoke Restore&lt;/code&gt;, or &lt;code&gt;winrm quickconfig&lt;/code&gt;, changing listener policy, network profiles, firewall rule scope, the WinHTTP proxy, TrustedHosts, HTTPS listeners and certificates, the SPN prefix, or SPNs are deliberate changes. Change one link at a time, prove it from the same client after a reboot, and check current Microsoft Learn for version-specific behavior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windowsserver</category>
      <category>powershell</category>
      <category>sysadmin</category>
      <category>networking</category>
    </item>
    <item>
      <title>Failover Cluster Event ID 1135 (Node Removed from Active Membership): A Read-First Heartbeat, Network, and Threshold Triage</title>
      <dc:creator>AdminPackStudio</dc:creator>
      <pubDate>Mon, 19 Oct 2026 16:46:03 +0000</pubDate>
      <link>https://dev.to/adminpackstudio/failover-cluster-event-id-1135-node-removed-from-active-membership-a-read-first-heartbeat-4n43</link>
      <guid>https://dev.to/adminpackstudio/failover-cluster-event-id-1135-node-removed-from-active-membership-a-read-first-heartbeat-4n43</guid>
      <description>&lt;p&gt;Helpdesk: "Overnight, during the backup window, HV02 dropped out of the Hyper-V cluster for about a minute. The System log on HV01 and HV03 has Event 1135: 'Cluster node 'HV02' was removed from the active failover cluster membership.' A few VMs restarted on other hosts. It happened last Tuesday too. A forum post says to raise SameSubnetThreshold to the maximum so it stops. Can we do that?"&lt;/p&gt;

&lt;p&gt;Not yet. &lt;strong&gt;Event 1135 isn't a diagnosis. It's the cluster telling you the other nodes stopped hearing a node's heartbeats on every route for longer than the threshold allows, or that its Cluster service stopped. The cause is usually below the cluster: a NIC, a driver, a team or virtual switch, a physical or virtual switch, a firewall or IPsec policy change, a network profile flip, packet loss under load, or real latency between sites.&lt;/strong&gt; Microsoft's event text says as much: the node "was removed from the active failover cluster membership. The Cluster service on this node may have stopped. This could also be due to the node having lost communication with other active nodes in the failover cluster." It's just as plain about the forum fix: "Increasing these values to their maximum might make the event and node removal go away, it just masks the problem. It doesn't fix anything." Work through it as a chain: &lt;strong&gt;which node, which nodes logged it, and when&lt;/strong&gt; → &lt;strong&gt;which neighbor events came with it?&lt;/strong&gt; → &lt;strong&gt;is the node up, isolated, or quarantined, and was the Cluster service running?&lt;/strong&gt; → &lt;strong&gt;which cluster networks carry heartbeats, and are there two?&lt;/strong&gt; → &lt;strong&gt;what are the heartbeat values on this cluster, really?&lt;/strong&gt; → &lt;strong&gt;what does the cluster log say about routes at that second?&lt;/strong&gt; → &lt;strong&gt;what did the NIC, driver, team, and switch see?&lt;/strong&gt; → &lt;strong&gt;did a firewall, IPsec, profile, or antivirus change block it?&lt;/strong&gt; → &lt;strong&gt;change one link&lt;/strong&gt; → &lt;strong&gt;prove it stays quiet.&lt;/strong&gt; &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;Get-ClusterNode&lt;/code&gt;, &lt;code&gt;Get-ClusterNetwork&lt;/code&gt;, &lt;code&gt;Get-ClusterNetworkInterface&lt;/code&gt;, &lt;code&gt;Get-Cluster&lt;/code&gt;, &lt;code&gt;Get-ClusterLog&lt;/code&gt;, &lt;code&gt;Get-NetAdapter&lt;/code&gt;, &lt;code&gt;Get-NetAdapterStatistics&lt;/code&gt;, &lt;code&gt;Get-Counter&lt;/code&gt;, &lt;code&gt;Get-NetConnectionProfile&lt;/code&gt;, &lt;code&gt;Get-NetFirewallRule&lt;/code&gt;, and &lt;code&gt;Test-Cluster&lt;/code&gt; are the sources for that chain. Raise the thresholds "to be safe" and the next hard failure takes longer to detect, while the dropped packets that caused this one are still dropping.&lt;/p&gt;

&lt;p&gt;If the 1135s line up with live migrations, &lt;a href="https://dev.to/adminpackstudio/hyper-v-live-migration-failed-event-21502-a-read-first-switch-processor-version-and-kerberos-181f"&gt;Hyper-V Live Migration Failed (Event 21502)&lt;/a&gt; covers the migration network and virtual switch side. If they line up with the backup window and checkpoints fail too, &lt;a href="https://dev.to/adminpackstudio/hyper-v-checkpoint-operation-failed-a-read-first-vss-storage-permissions-and-orphaned-avhdx-5ep"&gt;Hyper-V Checkpoint Operation Failed&lt;/a&gt; covers the VSS and storage side. This post covers &lt;strong&gt;"a Windows Server failover cluster (Hyper-V, SQL Server, file server, or any other role) that logs FailoverClustering Event 1135 (cluster node was removed from the active failover cluster membership), with or without 1177 quorum loss, 1069 resource failures, VMs restarting or going unmonitored, or a node that ends up isolated or quarantined, and you need a read-first path before you raise heartbeat thresholds, evict the node, or rebuild networking."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read 1135 on every node, not one.&lt;/strong&gt; Microsoft: "This event is logged on all nodes in the Cluster except for the node that was removed." Which nodes logged which names tells you whether one node, one site link, or the whole network was the problem (Steps 1 and 2).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A node is removed only when all its routes are down.&lt;/strong&gt; Microsoft's heartbeat article: "If all routes are marked down for W2K8-R2-NODE2, it's removed from active failover cluster membership and the Event 1135 that you see in the first section is logged." One working cluster network keeps a node in; that's why you want two (Step 4).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heartbeats are UDP 3343.&lt;/strong&gt; Microsoft: "IPv6 is the default protocol that Failover Clustering will use for its heartbeats. The heartbeat itself is a UDP unicast network packet that communicates over Port 3343." Anything that drops, delays, or blocks that traffic for long enough removes the node (Steps 7 and 8).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the thresholds before you change them.&lt;/strong&gt; Defaults differ by Windows Server version and by Microsoft page, so &lt;code&gt;Get-Cluster | Format-List *subnet*&lt;/code&gt; is the only number that counts for your cluster (Step 5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The cluster log has the route history.&lt;/strong&gt; &lt;code&gt;Get-ClusterLog -TimeSpan&lt;/code&gt; with &lt;code&gt;-UseLocalTime&lt;/code&gt; shows which route was marked down and when; by default its timestamps are GMT (Step 6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raising thresholds is a trade, not a fix.&lt;/strong&gt; Microsoft: "cranking up the thresholds to high values does not fix nor resolve the transient network issue, it simply masks the problem by making health monitoring less sensitive." (Steps 5 and 9).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where in the chain did it break?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What should be true&lt;/th&gt;
&lt;th&gt;Typical symptom when it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Symptom captured&lt;/td&gt;
&lt;td&gt;Which node was removed, which nodes logged it, the exact times, the cluster's role and platform, and what was running at that moment&lt;/td&gt;
&lt;td&gt;"HV02 keeps falling out of the cluster" with no times and no list of which node logged what&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Event read&lt;/td&gt;
&lt;td&gt;Every 1135 on every node is collected, with 1006, 1069, 1127, 1129, 1130, 1177, 1592, 1554, and the isolation and quarantine events around it&lt;/td&gt;
&lt;td&gt;One node's System log read; the pattern across nodes never seen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Node state&lt;/td&gt;
&lt;td&gt;You know whether the node is Up, Down, Paused, isolated, or quarantined, and whether its Cluster service stopped or the network went quiet&lt;/td&gt;
&lt;td&gt;A quarantined node that "won't rejoin" treated as a new fault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Cluster networks&lt;/td&gt;
&lt;td&gt;At least two networks allow cluster communication, each is Up on every node, and you know which carries cluster, live migration, and client traffic&lt;/td&gt;
&lt;td&gt;One network for everything; a network partitioned or down on one node; live migration on the heartbeat network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Heartbeat values&lt;/td&gt;
&lt;td&gt;The delay, threshold, and route history values on this cluster are read, not assumed&lt;/td&gt;
&lt;td&gt;A forum's defaults quoted for the wrong Windows version; thresholds already at the maximum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Cluster log&lt;/td&gt;
&lt;td&gt;The route-down lines for the time of the 1135 are found in local time&lt;/td&gt;
&lt;td&gt;System log in local time compared with a cluster log in GMT, an hour or more apart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. NIC and switch&lt;/td&gt;
&lt;td&gt;Drivers, firmware, teaming, virtual switch, and receive buffers are known, and discarded packets are counted&lt;/td&gt;
&lt;td&gt;Old NIC drivers; VMXNET3 buffers at defaults; discards climbing under backup load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Firewall and policy&lt;/td&gt;
&lt;td&gt;UDP 3343 is allowed, the network profile stays Domain, IPsec refreshes and antivirus filters are accounted for&lt;/td&gt;
&lt;td&gt;A profile flip to Public, an IPsec policy refresh, or a new filter driver at the time of the 1135&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Change&lt;/td&gt;
&lt;td&gt;One link fixed, with the node drained first if you touch it&lt;/td&gt;
&lt;td&gt;Drivers, thresholds, teaming, and firewall all changed in one maintenance window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Proof&lt;/td&gt;
&lt;td&gt;No new 1135 through the same load window, routes stay up in the cluster log, and validation is clean&lt;/td&gt;
&lt;td&gt;Quiet for a week until the next backup or patch night&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1: Capture the symptom (read-only)
&lt;/h2&gt;

&lt;p&gt;Write these on the ticket first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which node was removed, and which nodes logged 1135 for it&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microsoft's three scenarios are told apart only by comparing every node's events (Step 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The exact time of each 1135, to the second&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You'll match it to the cluster log, the NIC driver events, and the network profile log (Steps 6 to 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The cluster's role and platform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hyper-V hosts, guest clusters on VMware, SQL Server in Azure IaaS, and stretched clusters each have their own usual cause (Steps 5 and 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sites and subnets&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same-subnet and cross-subnet heartbeats use different values, and a site link failure looks like Microsoft's Scenario B (Steps 2 and 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What was running at that moment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Backups, live migrations, patching, a switch or firewall change, a Group Policy refresh, an antivirus update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;How often, and since when&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Once after a switch reboot is a different case from every night at 01:00, and both differ from three times in an hour (quarantine, Step 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then branch on what you see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it usually means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Every other node logged 1135 for the same node&lt;/td&gt;
&lt;td&gt;Microsoft's Scenario A: "This quite suggests that at the time of issue, either due to network congestion or otherwise the communication to the NODE A was lost."&lt;/td&gt;
&lt;td&gt;Steps 7 and 8 on that node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nodes in one site logged 1135 for the nodes in the other site, and the other way round&lt;/td&gt;
&lt;td&gt;Microsoft's Scenario B: "it is indicative that there was a communication failure, over the link that connects these sites."&lt;/td&gt;
&lt;td&gt;Steps 4 and 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Each node logged a different set of names&lt;/td&gt;
&lt;td&gt;Microsoft's Scenario C: "Such events are possible when the network channels between the nodes are choked and the cluster communication messages are not reaching in a timely manner"&lt;/td&gt;
&lt;td&gt;Steps 4, 6, and 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1135 lines up with backups or live migrations&lt;/td&gt;
&lt;td&gt;Load on a shared network or host; heartbeats delayed or dropped while it runs&lt;/td&gt;
&lt;td&gt;Steps 4 and 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1135 lines up with a Group Policy refresh or a firewall change&lt;/td&gt;
&lt;td&gt;Microsoft names IPsec policy refreshes and profile changes among the causes&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The removed node's own log shows its Cluster service stopped or crashed first&lt;/td&gt;
&lt;td&gt;The node didn't lose the network; the service went away&lt;/td&gt;
&lt;td&gt;Step 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1177 on the remaining nodes as well&lt;/td&gt;
&lt;td&gt;Quorum was lost, so the whole cluster stopped, not only one node&lt;/td&gt;
&lt;td&gt;Steps 2 and 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The node is quarantined and won't rejoin&lt;/td&gt;
&lt;td&gt;It left the cluster too many times in an hour; that's a result of 1135, not a new fault&lt;/td&gt;
&lt;td&gt;Steps 3 and 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guest cluster on VMware&lt;/td&gt;
&lt;td&gt;Microsoft's VMware article: VMXNET3 dropping inbound packets&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster nodes in Azure IaaS&lt;/td&gt;
&lt;td&gt;Microsoft's Azure thresholds article: the defaults "don't consider the possibility of induced latency caused by a multitenant environment"&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2: Read the events on every node (read-only)
&lt;/h2&gt;

&lt;p&gt;1135 is in the &lt;strong&gt;System&lt;/strong&gt; log, from the &lt;strong&gt;FailoverClustering&lt;/strong&gt; source. Microsoft's guidance is to collect them all: "Review the Event ID 1135 that you're seeing on the nodes and copy all the instances of this event." Read every node in one pass, with the events that usually come with it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: FailoverClustering events of interest on every node, last 7 days, oldest first&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$ids&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1006&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1069&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1127&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1129&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1130&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1135&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1146&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1177&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1554&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1592&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1653&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1672&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1673&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1681&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$since&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddDays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;-7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'System'&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;ProviderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Microsoft-Windows-FailoverClustering'&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ids&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$since&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'LoggedOn'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Wrap&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then build the who-logged-what grid (our form): one row per 1135, with the node that logged it and the node named in the message. If every row names the same node, it's Scenario A; if the names split by site, B; if they're scattered, C.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: which node logged 1135 for which node, last 7 days&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'System'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1135&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'LoggedOn'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Removed'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-split&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"'"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the result against Microsoft's text for each event:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Symbolic name&lt;/th&gt;
&lt;th&gt;Microsoft's message (excerpt)&lt;/th&gt;
&lt;th&gt;What it tells you (our reading)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1135&lt;/td&gt;
&lt;td&gt;EVENT_NODE_DOWN&lt;/td&gt;
&lt;td&gt;"was removed from the active failover cluster membership. The Cluster service on this node may have stopped. This could also be due to the node having lost communication with other active nodes in the failover cluster."&lt;/td&gt;
&lt;td&gt;The node lost all routes, or its service stopped; the rest of this post&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1127&lt;/td&gt;
&lt;td&gt;TM_EVENT_CLUSTER_NETINTERFACE_FAILED&lt;/td&gt;
&lt;td&gt;"Cluster network interface '%1' for cluster node '%2' on network '%3' failed."&lt;/td&gt;
&lt;td&gt;One adapter on one node failed; the start of a route loss (Steps 4 and 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1129&lt;/td&gt;
&lt;td&gt;TM_EVENT_CLUSTER_NETWORK_PARTITIONED&lt;/td&gt;
&lt;td&gt;"Some attached failover cluster nodes cannot communicate with each other over the network."&lt;/td&gt;
&lt;td&gt;One cluster network is split; others may still be carrying heartbeats (Step 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1130&lt;/td&gt;
&lt;td&gt;TM_EVENT_CLUSTER_NETWORK_DOWN&lt;/td&gt;
&lt;td&gt;"None of the available nodes can communicate using this network."&lt;/td&gt;
&lt;td&gt;A whole cluster network is down; a switch or VLAN, not a node (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1592&lt;/td&gt;
&lt;td&gt;CLUSSVC_TCP_RECONNECT_CONNECTION_REESTABLISHED&lt;/td&gt;
&lt;td&gt;"Network communication was reestablished. This could be due to communication temporarily being blocked by a firewall or connection security policy update."&lt;/td&gt;
&lt;td&gt;A short break that recovered; look for the same cause as the 1135 (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1006&lt;/td&gt;
&lt;td&gt;NM_EVENT_MEMBERSHIP_HALT&lt;/td&gt;
&lt;td&gt;"Cluster service was halted due to incomplete connectivity with other cluster nodes."&lt;/td&gt;
&lt;td&gt;The node's own side: its service halted on connectivity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1554&lt;/td&gt;
&lt;td&gt;SERVICE_NETWORK_CONNECTIVITY_LOST&lt;/td&gt;
&lt;td&gt;"This cluster node has lost all network connectivity. It cannot participate in the cluster until connectivity is restored."&lt;/td&gt;
&lt;td&gt;The node lost every network, not only the heartbeat path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1177&lt;/td&gt;
&lt;td&gt;MM_EVENT_ARBITRATION_FAILED&lt;/td&gt;
&lt;td&gt;"The Cluster service is shutting down because quorum was lost."&lt;/td&gt;
&lt;td&gt;Enough nodes or the witness were lost that the cluster stopped (Step 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1069&lt;/td&gt;
&lt;td&gt;RCM_RESOURCE_FAILURE&lt;/td&gt;
&lt;td&gt;"Cluster resource '%1' in clustered role '%2' failed."&lt;/td&gt;
&lt;td&gt;A consequence: a resource failed during or after the removal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1146&lt;/td&gt;
&lt;td&gt;RCM_EVENT_RESMON_DIED&lt;/td&gt;
&lt;td&gt;"The cluster Resource Hosting Subsystem (RHS) process was terminated and will be restarted."&lt;/td&gt;
&lt;td&gt;Resource health detection, not the network; read which resource&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1653&lt;/td&gt;
&lt;td&gt;SERVICE_NO_CONNECTIVITY&lt;/td&gt;
&lt;td&gt;"failed to join the cluster because it could not communicate over the network with any other node in the cluster."&lt;/td&gt;
&lt;td&gt;The node tried to come back and still can't reach anyone (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1673&lt;/td&gt;
&lt;td&gt;CLUSTER_NODE_ENTERED_ISOLATED_STATE&lt;/td&gt;
&lt;td&gt;"Cluster node '%1' has entered the isolated state."&lt;/td&gt;
&lt;td&gt;Windows Server 2016 and later: the node left membership but still hosts its VMs (Step 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1681&lt;/td&gt;
&lt;td&gt;CLUSTER_GROUPS_UNMONITORED_ON_NODE&lt;/td&gt;
&lt;td&gt;"Virtual machines on node '%1' have entered an unmonitored state."&lt;/td&gt;
&lt;td&gt;VMs kept running on the isolated node, unmonitored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1672&lt;/td&gt;
&lt;td&gt;EVENT_NODE_QUARANTINED&lt;/td&gt;
&lt;td&gt;"Cluster node '%1' has been quarantined."&lt;/td&gt;
&lt;td&gt;It left too often; it stays out until the quarantine expires or you clear it (Steps 3 and 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two details matter when you compare with forum posts. First, read the removed node's own System log for the same minute: Microsoft's heartbeat article says that on the removed node "the Cluster Service is terminated and then restarted so it can try to rejoin the Cluster", so service stop and start events there are expected after the 1135, not before it. A service that stopped &lt;em&gt;before&lt;/em&gt; the others logged 1135 is a different case (Step 3). Second, Microsoft's 1135 article lists the companion events it expects: 1069 for resources, "Event ID 1177 for Quorum loss", and "Event ID 1006 for Cluster service halted". If 1177 is in the list, the whole cluster went down, and that changes the urgency.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Is the node up, isolated, or quarantined? (read-only)
&lt;/h2&gt;

&lt;p&gt;Read node state and the Cluster service before you read the network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: name, id, and state of each node&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNode&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: the Cluster service on every node&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Invoke-Command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ScriptBlock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ClusSvc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PSComputerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartType&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: Microsoft's check that the cluster answers (Windows Server 2012 and later)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: isolation and quarantine settings on this cluster&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Quarantine&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Resiliency&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's 1135 article checks the service early: "Is the cluster service continuously running and available on all the nodes?" Its firewall section gives the service name, "System service name: ClusSvc".&lt;/p&gt;

&lt;p&gt;On Windows Server 2016 and later, a node that loses membership on a cluster with VMs may not go straight to Down. Microsoft's VM compute resiliency article describes two states:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Microsoft's description&lt;/th&gt;
&lt;th&gt;What to do (our reading)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Isolated&lt;/td&gt;
&lt;td&gt;"The node is no longer in an active membership" and "The node continues to host the VM role"&lt;/td&gt;
&lt;td&gt;Read the network now; it may rejoin on its own&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Down after isolation&lt;/td&gt;
&lt;td&gt;"after a certain period (default of 4 minutes), the VM is failed over to a suitable node in the cluster, and the node is now moved to a Down state."&lt;/td&gt;
&lt;td&gt;The VMs moved; read why the node didn't come back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quarantined&lt;/td&gt;
&lt;td&gt;"The node is no longer allowed to join the cluster for a fixed time period (default: 2 hours)"&lt;/td&gt;
&lt;td&gt;Find the cause before you clear it (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft's numbers for quarantine: "By default, a node is quarantined, if it ungracefully leaves the cluster, three times within an hour", and "No more than 25% of nodes can be quarantined at any given time". The &lt;code&gt;Get-Cluster&lt;/code&gt; reference agrees: QuarantineThreshold "is set to 3 by default", and QuarantineDuration is "set to 7200 seconds or 2 hours by default". Microsoft also notes what isolation does to storage: for block storage (FC, FCoE, iSCSI, SAS) "The VM is placed in the Paused Critical state." while SMB-backed VMs keep running.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;All nodes Up now, ClusSvc Running everywhere&lt;/td&gt;
&lt;td&gt;It recovered; the evidence is in the logs, not the current state (Steps 6 to 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One node Down, ClusSvc Running on it&lt;/td&gt;
&lt;td&gt;It's trying to join and can't; look for 1653 or 1572 on it (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ClusSvc stopped first on the removed node, before the 1135 on the others&lt;/td&gt;
&lt;td&gt;A service or host problem, not a network drop; read that node's System and Application logs for the minute before&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node Paused&lt;/td&gt;
&lt;td&gt;Someone drained or paused it; that's not a 1135 cause&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node quarantined&lt;/td&gt;
&lt;td&gt;Event 1672 tells you until when; Microsoft's text gives the way out, "Start-ClusterNode -ClearQuarantine"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1177 on the survivors&lt;/td&gt;
&lt;td&gt;Quorum was lost; read the witness and node votes before anything else (&lt;code&gt;Get-ClusterQuorum&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For the quorum branch, read the configuration once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: quorum type and witness for the local cluster&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterQuorum&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's quorum guidance is short: "We recommend you always configure a witness if you're using Windows Server 2012 R2 and later." A two-node cluster with no witness that loses one node's heartbeats is the case where a single 1135 turns into an outage (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Which cluster networks carry heartbeats? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's heartbeat article explains why the number of networks matters: each node tracks every route to every other node, and "If other routes are still considered to be up, W2K8-R2-NODE2 will remain as an active member." A node is removed only when the last route goes. Read the networks, their roles, and their metrics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: cluster networks, their state, role, and metric&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNetwork&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Metric&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AutoMetric&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: every node's adapter on every cluster network, and its state&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNetworkInterface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Network&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the Role column against Microsoft's values for the network Role property:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Microsoft's name&lt;/th&gt;
&lt;th&gt;Microsoft's description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;ClusterNetworkRoleNone&lt;/td&gt;
&lt;td&gt;"The network is not used by the cluster."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;ClusterNetworkRoleInternalUse&lt;/td&gt;
&lt;td&gt;"The network is used to carry internal cluster communication."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;ClusterNetworkRoleInternalAndClient&lt;/td&gt;
&lt;td&gt;"The network is used to connect client systems and to carry internal cluster communication."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then read the metrics. Microsoft's Metric property: "the network path with the lowest sum of metrics will be used." Microsoft's network prioritization article explains what that means for traffic: the network with the lowest metric carries cluster and CSV traffic, and the second lowest carries live migration traffic. It also explains why live migration on the heartbeat network hurts: "During a live migration, large chunks of memory are copied from one server to another as quickly as possible." and "For this reason it is recommended to have a dedicated network for live migration traffic so that it does not interfere with other important network traffic."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Only one network with Role 1 or 3&lt;/td&gt;
&lt;td&gt;Every heartbeat route depends on one path; Microsoft's validation warns about this single point of failure (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two or more networks with Role 1 or 3, all Up&lt;/td&gt;
&lt;td&gt;Good; a 1135 then means every path failed at once, which points at something shared (a host, team, switch, or policy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A network Partitioned, or one node's interface Failed or Unreachable&lt;/td&gt;
&lt;td&gt;That's the route that went; read Step 7 on that node's adapter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A network Down on every node&lt;/td&gt;
&lt;td&gt;A switch, VLAN, or physical link; Event 1130 (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The live migration network has the lowest metric, or the same network carries cluster, live migration, and backup traffic&lt;/td&gt;
&lt;td&gt;Load on that network can delay heartbeats; compare 1135 times with migrations and backups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AutoMetric False on a network&lt;/td&gt;
&lt;td&gt;Someone set the metric by hand; read why before you change it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An iSCSI network with Role 1 or 3&lt;/td&gt;
&lt;td&gt;Microsoft's prioritization article recommends "Do not allow cluster network communication on this network" for storage traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft's validation page gives an alternative to separate networks: "you can connect your cluster nodes with one network that is constructed with teamed network adapters, redundant switches, redundant routers, or similar hardware that removes single points of failure." If that's your design, the team and the switches are what you read in Step 7.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: What are the heartbeat values on this cluster? (read-only)
&lt;/h2&gt;

&lt;p&gt;Two kinds of setting decide how long the cluster waits. Microsoft's definitions: Delay "defines the frequency at which cluster heartbeats are sent between nodes", and Threshold "defines the number of heartbeats, which are missed before the cluster takes recovery action." Read the values this cluster actually has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: Microsoft's form for the heartbeat values&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;subnet&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: the same, plus cross-site values (Windows Server 2016 and later) and route history&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SameSubnet&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CrossSubnet&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CrossSite&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RouteHistoryLength&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't compare them with a number from a forum. Microsoft's own pages give different defaults depending on the Windows Server version they describe:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Microsoft's property reference (minimum, maximum, default)&lt;/th&gt;
&lt;th&gt;Microsoft's tuning article (Windows Server 2012 R2, 2016, maximum)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SameSubnetDelay&lt;/td&gt;
&lt;td&gt;250, 2000, 1000 (milliseconds)&lt;/td&gt;
&lt;td&gt;1 second, 1 second, 2 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SameSubnetThreshold&lt;/td&gt;
&lt;td&gt;3, 120, 5&lt;/td&gt;
&lt;td&gt;5 heartbeats, 10 heartbeats, 120 heartbeats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrossSubnetDelay&lt;/td&gt;
&lt;td&gt;250, 4000, 1000 (milliseconds)&lt;/td&gt;
&lt;td&gt;1 second, 1 second, 4 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrossSubnetThreshold&lt;/td&gt;
&lt;td&gt;3, 120, 5&lt;/td&gt;
&lt;td&gt;5 heartbeats, 20 heartbeats, 120 heartbeats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrossSiteDelay&lt;/td&gt;
&lt;td&gt;(not on the reference pages fetched)&lt;/td&gt;
&lt;td&gt;NA, 1 second, 4 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrossSiteThreshold&lt;/td&gt;
&lt;td&gt;(not on the reference pages fetched)&lt;/td&gt;
&lt;td&gt;NA, 20 heartbeats, 120 heartbeats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RouteHistoryLength&lt;/td&gt;
&lt;td&gt;0, 40, 10&lt;/td&gt;
&lt;td&gt;"By default the RouteHistoryLength setting is set 10, which is two times the number of default thresholds."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The property reference pages list Windows Server 2012 as the minimum supported server. Microsoft's Azure IaaS article states the newer default: "By default, Windows Server sets the SameSubnetThreshold to 10 and SameSubnetDelay to 1000 ms." The tuning article adds a version trap: "If the Hyper-V role is installed on a Windows Server 2012 R2 Failover Cluster, the SameSubnetThreshold default will automatically be increased to 10 and the CrossSubnetThreshold default will automatically be increased to 20." Older Microsoft pages (the heartbeat article, whose examples use Windows Server 2008 R2 node names, and the Windows Server 2008 multi-site heartbeat page) still show thresholds of 5 with a range of 3 to 10. That's why the read above is the step that matters.&lt;/p&gt;

&lt;p&gt;Microsoft's own descriptions of each value:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Microsoft's description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SameSubnetDelay&lt;/td&gt;
&lt;td&gt;"Controls the delay, in milliseconds, between netft heartbeats. This property applies to routes on the same network subnet."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SameSubnetThreshold&lt;/td&gt;
&lt;td&gt;"Controls how many heartbeats can be missed on the same subnet before the route is declared as unreachable."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrossSubnetDelay&lt;/td&gt;
&lt;td&gt;"Controls the time interval, in milliseconds, that the cluster network driver waits between sending Cluster Service heartbeats across subnets."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrossSubnetThreshold&lt;/td&gt;
&lt;td&gt;"Controls how many Cluster Service heartbeats can be missed across subnets before it determines that Cluster Service has stopped responding."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RouteHistoryLength&lt;/td&gt;
&lt;td&gt;"The number of heartbeats to log after a cluster network failure."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then do the math (Microsoft's): "both the delay and threshold have a cumulative effect on the total health detection." Its example: a CrossSubnetDelay of 2 seconds with a CrossSubnetThreshold of 10 "means that the cluster can have a total network tolerance of 20 seconds before recovery action is taken." With the newer same-subnet defaults, the Azure article puts it as "if connectivity monitoring fails for 10 seconds, the failover Threshold is reached resulting in the unreachable that node being removed from cluster membership."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Thresholds at the defaults for your version&lt;/td&gt;
&lt;td&gt;Normal; the network lost heartbeats for longer than the default window, so find out why (Steps 6 to 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SameSubnetThreshold 5 on a cluster that should have 10&lt;/td&gt;
&lt;td&gt;An older default on a Windows Server 2012 R2 cluster; Microsoft's tuning article recommends the higher values for those versions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thresholds already high (for example 60 or 120)&lt;/td&gt;
&lt;td&gt;Someone already masked it once, and it still fails; the network problem is bigger than the last fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RouteHistoryLength 10 with raised thresholds&lt;/td&gt;
&lt;td&gt;Microsoft recommends RouteHistoryLength "to be twice the value" of the threshold, so the cluster log keeps enough history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A stretched cluster across sites or subnets&lt;/td&gt;
&lt;td&gt;Cross-subnet or cross-site values apply; Microsoft's only real case for raising them is "a multi-site scenario where nodes reside in different locations and network latency can't be overcome."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nodes in Azure IaaS&lt;/td&gt;
&lt;td&gt;Microsoft's Azure article recommends relaxed values there; read Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 6: What does the cluster log say? (read-only)
&lt;/h2&gt;

&lt;p&gt;The System log tells you a node was removed. The cluster log tells you which route went first and what the heartbeat counters looked like. Generate it for a window around the 1135, in local time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: from an empty working folder, a cluster log from every node for the last 120 minutes, local timestamps, copied here&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-TimeSpan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;120&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseLocalTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Destination&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's reference for the two switches that matter here: &lt;code&gt;-TimeSpan&lt;/code&gt; "Specifies the time span in minutes for which to generate the cluster log." and &lt;code&gt;-UseLocalTime&lt;/code&gt; "Specifies that the time stamp for each cluster log entry uses local time. By default, the timestamp uses Greenwich Mean Time (GMT)." If the 1135 was more than a couple of hours ago, raise &lt;code&gt;-TimeSpan&lt;/code&gt; to cover it; without &lt;code&gt;-Destination&lt;/code&gt;, Microsoft says the log is created "in the cluster reports folder C:\Windows\Cluster\Reports on each node of the cluster." With &lt;code&gt;-Destination .&lt;/code&gt;, Microsoft's example "creates a log file for each node of the local cluster, and copies all logs to the local folder."&lt;/p&gt;

&lt;p&gt;Then search the logs for the route lines Microsoft's Azure thresholds article shows in its example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: route-down, unreachable, route history, and quorum lines in every node's cluster log&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Select-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Pattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Marking Route'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'unreachable'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Route history'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Lost quorum'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LineNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Line&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's example log shows the sequence: "Signaled NetftRemoteUnreachable event", then "Marking Route from" one address "to" another "as down", then "All routes for route (virtual) local" and "are down", then "Route history" lines with "Heartbeats counter/threshold: 5/5", and finally, in that example, "Lost quorum". What to read (our reading):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you find&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Marking Route&lt;/code&gt; lines for one network only, and the node stayed in&lt;/td&gt;
&lt;td&gt;That network dropped heartbeats; the other one held. Read Step 7 for that network's adapters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Routes on every network marked down within the same second&lt;/td&gt;
&lt;td&gt;Something shared went: a host, team, virtual switch, upstream switch, or a policy refresh that blocked all traffic (Steps 7 and 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Route history" lines with counter/threshold at the limit, then the removal&lt;/td&gt;
&lt;td&gt;The threshold was reached; compare with the time of the backup, migration, or policy refresh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The remote address in the unreachable line is the same node every time&lt;/td&gt;
&lt;td&gt;That node's side (Scenario A)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Lost quorum"&lt;/td&gt;
&lt;td&gt;The survivors couldn't keep a majority; read Step 3's quorum branch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No route lines at all, but the node's service stopped&lt;/td&gt;
&lt;td&gt;Not a heartbeat loss; read that node's System and Application logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nothing near the time you expected&lt;/td&gt;
&lt;td&gt;The cluster log is GMT unless you used &lt;code&gt;-UseLocalTime&lt;/code&gt;, or &lt;code&gt;-TimeSpan&lt;/code&gt; didn't reach back far enough&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The route history depth is RouteHistoryLength from Step 5. If you plan to raise thresholds, raise that too, or the next log won't show enough of the heartbeats before the drop.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: What did the NIC, driver, team, and switch see? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's heartbeat article puts hardware first among the causes: "Actual network hardware failures. If the packet is lost on the wire somewhere between the nodes, then the heartbeats fail." Read the adapters on the node that was removed and on one that wasn't:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: adapters with Microsoft's Driver view (driver provider, version, and date)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetAdapter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-View&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Driver&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: all statistics for one adapter, including discards and errors&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetAdapterStatistics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Cluster1'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: Microsoft's discarded-packets counter, 12 samples 5 seconds apart, during the busy window&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Counter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Counter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'\Network Interface(*)\Packets Received Discarded'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-SampleInterval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxSamples&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;12&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's guidance on that counter: "if they are any value higher than zero, then the receive buffer needs to be adjusted up for the adapter." Its heartbeat article adds how to read it: "This counter is cumulative and only increases until the server is rebooted. Seeing a large number of packets dropped here could be a sign that the receive buffers on the network card are set too low or that the server is performing slowly and can't handle the inbound traffic." So take two readings across the backup or migration window and compare them, rather than reading one number once (our reading).&lt;/p&gt;

&lt;p&gt;Then read the team and virtual switch, if there is one, since a heartbeat route on a team or a virtual switch depends on both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: LBFO teams and their state&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetLbfoTeam&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: Hyper-V virtual switches, and Switch Embedded Teaming members if used&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMSwitch&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-VMSwitchTeam&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'SETswitch'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Old driver or firmware dates on the removed node, or different versions across nodes&lt;/td&gt;
&lt;td&gt;Microsoft: "Old or out-of-date network card drivers and/or firmware. At times, a simple misconfiguration of the network card or switch can also cause loss of heartbeats."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discarded packets climbing during the window&lt;/td&gt;
&lt;td&gt;Receive buffers too small or the host too busy; Microsoft says to use the manufacturer's recommended values&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The heartbeat network is a team, and a member flapped at the time of the 1135&lt;/td&gt;
&lt;td&gt;Microsoft: "If you have NIC teaming enabled on the heartbeat NIC, check Teaming software functionality as per teaming vendor's recommendation."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All cluster networks share one team or one virtual switch&lt;/td&gt;
&lt;td&gt;One failure takes every route; that matches routes marked down in the same second (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guest cluster on VMware with VMXNET3 adapters&lt;/td&gt;
&lt;td&gt;Microsoft's VMware article: "VMXNET3 adapters dropping inbound network packets because the inbound buffer is set too low to handle large amounts of traffic."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guest cluster on Hyper-V or VMware with old integration components or tools&lt;/td&gt;
&lt;td&gt;Microsoft lists "outdated NIC drivers\Integration Components (IC)\VmTools or faulty NIC adapters"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discards zero, drivers current, but latency high between sites&lt;/td&gt;
&lt;td&gt;Not packet loss; heartbeats arriving late. Microsoft: "The packets might not be lost between the nodes, but they might not get to the nodes fast enough before the timeout period expires."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For the VMware guest case, Microsoft's 1135 article gives the adapter settings it changes, in the guest's Device Manager under the vmxnet3 adapter's &lt;strong&gt;Advanced&lt;/strong&gt; tab: "Select Small Rx Buffers and increase the value. The default value is 512 and the maximum is 8192." and "Select Rx Ring #1 Size and increase the value. The default value is 1024 and the maximum is 4096." Read the current values first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: the vmxnet3 adapter's advanced properties (look for the Rx buffer and ring settings)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetAdapterAdvancedProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Ethernet0'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 8: Did a firewall, IPsec, profile, or antivirus change block it? (read-only)
&lt;/h2&gt;

&lt;p&gt;These are the causes that make a 1135 look random, because nothing is broken afterwards. Read each one for the minute of the event.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firewall and ports.&lt;/strong&gt; Microsoft's 1135 article lists what the cluster needs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Application&lt;/th&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Port (Microsoft's table)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cluster Service&lt;/td&gt;
&lt;td&gt;UDP&lt;/td&gt;
&lt;td&gt;3343&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster Service&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;3343 (This port is required during a node join operation.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RPC&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;135&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster Admin&lt;/td&gt;
&lt;td&gt;UDP&lt;/td&gt;
&lt;td&gt;137&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kerberos&lt;/td&gt;
&lt;td&gt;UDP/TCP&lt;/td&gt;
&lt;td&gt;464&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMB&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;445&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: Microsoft's check for the cluster heartbeat rule&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;netsh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;advfirewall&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;firewall&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;show&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Failover Clusters (UDP-In)"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: every rule in the Failover Clusters group, and whether it's enabled&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DisplayGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Failover Clusters'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: the IPv6 Neighbor Discovery rules Microsoft's heartbeat article names&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DisplayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Core Networking - Neighbor Discovery*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft ties IPv6 to the heartbeat directly: "IPv6 is the default protocol that Failover Clustering will use for its heartbeats." Its list of causes includes IPv6 enabled with "Core Networking - Neighbor Discovery Advertisement" and "Core Networking - Neighbor Discovery Solicitation" disabled, and "If there are switches, firewalls, or routers not configured properly to allow this traffic through, you can experience issues like this." Event 1572 on a joining node says the same in its own words: "Also verify the Windows Firewall 'Failover Clusters' rules." Microsoft also says the Cluster Network Driver adapter is placed for you: "In Windows Server 2012 and Windows Server 2012 R2, the Cluster Network Driver (NETFT.SYS) adapter is automatically placed at the bottom in the binding order list."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network profile.&lt;/strong&gt; Microsoft: "The profile for your network connections could possibly be bouncing from Domain to Public and back to Domain again. During the transition of these changes, network I/O can be blocked." The log is &lt;strong&gt;Applications and Services Logs\Microsoft\Windows\NetworkProfile\Operational&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: the current profile of each adapter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetConnectionProfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InterfaceAlias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NetworkCategory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: find the exact name of the NetworkProfile Operational log on this node&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$np&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ListLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*NetworkProfile*Operational'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: its events around the 1135 (set the window to your event time)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$np&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'2026-10-13 01:00'&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;EndTime&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'2026-10-13 01:15'&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;IPsec policy refresh.&lt;/strong&gt; Microsoft: "during an IPSec group policy update all IPsec Security Associations (SAs) are torn down by Windows Firewall with Advanced Security (WFAS). While this is happening, all network connectivity is blocked." If renegotiation waits on Active Directory, the block can outlast the threshold. A 1135 that lines up with the Group Policy refresh interval on nodes with connection security rules is this case until proven otherwise (our reading); Event 1592's text names the same thing: "communication temporarily being blocked by a firewall or connection security policy update."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antivirus.&lt;/strong&gt; Microsoft: "Anti-virus software could be interfering with this process also." Its 1135 article gives the exclusions it expects, and they're worth reading against your antivirus policy:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Microsoft's exclusion&lt;/th&gt;
&lt;th&gt;Applies to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"The path of the FileShare Witness"&lt;/td&gt;
&lt;td&gt;Clusters with a file share witness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The %Systemroot%\Cluster folder"&lt;/td&gt;
&lt;td&gt;Every node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Default virtual machine configuration directory (C:\ProgramData\Microsoft\Windows\Hyper-V)"&lt;/td&gt;
&lt;td&gt;Hyper-V hosts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Default virtual hard disk drive directory (C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks)"&lt;/td&gt;
&lt;td&gt;Hyper-V hosts, plus any custom VM, VHD, replica, and snapshot directories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vmwp.exe, as a process exclusion&lt;/td&gt;
&lt;td&gt;Hyper-V hosts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"exclude the CSV path C:\Clusterstorage and all its subdirectories"&lt;/td&gt;
&lt;td&gt;Clusters with Cluster Shared Volumes and live migration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft's caution about testing it: "Just disabling the antivirus software is insufficient in most cases. Even if you disable the antivirus software, the filter driver is still loaded when you restart the computer."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation.&lt;/strong&gt; Microsoft's 1135 article puts this early: "A validation and the network tests would be recommended as one of the initial troubleshooting steps to ensure there are no configuration issues that might be a cause for problems." Run only the network tests on a live cluster, and list the test names on your version first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: list the validation tests and categories on this version&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-Cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-List&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only for networking: run the network communication and firewall tests only, with a named report&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-Cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Validate Network Communication'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Validate Windows Firewall Configuration'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ReportName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Temp\cluster-network-validation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's descriptions of those two tests: "This test validates that tested servers can communicate with acceptable latency on all networks. The test also checks to see if there are redundant communication paths between all servers." and "This test validates that Windows Firewall is configured correctly for failover clustering on the tested servers." In the report, Microsoft's example latency failure reads "the ping latency is greater than the maximum allowed 2000 ms". Keep storage tests out of a run on a live cluster: Microsoft's &lt;code&gt;-Disk&lt;/code&gt; and &lt;code&gt;-Force&lt;/code&gt; notes describe disks taken offline for the duration of the storage tests.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: Change one link (a change)
&lt;/h2&gt;

&lt;p&gt;Fix only what Steps 2 to 8 showed, then read the result before changing anything else. If the change touches a node, drain it first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change: move this node's roles off gracefully before you touch its NICs, drivers, or switch ports&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Suspend-ClusterNode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Drain&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Wait&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# After the change and a read of Steps 4 and 7 on it: bring it back, with its roles moved back now&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resume-ClusterNode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Failback&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Immediate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's &lt;code&gt;-Drain&lt;/code&gt;: "Specifies that all of the workloads are gracefully moved to other nodes while maintaining the highest levels of availability and using the best placement logic." &lt;code&gt;-Failback&lt;/code&gt; takes NoFailBack, Immediate, or Policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drivers, firmware, and buffers (Step 7).&lt;/strong&gt; Update the NIC driver and firmware to the versions your server and NIC vendors recommend, on one drained node at a time, and raise receive buffers to the manufacturer's recommended values. For a VMware guest cluster, Microsoft's direction is to "gradually increase the number of buffers in the guest operating system and verify." Re-read the discard counter under the same load afterwards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network roles and metrics (Step 4).&lt;/strong&gt; Give the cluster a second path for heartbeats, and keep storage traffic off cluster communication. Microsoft's Role values: 1 for internal cluster communication, 3 for cluster and client, 0 for not used by the cluster. Microsoft's restriction: "If this network is the only one used for internal cluster communication, the Role property may not be changed to ClusterNetworkRoleNone or ClusterNetworkRoleClientAccess."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change: let a second network carry cluster communication (Role 1); use your own network name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNetwork&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Cluster Network 2'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Role&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# A change, Microsoft's form: rank a network by metric (lower is preferred for cluster traffic)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNetwork&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Cluster Network 3'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Metric&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1050&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's network prioritization article shows how to undo a manual metric: set &lt;code&gt;AutoMetric&lt;/code&gt; back to &lt;code&gt;$true&lt;/code&gt; on that network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firewall, IPv6, profile, IPsec (Step 8).&lt;/strong&gt; Re-enable the Failover Clusters rules and the Neighbor Discovery rules in the policy that disabled them, not by hand on one node (our reading). Fix the reason a profile drops to Public (usually domain detection at boot or a DNS path; our reading). For IPsec, Microsoft's article points at the refresh and the authentication delay; exempt cluster traffic in the connection security rules or fix the DC path the renegotiation waits on (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antivirus (Step 8).&lt;/strong&gt; Add Microsoft's exclusions from the table above in the antivirus policy for every node, then reboot one drained node at a time so filter drivers load with the new policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quarantine (Step 3).&lt;/strong&gt; Once the cause is fixed, clear the quarantine with Microsoft's command instead of waiting out the two hours:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change: start the Cluster service on the node and clear its quarantine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-ClusterNode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClearQuarantine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Thresholds, last and in moderation (Step 5).&lt;/strong&gt; Raise them only for the case Microsoft describes (stretched clusters, Azure IaaS, or older versions still on 5), and only after the network read. Microsoft: "In general, continuing to send frequent heartbeats but having greater thresholds is the preferred method." Its forms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change, Microsoft's form: raise the same-subnet threshold (example value from Microsoft's article)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Cluster&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SameSubnetThreshold&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# A change, Microsoft's form: keep twice as much route history as the threshold&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Cluster&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RouteHistoryLength&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Re-read&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SameSubnet&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CrossSubnet&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RouteHistoryLength&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's tuning article: "These setting can be set while the cluster is up and running with no downtime and will take effect immediately with no need to reboot or restart the cluster." Its limit: "it is generally not recommended to exceed the TCP reconnect timeouts. Generally, this means not going above ~20 seconds." So a 1000 ms delay with a threshold of 20 is about the ceiling for most workloads, and its warning still applies: "increasing resiliency to network hiccups comes at the cost of increased downtime when a hard failure occurs." (The &lt;code&gt;RouteHistoryLength&lt;/code&gt; value of 40 is the reference maximum; 40 is twice 20.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 10: Prove it stays quiet (read-only, through the same load window)
&lt;/h2&gt;

&lt;p&gt;Wait through the window that produced the 1135 (the backup, the migration wave, the patch night, the Group Policy refresh), then run the reads again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: no new 1135, 1127, 1129, 1130, 1177, or 1672 on any node since the change&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$since&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'2026-10-20 18:00'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'System'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1127&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1129&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1130&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1135&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1177&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1672&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$since&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'LoggedOn'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: nodes, networks, and interfaces all Up&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-ClusterNetwork&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Metric&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNetworkInterface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Network&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: the cluster log for the window, with no route marked down&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-TimeSpan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;120&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseLocalTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Destination&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Select-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Pattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Marking Route'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LineNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Line&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: discards across the same window, compared with the reading before the change&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Counter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Counter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'\Network Interface(*)\Packets Received Discarded'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-SampleInterval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxSamples&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;12&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: the network validation tests again&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-Cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Validate Network Communication'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Validate Windows Firewall Configuration'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ReportName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Temp\cluster-network-validation-after&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass criteria (our reading): no 1135 on any node through at least one full cycle of the window that caused it (a week, for a weekly backup); no route marked down in the cluster log for that window; every node, network, and interface Up; discarded packets flat across the busy window; at least two networks allowed for cluster communication; the network validation tests pass without latency or firewall warnings; no node quarantined; and heartbeat values at the defaults for your version, or raised in moderation with RouteHistoryLength at twice the threshold and a written reason.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common false starts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;False start&lt;/th&gt;
&lt;th&gt;Why it doesn't help (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Raising SameSubnetThreshold and CrossSubnetThreshold to the maximum&lt;/td&gt;
&lt;td&gt;Microsoft: "it just masks the problem. It doesn't fix anything." Hard failures then take minutes to detect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raising the delay instead of the threshold&lt;/td&gt;
&lt;td&gt;Microsoft: "continuing to send frequent heartbeats but having greater thresholds is the preferred method."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reading the 1135 on one node only&lt;/td&gt;
&lt;td&gt;Microsoft's scenarios A, B, and C are told apart only by comparing all nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comparing the System log with a cluster log in GMT&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Get-ClusterLog&lt;/code&gt; timestamps are GMT unless you use &lt;code&gt;-UseLocalTime&lt;/code&gt;, so the route lines appear hours away&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evicting and re-adding the node&lt;/td&gt;
&lt;td&gt;The NIC, driver, switch, or policy that dropped the heartbeats comes back with it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disabling antivirus to test&lt;/td&gt;
&lt;td&gt;Microsoft: "Just disabling the antivirus software is insufficient in most cases." The filter driver stays loaded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disabling IPv6 on the cluster networks&lt;/td&gt;
&lt;td&gt;Microsoft says IPv6 is the default heartbeat protocol; its cause is the Neighbor Discovery rules being disabled, not IPv6 itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running a full &lt;code&gt;Test-Cluster&lt;/code&gt; on a live cluster&lt;/td&gt;
&lt;td&gt;Storage tests can take disks offline; run the network tests by name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clearing quarantine before the cause is fixed&lt;/td&gt;
&lt;td&gt;The node leaves again; three times in an hour quarantines it again&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Using one team or one virtual switch for every cluster network&lt;/td&gt;
&lt;td&gt;Every route then fails together, and a node with two networks still gets removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Treating 1069 or 1146 as the cause&lt;/td&gt;
&lt;td&gt;They're resource and health events that follow the removal; read the 1135 first&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When a change is justified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Discards climbing on one node's adapter&lt;/td&gt;
&lt;td&gt;Driver, firmware, and receive buffers to vendor-recommended values, one drained node at a time&lt;/td&gt;
&lt;td&gt;Raising thresholds so the drops stop mattering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VMware guest cluster with VMXNET3 drops&lt;/td&gt;
&lt;td&gt;Microsoft's Small Rx Buffers and Rx Ring #1 Size changes, increased gradually&lt;/td&gt;
&lt;td&gt;Moving the guest cluster to a single vNIC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only one network carries cluster communication&lt;/td&gt;
&lt;td&gt;A second network with Role 1 or 3, or a team on redundant switches&lt;/td&gt;
&lt;td&gt;Setting the iSCSI network to carry cluster traffic to get a second path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live migration or backup traffic on the heartbeat network&lt;/td&gt;
&lt;td&gt;A dedicated live migration network and metrics that keep cluster traffic on its own path&lt;/td&gt;
&lt;td&gt;Turning off live migration or backups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neighbor Discovery or Failover Clusters rules disabled by policy&lt;/td&gt;
&lt;td&gt;Re-enable them in the policy that disabled them&lt;/td&gt;
&lt;td&gt;A local rule on one node that the next policy refresh removes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Profile dropping to Public&lt;/td&gt;
&lt;td&gt;Fix domain detection on that adapter&lt;/td&gt;
&lt;td&gt;Disabling the firewall on cluster networks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPsec refresh blocking traffic&lt;/td&gt;
&lt;td&gt;Exempt cluster traffic in the connection security rules, or fix the DC path&lt;/td&gt;
&lt;td&gt;Lengthening the threshold to outlast every refresh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stretched cluster or Azure IaaS with real latency&lt;/td&gt;
&lt;td&gt;Cross-subnet or cross-site thresholds raised in moderation, with RouteHistoryLength at twice the threshold&lt;/td&gt;
&lt;td&gt;Same-subnet values raised to 120 for a site link problem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A quarantined node, cause fixed&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Start-ClusterNode -ClearQuarantine&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Waiting out two hours, or evicting the node&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does Event 1135 "Cluster node was removed from the active failover cluster membership" mean?&lt;/strong&gt;&lt;br&gt;
The other nodes stopped receiving the node's heartbeats on every cluster network for longer than the threshold allows, or its Cluster service stopped. Microsoft's text: "The Cluster service on this node may have stopped. This could also be due to the node having lost communication with other active nodes in the failover cluster." It's logged on the nodes that remain, not on the removed one (Steps 1 and 2).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What port does the failover cluster heartbeat use?&lt;/strong&gt;&lt;br&gt;
UDP 3343. Microsoft: "The heartbeat itself is a UDP unicast network packet that communicates over Port 3343." TCP 3343 is used when a node joins, and IPv6 is the default heartbeat protocol, so the Neighbor Discovery rules matter too (Step 8).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are the default SameSubnetDelay and SameSubnetThreshold values?&lt;/strong&gt;&lt;br&gt;
It depends on the version and the page you read. Microsoft's property reference lists SameSubnetDelay 1000 ms and SameSubnetThreshold 5; its tuning article lists 10 heartbeats for Windows Server 2016, and its Azure article says Windows Server sets SameSubnetThreshold to 10 by default. Read your own with &lt;code&gt;Get-Cluster | Format-List *subnet*&lt;/code&gt; (Step 5).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I increase the cluster heartbeat thresholds to stop Event 1135?&lt;/strong&gt;&lt;br&gt;
Only after the network read, and in moderation. Microsoft says raising them "simply masks the problem by making health monitoring less sensitive", and that it's generally "not going above ~20 seconds". The real cases are stretched clusters, Azure IaaS, and older versions still on 5 (Steps 5 and 9).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is my cluster node quarantined, and how do I clear it?&lt;/strong&gt;&lt;br&gt;
On Windows Server 2016 and later, "a node is quarantined, if it ungracefully leaves the cluster, three times within an hour", for 7200 seconds by default. Fix the cause of the 1135s, then run &lt;code&gt;Start-ClusterNode -ClearQuarantine&lt;/code&gt;, the command Microsoft's quarantine event names (Steps 3 and 9).&lt;/p&gt;




&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/hyper-v-live-migration-failed-event-21502-a-read-first-switch-processor-version-and-kerberos-181f"&gt;Hyper-V Live Migration Failed (Event 21502)&lt;/a&gt; (when the 1135s line up with live migrations on the same hosts and networks)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/hyper-v-checkpoint-operation-failed-a-read-first-vss-storage-permissions-and-orphaned-avhdx-5ep"&gt;Hyper-V Checkpoint Operation Failed&lt;/a&gt; (when the 1135s line up with the backup window and checkpoints fail too)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt; (when the same nodes also fail RPC to domain controllers through the same firewall or NIC)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free checklist
&lt;/h2&gt;

&lt;p&gt;Raising heartbeat thresholds on every cluster, or evicting the node, before anyone read which route dropped and why, is a change made everywhere at once. So is a Conditional Access policy enforced before anyone read the report-only results. The free &lt;strong&gt;Conditional Access pre-enforcement checklist&lt;/strong&gt; keeps break-glass accounts, pilot groups, and report-only review on one page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=failover-cluster-event-1135" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=failover-cluster-event-1135&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the &lt;strong&gt;Intune &amp;amp; M365 Admin Starter Pack&lt;/strong&gt; pairs with this triage: &lt;a href="https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=failover-cluster-event-1135" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=failover-cluster-event-1135&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Admin Pack Studio; not affiliated with Microsoft. Steps 1-8 and 10 are read-only checks: &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;Get-ClusterNode&lt;/code&gt;, &lt;code&gt;Get-ClusterResource&lt;/code&gt;, &lt;code&gt;Get-ClusterQuorum&lt;/code&gt;, &lt;code&gt;Get-Cluster&lt;/code&gt;, &lt;code&gt;Get-ClusterNetwork&lt;/code&gt;, &lt;code&gt;Get-ClusterNetworkInterface&lt;/code&gt;, &lt;code&gt;Get-ClusterLog&lt;/code&gt;, &lt;code&gt;Select-String&lt;/code&gt;, &lt;code&gt;Get-NetAdapter&lt;/code&gt;, &lt;code&gt;Get-NetAdapterStatistics&lt;/code&gt;, &lt;code&gt;Get-NetAdapterAdvancedProperty&lt;/code&gt;, &lt;code&gt;Get-Counter&lt;/code&gt;, &lt;code&gt;Get-NetLbfoTeam&lt;/code&gt;, &lt;code&gt;Get-VMSwitch&lt;/code&gt;, &lt;code&gt;Get-VMSwitchTeam&lt;/code&gt;, &lt;code&gt;Get-NetFirewallRule&lt;/code&gt;, &lt;code&gt;netsh advfirewall firewall show rule&lt;/code&gt;, &lt;code&gt;Get-NetConnectionProfile&lt;/code&gt;, &lt;code&gt;Get-Service&lt;/code&gt; through &lt;code&gt;Invoke-Command&lt;/code&gt;, and &lt;code&gt;Test-Cluster&lt;/code&gt; with only the network tests (it writes a report file). &lt;code&gt;Get-ClusterLog&lt;/code&gt; writes log files to the destination folder. Draining and resuming nodes, updating drivers and firmware, changing adapter buffers, network roles, and metrics, changing firewall, IPsec, and antivirus policy, clearing quarantine, and changing heartbeat thresholds or route history are deliberate changes. Change one link at a time, prove it through the same load window, and check current Microsoft Learn for version-specific behavior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windowsserver</category>
      <category>networking</category>
      <category>sysadmin</category>
      <category>powershell</category>
    </item>
    <item>
      <title>DNS Event ID 4013 (DNS Server Waiting for AD DS Initial Sync): A Read-First DNS Client, Replication, and 4015 Triage</title>
      <dc:creator>AdminPackStudio</dc:creator>
      <pubDate>Mon, 19 Oct 2026 14:41:18 +0000</pubDate>
      <link>https://dev.to/adminpackstudio/dns-event-id-4013-dns-server-waiting-for-ad-ds-initial-sync-a-read-first-dns-client-92d</link>
      <guid>https://dev.to/adminpackstudio/dns-event-id-4013-dns-server-waiting-for-ad-ds-initial-sync-a-read-first-dns-client-92d</guid>
      <description>&lt;p&gt;Helpdesk: "After Sunday's patch reboot, DC01 sat at 'Preparing network connections' for about twenty minutes. Now DNS Manager on it says the server could not be contacted, and the DNS Server log has Event 4013 every two minutes: 'The DNS server is waiting for Active Directory Domain Services (AD DS) to signal that the initial synchronization of the directory has been completed.' DC02 was patched and rebooted at the same time. A forum post says to set Repl Perform Initial Synchronizations to 0 and point DC01 at 127.0.0.1 only. Can we do that?"&lt;/p&gt;

&lt;p&gt;Not that way. &lt;strong&gt;Event 4013 usually isn't a broken DNS server. A DNS server that hosts AD-integrated zones waits after boot until AD DS finishes its first inbound replication, and AD DS can't replicate until it can resolve its partners' names through DNS. When the DC points only at itself, when its partners are rebooting too, offline, or long gone, or when the network isn't up yet, the two wait on each other.&lt;/strong&gt; Microsoft says it plainly: "DNS Event ID 4013 in the DNS event log indicates that DNS service startup was delayed. It's because inbound replication of Active Directory partitions hadn't occurred." It's just as plain about the registry shortcut: "This configuration change isn't recommended for use in production environments, or in any environment on an ongoing basis." Pointing a DC with partners at itself only is the other half of the forum advice, and Microsoft's 4013 article lists that exact setup among the conditions that make 4013 worse. Work through it as a chain: &lt;strong&gt;which DC, which events, since when&lt;/strong&gt; → &lt;strong&gt;is it a boot-time wait that ends, or one that never ends?&lt;/strong&gt; → &lt;strong&gt;what are the DNS Server and AD DS services actually doing?&lt;/strong&gt; → &lt;strong&gt;which DNS servers does this DC ask, and do they answer?&lt;/strong&gt; → &lt;strong&gt;can it resolve its replication partners?&lt;/strong&gt; → &lt;strong&gt;is inbound replication happening, and from whom?&lt;/strong&gt; → &lt;strong&gt;is it the only DC, a role holder, or a recovery case?&lt;/strong&gt; → &lt;strong&gt;is it really 4015, 4000, or 4007?&lt;/strong&gt; → &lt;strong&gt;change one link&lt;/strong&gt; → &lt;strong&gt;prove a clean boot.&lt;/strong&gt; &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;Get-Service&lt;/code&gt;, &lt;code&gt;Get-DnsClientServerAddress&lt;/code&gt;, &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;repadmin /showrepl&lt;/code&gt;, &lt;code&gt;repadmin /replsummary&lt;/code&gt;, &lt;code&gt;Get-ADReplicationPartnerMetadata&lt;/code&gt;, &lt;code&gt;Get-ADReplicationFailure&lt;/code&gt;, &lt;code&gt;dcdiag /test:dns&lt;/code&gt;, and &lt;code&gt;Get-ItemProperty&lt;/code&gt; are the sources for that chain. Set the registry value "to be safe" and you may bring up a DC that serves stale zones and acts on stale role data, and the next reboot of two DCs at once still hangs the same way.&lt;/p&gt;

&lt;p&gt;If the partners show replication error 1722 once you can read them, &lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt; covers the DNS, RPC, and firewall side. If member servers log Netlogon 5719 in the same boot window, &lt;a href="https://dev.to/adminpackstudio/netlogon-event-id-5719-a-read-first-boot-timing-dns-dc-locator-and-site-triage-3j2a"&gt;Netlogon Event ID 5719&lt;/a&gt; covers the client view of the same timing problem. This post covers &lt;strong&gt;"a domain controller that runs DNS with AD-integrated zones and logs DNS Server Event 4013 (the DNS server is waiting for AD DS initial synchronization), with or without 4015, 4000, or 4007, a slow 'Preparing network connections' boot, DNS Manager or Active Directory Users and Computers failing to connect, and you need a read-first path before you change the registry, point the DC at itself, or restart services in a loop."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A short 4013 run after boot can be normal.&lt;/strong&gt; Microsoft: "The delay won't occur if Active Directory has completed its initial synchronization during Windows startup." The event "will be logged every two minutes until AD DS has signaled that the initial synchronization has successfully completed", so count the events and read how long they lasted (Step 2).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS waits for AD DS, and AD DS needs DNS to find its partners.&lt;/strong&gt; Replication "is delayed until it can resolve the CNAME GUID of its source domain controller to an IP address on the DNS servers used by the destination domain controller for name resolution." (Steps 4 and 5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A DC with partners shouldn't point only at itself.&lt;/strong&gt; Microsoft: "Domain controllers hosting AD-integrated DNS zones shouldn't point to a single domain controller and especially only to themselves as preferred DNS for name resolution." A forest with one DC is the exception (Steps 4 and 7).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale or offline partners keep the wait going.&lt;/strong&gt; Read &lt;code&gt;repadmin /showrepl&lt;/code&gt; and remove the metadata of DCs that are really gone; don't wait on them (Step 6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The registry value is a temporary emergency tool.&lt;/strong&gt; Repl Perform Initial Synchronizations set to 0 "should be used only in critical situations to resolve temporary and specific problems. The default setting should be restored after such problems are resolved." (Steps 7 and 9).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4015 is a different problem.&lt;/strong&gt; It's "a critical error from the Active Directory" with an error code that picks the cause: RODC, permissions, or too many orphaned records (Step 8).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where in the chain did it break?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What should be true&lt;/th&gt;
&lt;th&gt;Typical symptom when it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Symptom captured&lt;/td&gt;
&lt;td&gt;Which DC, which events with their full text, when it booted, which other DCs rebooted with it, and what changed&lt;/td&gt;
&lt;td&gt;"DNS is down on DC01" with no event text and no boot time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Event read&lt;/td&gt;
&lt;td&gt;You know whether 4013 stopped after a few minutes or is still being logged, and which neighbor events came with it&lt;/td&gt;
&lt;td&gt;Every 4013 treated as an outage; or a 4013 that's been logged for hours treated as boot noise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Services&lt;/td&gt;
&lt;td&gt;DNS Server, AD DS, Netlogon, and KDC states are known, and you know whether the DC is advertising&lt;/td&gt;
&lt;td&gt;DNS Server shows Starting or Running with no zones; DNS Manager can't connect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. DC DNS client&lt;/td&gt;
&lt;td&gt;The DC's adapter lists DNS servers that are up at boot, host the AD zones, and answer&lt;/td&gt;
&lt;td&gt;Only 127.0.0.1 or its own address on a DC with partners; an ISP resolver; a retired DC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Partner names&lt;/td&gt;
&lt;td&gt;The DC can resolve each source DC's GUID CNAME and host record from the servers it asks&lt;/td&gt;
&lt;td&gt;NTDS 2087 or 2088; &lt;code&gt;Resolve-DnsName&lt;/code&gt; fails for the &lt;code&gt;_msdcs&lt;/code&gt; CNAME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Inbound replication&lt;/td&gt;
&lt;td&gt;Every partner in &lt;code&gt;repadmin /showrepl&lt;/code&gt; is online and replicates inbound&lt;/td&gt;
&lt;td&gt;Partners that no longer exist; partners powered off; RPC errors such as 1722&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Special cases&lt;/td&gt;
&lt;td&gt;Single DC, role holder, isolated network, or forest recovery is recognized for what it is&lt;/td&gt;
&lt;td&gt;Repl Perform Initial Synchronizations left at 0 from an old fix; a lone DC that waits on nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. 4015, 4000, 4007&lt;/td&gt;
&lt;td&gt;The event is identified by ID and error code, not lumped in with 4013&lt;/td&gt;
&lt;td&gt;4015 with 0000051B, 00002095, or ADMIN_LIMIT_EXCEEDED treated as a boot wait&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Change&lt;/td&gt;
&lt;td&gt;One link fixed, then replication and the DNS Server service checked&lt;/td&gt;
&lt;td&gt;Registry, DNS list, and services all changed in one go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Proof&lt;/td&gt;
&lt;td&gt;A reboot in a window logs no lasting 4013, replication is clean, and every DNS server answers&lt;/td&gt;
&lt;td&gt;It works until the next patch night, when two DCs reboot together again&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1: Capture the symptom (read-only)
&lt;/h2&gt;

&lt;p&gt;Write these on the ticket first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which DC, and is it a DNS server with AD-integrated zones?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4013 is logged by DNS servers that store zones in AD DS, so it only appears on DCs running the DNS Server role (Step 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The full event text and data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4013's wording differs between Windows versions and Microsoft pages; 4015 carries an error code that decides the branch (Steps 2 and 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;When the DC booted, and how long the 4013s lasted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A few events right after boot that then stop is a different case from 4013 every two minutes for an hour (Step 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which other DCs rebooted at the same time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microsoft's example is two DCs pointing at each other that both restart; each waits for the other's DNS (Step 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;How many DCs, sites, and domains&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A single DC, a branch DC behind a WAN link, and a hub DC with local partners need different DNS client settings (Steps 4 and 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Since when, and what changed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Patching, a power or cooling outage, a DC removed without demotion, a restore or recovery, a new IP address, DNS client changes on the DC, a registry fix someone applied once, an RODC added&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then branch on what you see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it usually means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A few 4013s right after boot, then they stop&lt;/td&gt;
&lt;td&gt;Initial synchronization finished; the DNS Server service started; nothing to fix unless the boot was slow&lt;/td&gt;
&lt;td&gt;Step 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4013 every two minutes for an hour or more&lt;/td&gt;
&lt;td&gt;AD DS hasn't finished inbound replication of its partitions; find out why&lt;/td&gt;
&lt;td&gt;Steps 4 to 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two DCs that point at each other rebooted together&lt;/td&gt;
&lt;td&gt;Microsoft's example scenario: each waits on the other's DNS while its own DNS waits on AD DS&lt;/td&gt;
&lt;td&gt;Steps 4 and 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A DC with partners that points only at itself&lt;/td&gt;
&lt;td&gt;Microsoft lists this among the conditions that make 4013 worse&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One DC in a site, alternate DNS across a WAN link that was down&lt;/td&gt;
&lt;td&gt;Microsoft's single-DC-in-a-site scenario&lt;/td&gt;
&lt;td&gt;Steps 4 and 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;repadmin /showrepl&lt;/code&gt; shows a partner that no longer exists&lt;/td&gt;
&lt;td&gt;AD DS keeps trying to replicate from it; remove its metadata&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NTDS Event 2087 or 2088 in the Directory Service log&lt;/td&gt;
&lt;td&gt;The DC can't resolve a partner's GUID CNAME; 2087 means replication from it failed&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The only DC in the forest logs 4013&lt;/td&gt;
&lt;td&gt;There's no partner to replicate from; read its DNS client list and the registry value&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repl Perform Initial Synchronizations is 0&lt;/td&gt;
&lt;td&gt;Someone used the emergency bypass and never restored it&lt;/td&gt;
&lt;td&gt;Steps 7 and 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4015 "has encountered a critical error from the Active Directory"&lt;/td&gt;
&lt;td&gt;A different event; the error code in the text picks the cause&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4000 or 4007, zones not loading, Access Denied in DNS Manager&lt;/td&gt;
&lt;td&gt;Microsoft's 4000/4007 article ties this to the DC's secure channel&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2: Read the events and how long they lasted (read-only)
&lt;/h2&gt;

&lt;p&gt;4013 is in the &lt;strong&gt;DNS Server&lt;/strong&gt; log (Event Viewer: &lt;strong&gt;Applications and Services Logs &amp;gt; DNS Server&lt;/strong&gt;), not the System log. Read it with its neighbors, and read the Directory Service log for the same window:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: DNS Server events since the last boot, oldest first&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$boot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_OperatingSystem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LastBootUpTime&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DNS Server'&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4007&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4011&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4013&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4015&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$boot&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LevelDisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: first and last 4013 since boot, and how many&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$w&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DNS Server'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4013&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$boot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$first&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$w&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TimeCreated&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$last&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$w&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Last&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TimeCreated&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pscustomobject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Boot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$boot&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@(&lt;/span&gt;&lt;span class="nv"&gt;$w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$first&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Last&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$last&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Minutes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$last&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$first&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;TotalMinutes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: DNS lookup failures for replication partners in the same window&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Directory Service'&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;ProviderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Microsoft-Windows-ActiveDirectory_DomainService'&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2087&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2088&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$boot&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the result against Microsoft's text for each event:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Log or source (as Microsoft shows it)&lt;/th&gt;
&lt;th&gt;Microsoft's message (excerpt)&lt;/th&gt;
&lt;th&gt;What it tells you (our reading)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4013&lt;/td&gt;
&lt;td&gt;DNS Server&lt;/td&gt;
&lt;td&gt;"The DNS server is waiting for Active Directory Domain Services (AD DS) to signal that the initial synchronization of the directory has been completed."&lt;/td&gt;
&lt;td&gt;DNS is waiting on AD DS initial sync; the rest of this post&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4013 (older wording)&lt;/td&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;td&gt;"The DNS server was unable to open the Active Directory. This DNS server is configured to use directory service information and can not operate without access to the directory."&lt;/td&gt;
&lt;td&gt;The same event ID as Microsoft's 4013 troubleshooting article shows it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4015&lt;/td&gt;
&lt;td&gt;DNS Server&lt;/td&gt;
&lt;td&gt;"The DNS server has encountered a critical error from the Active Directory. Check that the Active Directory is functioning properly."&lt;/td&gt;
&lt;td&gt;Not a boot wait; read the extended error (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4000&lt;/td&gt;
&lt;td&gt;DNS Server&lt;/td&gt;
&lt;td&gt;"The DNS server was unable to open Active Directory. This DNS server is configured to obtain and use information from the directory for this zone and is unable to load the zone without it."&lt;/td&gt;
&lt;td&gt;Zones not loading (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4007&lt;/td&gt;
&lt;td&gt;DNS Server&lt;/td&gt;
&lt;td&gt;"The DNS server was unable to open zone" (then the zone and application directory partition)&lt;/td&gt;
&lt;td&gt;One zone's partition can't be opened (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4011&lt;/td&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;td&gt;"The DNS server was unable to add or write an update of domain name"&lt;/td&gt;
&lt;td&gt;An AD write failed; Microsoft's large-record article shows it alongside 4015&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2087&lt;/td&gt;
&lt;td&gt;Directory Service&lt;/td&gt;
&lt;td&gt;"Active Directory could not resolve the following DNS host name of the source domain controller to an IP address."&lt;/td&gt;
&lt;td&gt;Replication from that source failed on DNS (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2088&lt;/td&gt;
&lt;td&gt;Directory Service&lt;/td&gt;
&lt;td&gt;"Active Directory could not use DNS to resolve the IP address of the source domain controller listed below."&lt;/td&gt;
&lt;td&gt;Replication worked through fallback, but DNS is still wrong (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two details matter when you compare with forum posts. First, the waiting text is the one on Microsoft's event reference page (symbolic name DNS_EVENT_DS_OPEN_WAIT), and it ends: "This event will be logged every two minutes until AD DS has signaled that the initial synchronization has successfully completed." Microsoft's current troubleshooting article for 4013 shows the older "unable to open the Active Directory" wording instead. Both are 4013 from the DNS server; search for the event ID, not only the text. Second, the waiting text gives a direction of its own: "If events in the AD DS event log indicate that there is a problem with DNS name resolution, consider adding the IP address of another DNS server for this domain to the DNS server list in the Internet Protocol properties of this computer."&lt;/p&gt;

&lt;p&gt;Microsoft's 4013 article lists event data values it can carry, and notes they "may not be logged":&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hex&lt;/th&gt;
&lt;th&gt;Decimal&lt;/th&gt;
&lt;th&gt;Symbolic name&lt;/th&gt;
&lt;th&gt;Microsoft's text&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;000025f5&lt;/td&gt;
&lt;td&gt;9717&lt;/td&gt;
&lt;td&gt;DNS_ERROR_DS_UNAVAILABLE&lt;/td&gt;
&lt;td&gt;The directory service is unavailable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0000232d&lt;/td&gt;
&lt;td&gt;9005&lt;/td&gt;
&lt;td&gt;DNS_ERROR_RCODE_REFUSED&lt;/td&gt;
&lt;td&gt;DNS operation refused.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0000232a&lt;/td&gt;
&lt;td&gt;9002&lt;/td&gt;
&lt;td&gt;DNS_ERROR_RCODE_SERVER_FAILURE&lt;/td&gt;
&lt;td&gt;DNS server failure.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then read the timing (our reading):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A handful of 4013s, the last within a few minutes of boot, then DNS answering&lt;/td&gt;
&lt;td&gt;Initial sync finished; note the boot length and move on unless it was the 15 to 25 minute hang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4013s for 15 to 20 minutes, then they stop&lt;/td&gt;
&lt;td&gt;Microsoft's described delay: "these domain controllers can experience a 15-20 minute startup delay." Read Steps 4 to 6 so the next boot is faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4013 still being logged now&lt;/td&gt;
&lt;td&gt;AD DS hasn't finished; find the partner or the DNS path that's missing (Steps 4 to 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4013 plus 2087 for a partner&lt;/td&gt;
&lt;td&gt;That partner's name doesn't resolve from this DC (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4013 on the only DC&lt;/td&gt;
&lt;td&gt;No partner exists; read Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4015 or 4000/4007 without 4013&lt;/td&gt;
&lt;td&gt;Go to Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft's own test explains why the wait can be that long: when the DNS Server service isn't available, "NTDS will need to send out 10 DNS queries to resolve the IP address", and with the default DNSQueryTimeouts "DNS client will wait 12 (1 + 1 + 2 + 4 + 4) seconds for the DNS server response." Multiply by the partitions (schema, configuration, domain, and the two DNS application partitions) and the minutes add up.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: What are the services doing? (read-only)
&lt;/h2&gt;

&lt;p&gt;Read the services the chain depends on, and whether the DC is advertising yet. DNS Server, AD DS, Netlogon, and KDC are the ones that matter here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: the services behind DNS and AD DS on this DC&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DNS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NTDS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Netlogon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Kdc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartType&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: which DC does DC locator return from here? (this DC itself once it advertises; our reading)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;nltest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/dsgetdc:contoso.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then try the consoles once, without restarting anything. Microsoft's example scenarios show what a DC stuck in this state looks like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;Microsoft's text&lt;/th&gt;
&lt;th&gt;What it means (our reading)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DNS Manager (DNSMGMT.MSC) won't connect&lt;/td&gt;
&lt;td&gt;"The server &lt;code&gt;&amp;lt;computername&amp;gt;&lt;/code&gt; could not be contacted. The error was: The server is unavailable. Would you like to add it anyway?"&lt;/td&gt;
&lt;td&gt;The DNS Server service isn't serving yet; it's waiting on AD DS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active Directory Users and Computers (DSA.MSC) won't open&lt;/td&gt;
&lt;td&gt;"Naming information could not be located"&lt;/td&gt;
&lt;td&gt;The DC can't yet act as a DC for the console&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A long boot&lt;/td&gt;
&lt;td&gt;"This issue occurs after the Preparing network connections message is displayed, and before the Windows logon prompt (Ctrl+Alt+Del) is displayed."&lt;/td&gt;
&lt;td&gt;The wait happened during startup; read Step 2's timing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS Server Running, zones present, 4013s stopped&lt;/td&gt;
&lt;td&gt;(none)&lt;/td&gt;
&lt;td&gt;Initial sync finished; the problem, if any, is how long it took&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS Server Running, 4000/4007, Access Denied in DNS Manager&lt;/td&gt;
&lt;td&gt;Microsoft's 4000/4007 symptoms&lt;/td&gt;
&lt;td&gt;Step 8, not a boot wait&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Restarting the DNS Server service while AD DS is still synchronizing doesn't shorten the wait (our reading): Microsoft's resolution for the event says "Ensure that AD DS is functioning properly, troubleshoot any problems, and then restart the DNS Server service." Fix the AD DS side first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Which DNS servers does this DC ask? (read-only)
&lt;/h2&gt;

&lt;p&gt;This is the step that most often explains a long 4013. Read every adapter's DNS server list, in order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: DNS servers per adapter, in the order the DC uses them&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsClientServerAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AddressFamily&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPv4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ServerAddresses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InterfaceAlias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InterfaceIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ServerAddresses&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: the same from ipconfig, with suffix and registration details&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;ipconfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/all&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the list against Microsoft's guidance for DCs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What the list shows&lt;/th&gt;
&lt;th&gt;Microsoft's guidance (quoted) or our reading&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Only 127.0.0.1 or the DC's own address, on a DC with partners&lt;/td&gt;
&lt;td&gt;"Configuring domain controllers to point to a single DNS server's IP address, including the 127.0.0.1 loopback address, represents a single point of failure. This setting is tolerable in a forest with only one domain controller, but not in forests with multiple domain controllers."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two DCs that each list the other first and themselves second, both rebooted together&lt;/td&gt;
&lt;td&gt;Microsoft's own example: "When both DC1 and DC2 reboot simultaneously, there will be a slow startup because of this mutual dependency." The fix is the reboot schedule and a third DNS server that's up, not removing the partner (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A hub-site DC&lt;/td&gt;
&lt;td&gt;"Hub-site domain controllers should point to DNS servers in the same site as them for preferred and alternate DNS server and then finally to itself as another alternate DNS server."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A branch-site DC&lt;/td&gt;
&lt;td&gt;"Branch site domain controllers should configure the preferred DNS server IP address to point to a hub-site DNS server, the alternate DNS server IP address to point to an in-site DNS server or one in the closest available site, and finally to itself using the 127.0.0.1 loopback address or current static IP address."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An ISP or public resolver&lt;/td&gt;
&lt;td&gt;"Don't configure the DNS client settings on the domain controllers to point to DNS servers of your Internet Service Provider (ISP)." Use forwarders instead (&lt;a href="https://dev.to/adminpackstudio/windows-dns-server-not-resolving-external-names-a-read-first-forwarder-root-hints-and-recursion-57fl"&gt;Windows DNS Server Not Resolving External Names&lt;/a&gt; covers that side)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A retired DC's address, or a server that doesn't host the zones&lt;/td&gt;
&lt;td&gt;Microsoft lists DNS servers "that either don't exist, are currently offline, aren't accessible on the network, or that don't host the required zones and records that are needed to inbound-replicate Active Directory" among the 4013 conditions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The first and only DC in the domain&lt;/td&gt;
&lt;td&gt;"If the server is the first and only domain controller that you install in the domain, and the server runs DNS, configure the DNS client settings to point to that first server's IP address." (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft's summary of what a DC's DNS servers must do is short: they should be servers that "Are available at Windows startup." and that "Host, forward, or delegate the &lt;code&gt;_msdcs.&amp;lt;forest root domain&amp;gt;&lt;/code&gt; and primary DNS suffix zones for current and potential source domain controllers." Two client details from Microsoft's best-practice article explain why a good-looking list can still fail: the client uses the preferred server until it fails to respond, and "Only a failure to respond will cause the DNS client to switch Preferred DNS servers; receiving an authoritative but incorrect response does not cause the DNS client to try another server."&lt;/p&gt;

&lt;p&gt;Then prove each listed server answers for the AD zones right now. Run this from the DC (or from another machine, against the same servers):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: does each DNS server in the DC's list answer on port 53 and hold the zones?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$servers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.11'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.1.0.10'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$servers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$tcp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;53&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WarningAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$soa&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SOA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$msd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'_msdcs.contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SOA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pscustomobject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Tcp53&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$tcp&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TcpTestSucceeded&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DomainSOA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$soa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MsdcsSOA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$msd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Every server in the list is a DC that rebooted with this one&lt;/td&gt;
&lt;td&gt;Nothing could answer during the boot window; that's the 4013 loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The only server that answers is 127.0.0.1&lt;/td&gt;
&lt;td&gt;This DC's own DNS, which is the one waiting on AD DS; it can't help AD DS find partners&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A server answers but has no &lt;code&gt;_msdcs&lt;/code&gt; zone&lt;/td&gt;
&lt;td&gt;It can't resolve the GUID CNAMEs replication uses (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Port 53 fails to one server&lt;/td&gt;
&lt;td&gt;It's off, retired, or blocked; it's still costing timeouts on every boot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A partner in another site answers&lt;/td&gt;
&lt;td&gt;Good, as long as the WAN link is up at boot; Microsoft's single-DC-in-a-site scenario is the case where it wasn't&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 5: Can this DC resolve its replication partners? (read-only)
&lt;/h2&gt;

&lt;p&gt;AD DS finds a source DC by the GUID-based alias in &lt;code&gt;_msdcs&lt;/code&gt;. Microsoft: "You should ensure that domain controllers can successfully resolve the guided CNAME records to host records of current and potential source domain controllers." Read the partner's CNAME from replication data, then resolve it from each server in this DC's list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: inbound partners with their fully qualified CNAME (look for the _msdcs name in the output)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;repadmin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/showrepl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/verbose&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: resolve one partner's GUID CNAME and host record from a specific DNS server&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$guidName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'dded5a29-fc25-4fd8-aa98-7f472fc6f09b._msdcs.contoso.com'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$guidName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CNAME&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10.0.0.11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC02.contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10.0.0.11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft documents &lt;code&gt;/verbose&lt;/code&gt; as showing the "fully qualified CNAME, invocation ID, replication flags, and update sequence number (USN) values" for each source partner, which is the name you need. If AD DS isn't answering on this DC yet, run &lt;code&gt;repadmin /showrepl&lt;/code&gt; against a healthy DC instead and read its view of this DC.&lt;/p&gt;

&lt;p&gt;Then run Microsoft's DNS tests from the 2087 procedure, against this DC and against the partner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: basic DNS health (connectivity, services, client config, records, zone and SOA)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;dcdiag&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/test:dns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/s:DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/DnsBasic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/f:C:\Temp\dcdiag-dns-DC01.txt&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: are the A, CNAME, and SRV records for DC location registered?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;dcdiag&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/test:dns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/s:DC02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/DnsRecordRegistration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's description of the basic test covers what you'd otherwise check by hand: it confirms the DNS Client, Net Logon, KDC, and DNS Server services are running, that "DNS servers on all adapters are reachable", and that each DC's host record "is registered on at least one of the DNS servers that is configured on the client." &lt;code&gt;/DnsRecordRegistration&lt;/code&gt; checks "the address (A), canonical name (CNAME) and well-known service (SRV) resource records". Note that &lt;code&gt;/DnsDynamicUpdate&lt;/code&gt; is not read-only: Microsoft says it performs "registration of a test record (_dcdiag_test_record)", deleted automatically after the test.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CNAME missing on every server&lt;/td&gt;
&lt;td&gt;The partner never registered it, or it was removed; Microsoft notes DNS scavenging "can be configured too aggressively, causing valid records to be prematurely purged from DNS zones." (&lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt; covers how)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNAME present on one server, missing on another&lt;/td&gt;
&lt;td&gt;Replication or zone scope differs between them; the DC asks the one that doesn't have it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNAME resolves, host record points to an old address&lt;/td&gt;
&lt;td&gt;A stale A record; Microsoft: "Missing, duplicate, or stale CNAME and host records all contribute to this problem."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2087 for a partner&lt;/td&gt;
&lt;td&gt;Microsoft: "attempts to resolve the globally unique identifier (GUID) in the alias (CNAME) resource record, the fully qualified domain name (FQDN), and the NetBIOS name to the IP address of the source domain controller have all failed."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2088 for a partner&lt;/td&gt;
&lt;td&gt;Replication succeeded by FQDN or NetBIOS fallback; the CNAME is still broken, and every boot pays for the fallback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The partner is gone, but its CNAME is still asked for&lt;/td&gt;
&lt;td&gt;It's still in this DC's replication data; Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 6: Is inbound replication happening, and from whom? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's cause statement is about partners: these DCs "try to inbound replicate all locally held directory partitions during Windows startup, as part of an initial synchronization or init sync." Read who they are and whether each one works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: inbound replication status for this DC, by partition and partner&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;repadmin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/showrepl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: only the failing partnerships, for every DC in the forest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;repadmin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/showrepl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/errorsonly&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: failures and largest deltas, summarized per source and destination&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;repadmin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/replsummary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/bysrc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/bydest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/sort:delta&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The PowerShell view gives the same data as objects, once AD DS on the DC you query is answering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: inbound partners of DC01, last success and last result&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADReplicationPartnerMetadata&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-PartnerType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Inbound&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Partner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastReplicationAttempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastReplicationSuccess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastReplicationResult&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: current replication failures recorded for DC01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADReplicationFailure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Partner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FailureCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FirstFailureTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastError&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: every DC the domain knows about, with site and address&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADDomainController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HostName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPv4Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IsGlobalCatalog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OperationMasterRoles&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the partners against Microsoft's list of conditions that keep initial sync from finishing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Microsoft's condition (quoted)&lt;/th&gt;
&lt;th&gt;Next step (our reading)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A partner that was removed without demotion or rebuilt under the same name&lt;/td&gt;
&lt;td&gt;"The local domain controller's copy of Active Directory contains references to stale domain controllers that no longer exist on the network."&lt;/td&gt;
&lt;td&gt;Metadata cleanup for that DC (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A partner that's powered off for now&lt;/td&gt;
&lt;td&gt;"The local domain controller's copy of Active Directory contains references to other domain controllers who are currently turned off."&lt;/td&gt;
&lt;td&gt;Bring it up, or wait it out with another partner available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Partners online but failing with an error&lt;/td&gt;
&lt;td&gt;"So the local domain controller's copy of Active Directory contains references to other domain controllers that are online and accessible but can't be successfully replicated from."&lt;/td&gt;
&lt;td&gt;Read the error; 1722 is covered in &lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Every partner fails, and the network adapter shows no connectivity&lt;/td&gt;
&lt;td&gt;"The network adapter or network stack on the caller or target computer is either disabled or non-functional."&lt;/td&gt;
&lt;td&gt;Fix the adapter or virtual switch first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The DC was started on a lab or recovery network&lt;/td&gt;
&lt;td&gt;"The domain controller has been booted on an isolated network."&lt;/td&gt;
&lt;td&gt;Expected; see Step 7's recovery note&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One partner succeeds, others fail&lt;/td&gt;
&lt;td&gt;Initial sync needs each partition from a partner; a success for one partition doesn't cover the others (our reading)&lt;/td&gt;
&lt;td&gt;Read the failures per partition&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft's guidance for the gone-for-good case is direct: "Remove references to stale domain controllers." and "Make offline or non-functioning domain controllers operational." Its 2087 article adds the check before cleanup: confirm the source DC is really down, with &lt;code&gt;net view \\&amp;lt;SourceDomainControllerName&amp;gt;&lt;/code&gt; (which "displays the Netlogon and SYSVOL shares, indicating that the server is functioning as a domain controller.").&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Is it the only DC, a role holder, or a recovery case? (read-only)
&lt;/h2&gt;

&lt;p&gt;Three situations look like 4013 trouble but need their own reading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The only DC in the forest.&lt;/strong&gt; Microsoft's best-practice article says the first and only DC that runs DNS should point at itself: "Do not list any other DNS servers until you have another domain controller hosting DNS in that domain." With no partner, there's nothing to replicate from, so a long 4013 on a lone DC usually means its copy of AD DS still lists a partner (our reading): a second DC that was removed without demotion, or a DC from a test you forgot. Run Step 6's &lt;code&gt;Get-ADDomainController -Filter *&lt;/code&gt; and &lt;code&gt;repadmin /showrepl&lt;/code&gt; on it; any partner listed there is one it's waiting on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A role holder.&lt;/strong&gt; Operations masters have their own initial-sync rule, and Microsoft's 4013 article keeps the two apart: "The initial sync requirements required for FSMO roles to become operational is different from the initial sync discussed in this article, where Active Directory must inbound replicate to start the DNS Server service immediately." The role rules, from Microsoft's FSMO article:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Microsoft's initial replication requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Schema master&lt;/td&gt;
&lt;td&gt;"This FSMO role holder is only active when the role owner has inbound replicated the schema NC successfully since the Directory Service started."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain naming master&lt;/td&gt;
&lt;td&gt;"This FSMO role holder is only active when the role owner has inbound replicated the configuration NC successfully since the Directory Service started."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RID master, infrastructure master&lt;/td&gt;
&lt;td&gt;"This FSMO role holder is active only when the role owner has inbound replicated the domain NC successfully since the Directory Service started."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDC emulator&lt;/td&gt;
&lt;td&gt;"There is no inbound replication requirement."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So a role holder that logs 4013 may also be refusing role operations, such as RID pool requests, for the same reason (our reading); fix the replication, not the roles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The registry value.&lt;/strong&gt; Read it on every DC you touch, because an old fix often left it behind:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: is the initial synchronization bypass set? (absent means the default)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Repl Perform Initial Synchronizations'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Repl Perform Initial Synchronizations'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's 4013 article gives the bypass as the value Repl Perform Initial Synchronizations, type REG_DWORD, data 0, under &lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters&lt;/code&gt;, and then says "The use of Repl Perform Initial Synchronizations should be used only in critical situations to resolve temporary and specific problems." The forest recovery guide is where it's meant to be used: for a restored DC that holds operations master roles, so AD DS isn't unavailable until it has replicated a writeable partition. That guide's restore instruction is "After the forest is recovered completely, you can reset the value of this entry to 1, which requires a domain controller that restarts and holds operations master roles to have successful AD DS inbound and outbound replication with its known replica partners before it advertises itself as domain controller and starts providing services to clients."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Value absent&lt;/td&gt;
&lt;td&gt;The default; nothing to change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value 1&lt;/td&gt;
&lt;td&gt;The default behavior, set explicitly (Microsoft's recovery guide resets it to 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value 0 and no one knows why&lt;/td&gt;
&lt;td&gt;A leftover bypass; plan to restore it (Step 9) after replication is proven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value 0 during a documented forest recovery&lt;/td&gt;
&lt;td&gt;Expected, until the forest is recovered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC started on a lab, recovery, or isolated network&lt;/td&gt;
&lt;td&gt;Microsoft lists "The domain controller has been booted on an isolated network." among the 4013 conditions; 4013 there is expected&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 8: Is it really 4015, 4000, or 4007? (read-only)
&lt;/h2&gt;

&lt;p&gt;These come from the same DNS Server and AD DS relationship but aren't boot waits. Read the full text of the most recent ones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: the newest 4015, 4000, and 4007 with their full message, including the extended error&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DNS Server'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4007&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's 4015 text is "The DNS server has encountered a critical error from the Active Directory. Check that the Active Directory is functioning properly. The extended error debug information (which may be empty) is", followed by the error. Its 4015 article sorts the error into three cases:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extended error starts with&lt;/th&gt;
&lt;th&gt;Microsoft's cause&lt;/th&gt;
&lt;th&gt;Microsoft's check or fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;00002095 (often with "problem 5012 (DIR_ERROR)"), logged every three minutes on an RODC&lt;/td&gt;
&lt;td&gt;"A Read-Only Domain Controller (RODC) running DNS can't connect to a writable domain controller"&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;nltest /dsgetdc:&lt;/code&gt; with the domain and &lt;code&gt;/WRITABLE /AVOIDSELF /TRY_NEXT_CLOSEST_SITE /DS_6&lt;/code&gt;; the DC it returns must be writeable, run DNS, and have correct records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0000051B (with "nTSecurityDescriptor")&lt;/td&gt;
&lt;td&gt;"The SYSTEM account isn't the owner of the DNS zone." or "The Users group for the domain doesn't have the correct members, including the Authenticated Users group."&lt;/td&gt;
&lt;td&gt;Zone owner set to SYSTEM; the domain Users group contains Domain Users, Authenticated Users, and INTERACTIVE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADMIN_LIMIT_EXCEEDED (problem 5008)&lt;/td&gt;
&lt;td&gt;"The DNS Server service generates this error code if a multi-valued dnsRecord attribute of a dnsNode object in Active Directory contains too many values."&lt;/td&gt;
&lt;td&gt;Remove the orphaned records of demoted DCs, by record data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The read-only checks for each branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only (00002095, on the RODC): which writable DC does DC locator return?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;nltest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/dsgetdc:contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/WRITABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/AVOIDSELF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/TRY_NEXT_CLOSEST_SITE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/DS_6&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only (0000051B): members of the domain's Users group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;localgroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/domain&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only (0000051B): owner of each AD-integrated zone object in the domain DNS partition&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-SearchBase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'CN=MicrosoftDNS,DC=DomainDnsZones,DC=contoso,DC=com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LDAPFilter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'(objectClass=dnsZone)'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nTSecurityDescriptor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Owner'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nTSecurityDescriptor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Owner&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only (ADMIN_LIMIT_EXCEEDED): record counts per name in the forest DNS partition, to a file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;repadmin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/showattr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CN=MicrosoftDNS,DC=ForestDnsZones,DC=contoso,DC=com"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/subtree&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/filter:&lt;/span&gt;&lt;span class="s2"&gt;"(objectclass=dnsnode)"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/atts:&lt;/span&gt;&lt;span class="s2"&gt;"dnsRecord"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/allvalues&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Temp\dns_ForestDnsZones.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's own route to the zone in the 0000051B case is Field Engineering diagnostic logging and Directory Service Event 1644 at the time of the 4015, then ADSI Edit: "Right-click the zone object, and then select Properties &amp;gt; Security &amp;gt; Advanced." and "Make sure that Owner is set to SYSTEM." Field Engineering logging is a registry change; turn it off afterwards, as Microsoft's steps do. For the record-count case, Microsoft explains why the values pile up: "However, when you demote a DC that acts as a DNS server, Active Directory doesn't automatically clean up the related DNS objects and attributes." Its large-zone article puts the ceiling at "approximately 1,200 values that can be associated with a single object in Windows Server 2022 and earlier versions."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4000 and 4007&lt;/strong&gt; mean zones didn't load, and Microsoft's article for that pair names a different cause: "This issue happens when that particular DC/DNS server has lost its Secure channel with itself or PDC." It adds: "This issue can also happen in a single DC environment where that DC/DNS server holds all the FSMO roles and is pointing to itself as Primary DNS server." Microsoft's symptoms include that "You notice that the DNS Server service is up and running." while DNS Manager gives Access Denied, which is how you tell it from a 4013 wait (our reading). Microsoft's fix for that case is in Step 9.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: Change one link, then let initial sync finish (a change)
&lt;/h2&gt;

&lt;p&gt;Fix only what Steps 2 to 8 showed, then read the result before changing anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The DC's DNS server list (Step 4).&lt;/strong&gt; For a hub-site DC with partners, point it at in-site partners first and itself last, as Microsoft describes. Use the addresses from your own design:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change: partner DNS servers first, this DC's own loopback last&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-DnsClientServerAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-InterfaceAlias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Ethernet'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ServerAddresses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.11'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.12'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Re-read it, then clear the resolver cache and re-register, as Microsoft's article says to after any change&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsClientServerAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-InterfaceAlias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Ethernet'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AddressFamily&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPv4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;ipconfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/flushdns&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;ipconfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/registerdns&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's rule for that last step: "If you change any DNS client settings, you must clear the DNS resolver cache and register the DNS resource records." For a branch DC, the order is hub first, then in-site, then itself (Step 4's table). For a lone DC, its own address is correct; don't add a server that doesn't host its zones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The reboot plan (Step 4).&lt;/strong&gt; If the 4013 came from DCs that point at each other and rebooted together, the fix is the schedule as much as the list. Microsoft: "Stagger the reboots of DNS servers in your enterprise when possible." and, among its single points of failure, "Placing all DNS servers on guest virtual machines on the same physical host computer". Put DCs in different patch waves, and keep at least one DNS server that each DC lists up while the others restart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A partner that's gone for good (Step 6).&lt;/strong&gt; Confirm it's down, then clean up its metadata. Microsoft's simplest path: deleting the DC's computer account from the Domain Controllers OU in Active Directory Users and Computers, where "the cleanup of server metadata is performed automatically." Then remove the DNS records it left behind, by record data, the way Microsoft's 4015 article does:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change: preview, then remove one gone DC's NS record from a zone (Microsoft's form, with -WhatIf added)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Remove-DnsServerResourceRecord&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ZoneName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RRType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'NS'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'@'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RecordData&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'dc9.contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WhatIf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Remove-DnsServerResourceRecord&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ZoneName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RRType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'NS'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'@'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RecordData&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'dc9.contoso.com'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A partner whose records are missing (Step 5).&lt;/strong&gt; On that partner, re-register. Microsoft: "The Net Logon service on a domain controller registers the DNS resource records that are required for the domain controller to be located on the network. The DNS Client service registers the host (A) resource record that the alias (CNAME) record points to."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change, on the partner DC: re-register its locator records and its host record&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Netlogon&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;ipconfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/registerdns&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's next instruction is "Wait 15 minutes, and then review events in Event Viewer to ensure proper registration of the resource records." Then re-run Step 5's &lt;code&gt;Resolve-DnsName&lt;/code&gt; from the DC that logged 4013.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pull replication once names resolve.&lt;/strong&gt; Then restart DNS only after AD DS has synchronized:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change: synchronize DC01 from all its partners, all partitions, across sites, DNs in messages&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;repadmin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/syncall&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/d&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# When repadmin /showrepl DC01 is clean, restart the DNS Server service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DNS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A known bad boot (Steps 4 and 6).&lt;/strong&gt; When you must boot a DC into a setup you know will stall (its partners are down for a planned outage, for example), Microsoft's documented path is to stop DNS from holding up the boot: "Set the DNS Server service startup value to manual.", then "Reboot, wait for the domain controller to advertise.", then "Restart the DNS Server service." It explains why that works: "If the service startup value for DNS Server service is set to manual, Active Directory doesn't wait for the DNS Server service to start."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change, before the planned boot: DNS Server service to manual&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-StartupType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Manual&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# After the boot, once nltest /dsgetdc returns this DC: start DNS, then put the startup type back&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DNS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-StartupType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Automatic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The registry value (Step 7).&lt;/strong&gt; If it's 0 from an old fix, restore the default once replication is proven, as Microsoft's recovery guide does:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change: restore initial synchronization (Microsoft's recovery guide resets the value to 1)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Repl Perform Initial Synchronizations'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set it to 0 only in the situation Microsoft describes, a critical and temporary one, with a written plan to restore it, and expect the next reboot to be the real test.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4015 with 0000051B (Step 8).&lt;/strong&gt; Fix the zone owner in ADSI Edit as Microsoft describes, or restore the Users group membership with Microsoft's command, then wait for replication and restart the DNS Server service on all the DCs in the domain, as Microsoft's steps say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;net localgroup users "NT AUTHORITY\Authenticated Users" /add /domain
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4000 and 4007 (Step 8).&lt;/strong&gt; Microsoft's resolution starts with the DNS list ("configure the server experiencing the issue to point to other active DNS server in TCP/IP properties"), then: "Stop the KDC service on the DC experiencing the issue.", reset the DC's machine account password against the PDC with &lt;code&gt;netdom resetpwd&lt;/code&gt;, and "Once the command executes, reboot the server." Microsoft's command, with your PDC and admin account in place of its placeholders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;netdom resetpwd /server:DC02.contoso.com /userd:CONTOSO\admin1 /passwordd:*
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a secure-channel repair, not a fix for 4013 (our reading); use it only when Step 8 showed 4000 or 4007 with the zones not loading.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 10: Prove a clean boot (read-only, after a planned reboot)
&lt;/h2&gt;

&lt;p&gt;Reboot the DC in a window, alone, with its partners up, and then run the reads again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: DNS Server events since this boot; Microsoft's verify step wants none from 4000 to 4019&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$boot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_OperatingSystem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LastBootUpTime&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DNS Server'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;.4019&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$boot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: the events Microsoft's verify step expects to see&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DNS Server'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4523&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4524&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$boot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: replication and DNS health after the boot&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;repadmin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/showrepl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/errorsonly&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;dcdiag&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/test:dns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/s:DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/DnsBasic&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: every DNS server returns the DC locator records and the zones load here&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.10'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.11'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.12'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'_ldap._tcp.dc._msdcs.contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SRV&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Server'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NameTarget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Port&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerZone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ZoneName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ZoneType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IsDsIntegrated&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's verify step for the event is: "Ensure that Event IDs 4523 and 4524 are being logged and that no events in the range 4000 to 4019 appear in the Domain Name System (DNS) event log."&lt;/p&gt;

&lt;p&gt;Pass criteria (our reading): no 4013 after the first few minutes of boot (none at all is better), and none in the 4000 to 4019 range after that; the boot no longer hangs at "Preparing network connections"; &lt;code&gt;repadmin /showrepl&lt;/code&gt; shows every inbound partner succeeding; &lt;code&gt;dcdiag /test:dns /DnsBasic&lt;/code&gt; passes for the DC; every DNS server returns the SRV records; DNS Manager opens and lists the AD-integrated zones; Repl Perform Initial Synchronizations is absent or 1; and the next patch night has DCs rebooting in separate waves.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common false starts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;False start&lt;/th&gt;
&lt;th&gt;Why it doesn't help (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setting Repl Perform Initial Synchronizations to 0 and leaving it&lt;/td&gt;
&lt;td&gt;Microsoft: "The default setting should be restored after such problems are resolved." Left at 0, the DC skips the check that keeps it from serving stale data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pointing a DC with partners at 127.0.0.1 only&lt;/td&gt;
&lt;td&gt;Microsoft names it a single point of failure, "tolerable in a forest with only one domain controller", and it's the setup where AD DS can't find partners while its own DNS waits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adding a public resolver as a second DNS server&lt;/td&gt;
&lt;td&gt;It can't answer for &lt;code&gt;_msdcs&lt;/code&gt; or your domain; Microsoft says not to point DCs at ISP DNS servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restarting the DNS Server service in a loop&lt;/td&gt;
&lt;td&gt;DNS waits on AD DS; until initial sync finishes or fails over, a restart starts the same wait&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rebooting the DC again "to be safe"&lt;/td&gt;
&lt;td&gt;The same DNS list and the same partners give the same wait; fix Steps 4 to 6 first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running &lt;code&gt;dcdiag /fix&lt;/code&gt; or &lt;code&gt;/DnsDynamicUpdate&lt;/code&gt; as a first read&lt;/td&gt;
&lt;td&gt;Both change things (&lt;code&gt;/DnsDynamicUpdate&lt;/code&gt; registers a test record); start with &lt;code&gt;/DnsBasic&lt;/code&gt; and &lt;code&gt;/DnsRecordRegistration&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Treating 4015 as a boot wait&lt;/td&gt;
&lt;td&gt;4015 carries an error code that names the cause: RODC, permissions, or record limits (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running &lt;code&gt;netdom resetpwd&lt;/code&gt; for every 4013&lt;/td&gt;
&lt;td&gt;Microsoft's resetpwd steps are for 4000 and 4007 with a lost secure channel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seizing roles because the role holder logs 4013&lt;/td&gt;
&lt;td&gt;Role holders wait for their own partition to replicate; seizing doesn't make DNS start, and the old holder still has the roles when it comes back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deleting a partner's computer account because it's offline today&lt;/td&gt;
&lt;td&gt;Metadata cleanup is for DCs that are gone for good; Microsoft's 2087 article checks the source DC first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adding HOSTS file entries for partners&lt;/td&gt;
&lt;td&gt;Microsoft notes static entries "become invalid over time", and queries for one DC "may be incorrectly resolved to another domain controller"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When a change is justified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A DC with partners points only at itself&lt;/td&gt;
&lt;td&gt;In-site partners first and itself last (hub), or hub first, in-site next, itself last (branch)&lt;/td&gt;
&lt;td&gt;127.0.0.1 as the only entry, or a public resolver as the alternate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two DCs point at each other and rebooted together&lt;/td&gt;
&lt;td&gt;Separate patch waves, plus a DNS server each DC lists that stays up&lt;/td&gt;
&lt;td&gt;Removing the partner from the list so each DC points only at itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A partner that's gone for good&lt;/td&gt;
&lt;td&gt;Metadata cleanup for that DC, then its leftover DNS records removed by record data&lt;/td&gt;
&lt;td&gt;Waiting it out, or setting the registry bypass so the DC stops asking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A partner that's offline for now&lt;/td&gt;
&lt;td&gt;Bring it back, or make sure another partner and DNS server are up at boot&lt;/td&gt;
&lt;td&gt;Metadata cleanup for a DC that's coming back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Partner CNAME or A record missing&lt;/td&gt;
&lt;td&gt;Re-register on the partner (Netlogon restart and &lt;code&gt;ipconfig /registerdns&lt;/code&gt;), then resolve again&lt;/td&gt;
&lt;td&gt;HOSTS or LMHOSTS entries on the DC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repl Perform Initial Synchronizations left at 0&lt;/td&gt;
&lt;td&gt;Restore it to the default after replication is proven&lt;/td&gt;
&lt;td&gt;Leaving it at 0 because the boot is faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A planned boot into a known bad setup&lt;/td&gt;
&lt;td&gt;Microsoft's manual DNS startup, then back to Automatic once the DC advertises&lt;/td&gt;
&lt;td&gt;The registry bypass for a one-time maintenance boot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4015 with 0000051B&lt;/td&gt;
&lt;td&gt;Zone owner back to SYSTEM, or the Users group membership restored&lt;/td&gt;
&lt;td&gt;Granting broad rights on the DNS partitions to make the error stop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4000/4007 with Access Denied&lt;/td&gt;
&lt;td&gt;Microsoft's secure-channel reset, after pointing the DC at another DNS server&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;netdom resetpwd&lt;/code&gt; as a fix for a plain 4013 wait&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does Event 4013 "The DNS server is waiting for Active Directory Domain Services (AD DS) to signal that the initial synchronization of the directory has been completed" mean?&lt;/strong&gt;&lt;br&gt;
The DNS Server service on a DC with AD-integrated zones is holding off until AD DS finishes its first inbound replication after boot, because "critical DNS data might not yet be replicated onto this domain controller." A few events right after boot that then stop are normal; events every two minutes for an hour mean replication isn't finishing (Steps 2 and 6).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does a domain controller take 15 to 20 minutes to boot with Event 4013?&lt;/strong&gt;&lt;br&gt;
AD DS needs DNS to find its replication partners, and DNS is waiting on AD DS. When the DC's DNS servers are itself or partners that are also rebooting, each lookup times out before falling back, for each partition. Microsoft's test puts it at "greater than 14 minutes" for five partitions and one source. Fix the DC's DNS server list and the reboot schedule (Steps 4 and 9).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I set Repl Perform Initial Synchronizations to 0 to fix Event 4013?&lt;/strong&gt;&lt;br&gt;
Not as a fix. Microsoft says it "isn't recommended for use in production environments, or in any environment on an ongoing basis" and should be used only in critical, temporary situations, with the default restored afterwards. Its forest recovery guide uses it for a restored role holder and then resets it to 1 (Steps 7 and 9).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should a domain controller point to itself for DNS?&lt;/strong&gt;&lt;br&gt;
A lone DC should. A DC with partners shouldn't point only at itself: Microsoft says DCs "shouldn't point to a single domain controller and especially only to themselves as preferred DNS for name resolution." Put partners first and the DC itself last, following Microsoft's hub and branch guidance (Step 4).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between DNS Event 4013 and 4015?&lt;/strong&gt;&lt;br&gt;
4013 is a wait: DNS hasn't started serving because AD DS initial synchronization hasn't finished. 4015 is an error: "The DNS server has encountered a critical error from the Active Directory." Its extended error code picks the cause: 00002095 (an RODC can't reach a writable DC), 0000051B (zone owner or Users group permissions), or ADMIN_LIMIT_EXCEEDED (too many orphaned records) (Step 8).&lt;/p&gt;




&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt; (when a partner in repadmin /showrepl fails with the RPC server unavailable)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/netlogon-event-id-5719-a-read-first-boot-timing-dns-dc-locator-and-site-triage-3j2a"&gt;Netlogon Event ID 5719&lt;/a&gt; (when member servers can't find a DC in the same boot window)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt; (when a partner's CNAME or host record was aged out and deleted)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/windows-dns-server-not-resolving-external-names-a-read-first-forwarder-root-hints-and-recursion-57fl"&gt;Windows DNS Server Not Resolving External Names&lt;/a&gt; (when a DC lists a public resolver because the forwarders were wrong)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free checklist
&lt;/h2&gt;

&lt;p&gt;Setting the initial synchronization bypass, or pointing every DC at itself, before anyone read which partner and which name lookup was failing, is a change made everywhere at once. So is a Conditional Access policy enforced before anyone read the report-only results. The free &lt;strong&gt;Conditional Access pre-enforcement checklist&lt;/strong&gt; keeps break-glass accounts, pilot groups, and report-only review on one page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=dns-event-4013-initial-sync" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=dns-event-4013-initial-sync&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the &lt;strong&gt;Intune &amp;amp; M365 Admin Starter Pack&lt;/strong&gt; pairs with this triage: &lt;a href="https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=dns-event-4013-initial-sync" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=dns-event-4013-initial-sync&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Admin Pack Studio; not affiliated with Microsoft. Steps 1-8 and 10 are read-only checks: &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;Get-CimInstance&lt;/code&gt;, &lt;code&gt;Get-Service&lt;/code&gt;, &lt;code&gt;nltest /dsgetdc&lt;/code&gt;, &lt;code&gt;Get-DnsClientServerAddress&lt;/code&gt;, &lt;code&gt;ipconfig /all&lt;/code&gt;, &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;repadmin /showrepl&lt;/code&gt;, &lt;code&gt;repadmin /replsummary&lt;/code&gt;, &lt;code&gt;repadmin /showattr&lt;/code&gt;, &lt;code&gt;dcdiag /test:dns /DnsBasic&lt;/code&gt; and &lt;code&gt;/DnsRecordRegistration&lt;/code&gt;, &lt;code&gt;Get-ADReplicationPartnerMetadata&lt;/code&gt;, &lt;code&gt;Get-ADReplicationFailure&lt;/code&gt;, &lt;code&gt;Get-ADDomainController&lt;/code&gt;, &lt;code&gt;Get-ADObject&lt;/code&gt;, &lt;code&gt;net localgroup users /domain&lt;/code&gt;, &lt;code&gt;Get-ItemProperty&lt;/code&gt;, and &lt;code&gt;Get-DnsServerZone&lt;/code&gt;. Changing a DC's DNS server list, re-registering records, cleaning up DC metadata, removing DNS records, forcing replication, restarting or changing the startup type of services, changing the Repl Perform Initial Synchronizations value, changing group membership or zone ownership, resetting a machine account password, and rebooting DCs are deliberate changes. Change one link at a time, prove it with a planned reboot, and check current Microsoft Learn for version-specific behavior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windowsserver</category>
      <category>dns</category>
      <category>activedirectory</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>Cluster Network Name Resource Failed Registration (Event 1196, 1257): A Read-First DNS, CNO, and Record Triage</title>
      <dc:creator>AdminPackStudio</dc:creator>
      <pubDate>Mon, 19 Oct 2026 12:41:12 +0000</pubDate>
      <link>https://dev.to/adminpackstudio/cluster-network-name-resource-failed-registration-event-1196-1257-a-read-first-dns-cno-and-hb6</link>
      <guid>https://dev.to/adminpackstudio/cluster-network-name-resource-failed-registration-event-1196-1257-a-read-first-dns-cno-and-hb6</guid>
      <description>&lt;p&gt;Helpdesk: "Since the storage maintenance on Saturday, the file server role on the Hyper-V cluster won't stay online on HVN02, and the System log there keeps showing Event 1196: 'Cluster network name resource 'Cluster Name' failed registration of one or more associated DNS name(s) for the following reason: DNS bad key.' There's also a 1257 for FS01. A forum post says to delete the A records, give Authenticated Users full control of the zone, set the zone to accept nonsecure updates, and run Repair. Can we do that?"&lt;/p&gt;

&lt;p&gt;Not that way. &lt;strong&gt;"Cluster network name resource failed registration" usually isn't a broken cluster. The network name resource asks a DNS server to create or update its A (and optionally PTR) records, from the node that owns the role, with the cluster's identity; it fails when that node asks the wrong DNS server, when the zone won't take the update, when an existing record belongs to an identity the cluster can't act for, or when the computer object behind the name is disabled, missing, or out of sync. The event's reason text tells you which.&lt;/strong&gt; Microsoft's own guidance for the secure-zone case is narrow: "Ensure that cluster name object (CNO) is granted permissions to the Secure DNS Zone." Its failover clustering blog adds the detail that explains most 1196 and 1257 events after a rebuild or a hand-made record: "By default, all Authenticated Users have permissions to create a new record inside a secure zone. But if a record already exists, the security principal (in this case the cluster name identity) should have Full Control over the existing DNS record." Opening the whole zone to nonsecure updates fixes the symptom by removing the security that keeps one machine from overwriting another's name. Work through it as a chain: &lt;strong&gt;which name, which event, which node&lt;/strong&gt; → &lt;strong&gt;what does the event's reason or error code say?&lt;/strong&gt; → &lt;strong&gt;what does the name resource itself report?&lt;/strong&gt; → &lt;strong&gt;which DNS servers does the owner node ask, and can it reach them?&lt;/strong&gt; → &lt;strong&gt;does the zone accept the update?&lt;/strong&gt; → &lt;strong&gt;who owns the existing record?&lt;/strong&gt; → &lt;strong&gt;is the computer object behind the name healthy?&lt;/strong&gt; → &lt;strong&gt;is time or Kerberos in the way?&lt;/strong&gt; → &lt;strong&gt;change one link&lt;/strong&gt; → &lt;strong&gt;prove every DNS server answers with the right address.&lt;/strong&gt; &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;Get-ClusterResource&lt;/code&gt;, &lt;code&gt;Get-ClusterParameter&lt;/code&gt;, &lt;code&gt;Get-ClusterResourceDependency&lt;/code&gt;, &lt;code&gt;Get-DnsClientServerAddress&lt;/code&gt;, &lt;code&gt;Get-DnsClient&lt;/code&gt;, &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;Get-DnsServerZone&lt;/code&gt;, &lt;code&gt;Get-DnsServerResourceRecord&lt;/code&gt;, &lt;code&gt;Get-ADComputer&lt;/code&gt;, &lt;code&gt;Get-ADObject&lt;/code&gt;, and &lt;code&gt;Get-ClusterLog&lt;/code&gt; are the sources for that chain. Delete and recreate records "to be safe" and you may hand the name to the wrong owner, break every client that cached the old address, and still see the same event on the next failover.&lt;/p&gt;

&lt;p&gt;If the record vanished because DNS scavenging deleted it, &lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt; covers how aging and timestamps decide that. If a node lists a public resolver because someone wanted the internet to work, &lt;a href="https://dev.to/adminpackstudio/windows-dns-server-not-resolving-external-names-a-read-first-forwarder-root-hints-and-recursion-57fl"&gt;Windows DNS Server Not Resolving External Names&lt;/a&gt; covers the forwarder side, so the nodes can point only at your own DNS servers. This post covers &lt;strong&gt;"a failover cluster network name (the cluster name or a role's client access point) that won't register in DNS: Event 1196 with a reason such as 'DNS bad key' or 'DNS operation refused', Event 1195 with an error code, Event 1257 'access to update the secure DNS Zone was denied', 1256, 1258, 1259, 1260, 1578, 1579, or 1580, a name that resolves to an old address after a failover, or a role that won't come online on one node, and you need a read-first path before you delete records, loosen zone security, or run Repair."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read the reason, not just the event ID.&lt;/strong&gt; Event 1196 carries the DNS error as text ("for the following reason: %2"), and the name resource keeps the last result in its &lt;code&gt;StatusDNS&lt;/code&gt; parameter, which Microsoft defines as "The returned status code from the last DNS operation that the NetName resource performed." (Steps 2 and 3).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The owner node registers, through its own adapters.&lt;/strong&gt; The cluster registers "over some physical adapter that can reach a DNS server", so one node with a public or retired DNS server in its list can fail where the others succeed (Step 4).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The zone is the primary DNS suffix's zone.&lt;/strong&gt; Microsoft: "The registration for a cluster network name always happens in the zone corresponding to the Primary DNS Suffix of the host." (Step 5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An existing record needs the cluster's identity on its ACL.&lt;/strong&gt; A record created by hand, by DHCP, or by a cluster you've since rebuilt can block the update; read the record's owner before you touch it (Step 6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repair fixes the computer object, not DNS permissions.&lt;/strong&gt; Microsoft's Repair Active Directory Object is for the cluster name account's password mismatch, and it "will be greyed out unless the cluster's Name resource is offline." (Steps 7 and 9).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-register without an outage.&lt;/strong&gt; &lt;code&gt;Update-ClusterNetworkNameResource&lt;/code&gt; "registers existing Network Name resources with a DNS server in a way that doesn't interrupt cluster availability." (Step 9).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where in the chain did it break?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What should be true&lt;/th&gt;
&lt;th&gt;Typical symptom when it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Symptom captured&lt;/td&gt;
&lt;td&gt;Which network name, which event IDs and reason text, which node owned the role at the time, and what changed&lt;/td&gt;
&lt;td&gt;"The cluster name is broken" with no event text and no node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Event read&lt;/td&gt;
&lt;td&gt;The reason or error code is known and mapped to a cause&lt;/td&gt;
&lt;td&gt;Event 1196 noted, but nobody wrote down "DNS bad key" or "DNS operation refused"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Resource read&lt;/td&gt;
&lt;td&gt;The name resource, its IP dependencies, its DnsName, and its last DNS status are known&lt;/td&gt;
&lt;td&gt;The name is online with a warning; &lt;code&gt;StatusDNS&lt;/code&gt; isn't 0; an IP address resource is offline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Node DNS client&lt;/td&gt;
&lt;td&gt;Every node's cluster-facing adapters list only DNS servers that host your AD zones, and they answer&lt;/td&gt;
&lt;td&gt;One node points at a public resolver or a retired DC; Event 1258 names an unreachable server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Zone&lt;/td&gt;
&lt;td&gt;The zone that matches the primary DNS suffix exists, is AD-integrated, and accepts secure dynamic updates&lt;/td&gt;
&lt;td&gt;Event 1256 or 1578; a zone set to None; the name registered in the wrong zone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Record owner&lt;/td&gt;
&lt;td&gt;Either no record exists, or the existing record grants the cluster's identity rights to update it&lt;/td&gt;
&lt;td&gt;Event 1257, 1259, or 1580 after a rebuild, a hand-made record, or a DHCP registration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Computer object&lt;/td&gt;
&lt;td&gt;The CNO (and the role's VCO) exists, is enabled, is where the cluster expects it, and its password matches&lt;/td&gt;
&lt;td&gt;"Logon failure: unknown user name or bad password."; Events 1193, 1194, 1206, 1207; a disabled CNO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Time and Kerberos&lt;/td&gt;
&lt;td&gt;Nodes, DNS servers, and DCs agree on time, and the identity can get a ticket&lt;/td&gt;
&lt;td&gt;"DNS bad key", "DNS signature failed to verify.", or "DNS signature validity expired."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Change&lt;/td&gt;
&lt;td&gt;One link fixed, then the name re-registered&lt;/td&gt;
&lt;td&gt;Records deleted, zone loosened, and Repair run in one go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Proof&lt;/td&gt;
&lt;td&gt;Every DNS server returns the right address, &lt;code&gt;StatusDNS&lt;/code&gt; is 0, and a failover registers cleanly&lt;/td&gt;
&lt;td&gt;It works from one DC's DNS but not another's; the event returns on the next move&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1: Capture the symptom (read-only)
&lt;/h2&gt;

&lt;p&gt;Write these on the ticket first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The cluster's own name (core resource "Cluster Name", backed by the CNO) or a role's client access point (a file server, SQL Server instance, or other role, backed by a VCO). Different computer objects, possibly different record owners (Steps 6 and 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which events, with their full text&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1195 or 1196 with the reason or code; 1257, 1256, 1258, 1259, 1260, 1261, 1262, 1578, 1579, or 1580; 1069 or 1205 if the resource or role failed outright (Step 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which node owned the role&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The owner node does the registration, so the node in the event matters more than the node you're signed in to (Steps 3 and 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Is the name online?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Online with a warning means clients may still reach the old record; failed means the role is down. That sets your urgency, not your fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What resolves today&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The address each DNS server returns for the name, and the address the cluster expects (Steps 3 and 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Since when, and what changed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A cluster rebuild with the same name, a node added or rebuilt, a new DC or a retired one, adapter or IP changes, DNS zone changes, scavenging enabled, a record created or deleted by hand, a computer object moved or disabled, a restore&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then branch on what you see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it usually means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1196 with the reason "DNS bad key."&lt;/td&gt;
&lt;td&gt;The secure update's signature or key was rejected; often a non-AD DNS server in the node's list, a record the identity can't update, or a Kerberos or time problem&lt;/td&gt;
&lt;td&gt;Steps 4, 6, and 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1196 "DNS operation refused."&lt;/td&gt;
&lt;td&gt;The server refused the update: the zone doesn't take dynamic updates from this client, or the record's ACL blocks it&lt;/td&gt;
&lt;td&gt;Steps 5 and 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1195 with an error code&lt;/td&gt;
&lt;td&gt;The same failure reported as a number; look the number up (9017 is DNS bad key)&lt;/td&gt;
&lt;td&gt;Step 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1257 "access to update the secure DNS Zone was denied"&lt;/td&gt;
&lt;td&gt;Microsoft's guidance: "Ensure that cluster name object (CNO) is granted permissions to the Secure DNS Zone."&lt;/td&gt;
&lt;td&gt;Steps 6 and 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1580 "due to an existing record with this name"&lt;/td&gt;
&lt;td&gt;Microsoft's text: "the cluster identity does not have the sufficient privileges to update that record"&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1256 or 1578&lt;/td&gt;
&lt;td&gt;The zone doesn't accept dynamic updates, or the node's adapter is pointed at a server that doesn't&lt;/td&gt;
&lt;td&gt;Steps 4 and 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1258 "a DNS server could not be reached"&lt;/td&gt;
&lt;td&gt;The event names the server; the node can't reach it, or it's a server you retired&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1259 "failed clean up the existing records"&lt;/td&gt;
&lt;td&gt;Old records under the name can't be removed by the cluster's identity&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1262 PTR failed&lt;/td&gt;
&lt;td&gt;Reverse lookup zone missing or not dynamic, with PTR publishing turned on&lt;/td&gt;
&lt;td&gt;Steps 3 and 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1193, 1194, 1206, 1207, or "Logon failure: unknown user name or bad password."&lt;/td&gt;
&lt;td&gt;A computer object problem, not a DNS one&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registers on one node, fails on another&lt;/td&gt;
&lt;td&gt;That node's adapters, suffix, or DNS server list differ&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Started right after a cluster rebuild with the same name&lt;/td&gt;
&lt;td&gt;The records belong to the old CNO; Microsoft notes "The issue persists even if you destroy the cluster and then rebuild it."&lt;/td&gt;
&lt;td&gt;Steps 6 and 7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2: Read the event and its reason (read-only)
&lt;/h2&gt;

&lt;p&gt;Read the events from every node, not just the one you're on. Microsoft's own Event Viewer path is the System log filtered to the FailoverClustering source; this is the same read in PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: network name DNS events from the System log on every node&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$ids&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1069&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1195&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1196&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1205&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1257&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1258&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1259&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1260&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1261&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1262&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1578&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1579&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1580&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;50&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'System'&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;ProviderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Microsoft-Windows-FailoverClustering'&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ids&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Node'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then match the text against Microsoft's failover clustering event list:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Microsoft's message (excerpt)&lt;/th&gt;
&lt;th&gt;What to read next (our reading)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1195&lt;/td&gt;
&lt;td&gt;"failed registration of one or more associated DNS name(s). The error code was '%2'."&lt;/td&gt;
&lt;td&gt;Look up the code (table below)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1196&lt;/td&gt;
&lt;td&gt;"failed registration of one or more associated DNS name(s) for the following reason: %2."&lt;/td&gt;
&lt;td&gt;The reason is the DNS error text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1256&lt;/td&gt;
&lt;td&gt;"because the corresponding DNS Zone does not accept dynamic updates."&lt;/td&gt;
&lt;td&gt;Zone settings (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1257&lt;/td&gt;
&lt;td&gt;"because the access to update the secure DNS Zone was denied."&lt;/td&gt;
&lt;td&gt;Record owner and CNO rights (Steps 6 and 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1258&lt;/td&gt;
&lt;td&gt;"because the a DNS server could not be reached." (sic)&lt;/td&gt;
&lt;td&gt;The DNS server named in the event (Step 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1259&lt;/td&gt;
&lt;td&gt;"because the cluster service failed clean up the existing records corresponding to the network name."&lt;/td&gt;
&lt;td&gt;Old records and their owner (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1260 and 1261&lt;/td&gt;
&lt;td&gt;"Cluster network name resource failed to modify the DNS registration."&lt;/td&gt;
&lt;td&gt;The error code or reason in the event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1262&lt;/td&gt;
&lt;td&gt;"failed to publish the PTR record in the DNS reverse lookup zone."&lt;/td&gt;
&lt;td&gt;Reverse zone and PublishPTRRecords (Steps 3 and 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1578&lt;/td&gt;
&lt;td&gt;"The DNS server may not be configured to accept dynamic updates."&lt;/td&gt;
&lt;td&gt;Zone settings and the adapter's server list (Steps 4 and 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1579&lt;/td&gt;
&lt;td&gt;"failed to update the DNS record for name '%2' over adapter '%4'."&lt;/td&gt;
&lt;td&gt;Record owner (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1580&lt;/td&gt;
&lt;td&gt;"This was due to an existing record with this name and the cluster identity does not have the sufficient privileges to update that record."&lt;/td&gt;
&lt;td&gt;Record owner (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two text details matter when you search: Microsoft's 1256 and 1257 text says "associated DNS names(s)", and 1258 says "because the a DNS server could not be reached." Copy the event text as it is rather than retyping it.&lt;/p&gt;

&lt;p&gt;The reasons and codes come from the Win32 DNS error list. The ones that show up most in these events:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Microsoft's text&lt;/th&gt;
&lt;th&gt;Usually points at (our reading)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;9017 (0x2339)&lt;/td&gt;
&lt;td&gt;DNS_ERROR_RCODE_BADKEY&lt;/td&gt;
&lt;td&gt;"DNS bad key."&lt;/td&gt;
&lt;td&gt;The secure update itself: wrong server, record ACL, Kerberos, or time (Steps 4, 6, and 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9016 (0x2338)&lt;/td&gt;
&lt;td&gt;DNS_ERROR_RCODE_BADSIG&lt;/td&gt;
&lt;td&gt;"DNS signature failed to verify."&lt;/td&gt;
&lt;td&gt;Kerberos or time (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9018 (0x233A)&lt;/td&gt;
&lt;td&gt;DNS_ERROR_RCODE_BADTIME&lt;/td&gt;
&lt;td&gt;"DNS signature validity expired."&lt;/td&gt;
&lt;td&gt;Clock skew (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9005 (0x232D)&lt;/td&gt;
&lt;td&gt;DNS_ERROR_RCODE_REFUSED&lt;/td&gt;
&lt;td&gt;"DNS operation refused."&lt;/td&gt;
&lt;td&gt;Zone dynamic update setting or record ACL (Steps 5 and 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9002 (0x232A)&lt;/td&gt;
&lt;td&gt;DNS_ERROR_RCODE_SERVER_FAILURE&lt;/td&gt;
&lt;td&gt;"DNS server failure."&lt;/td&gt;
&lt;td&gt;The DNS server itself, or its AD-integrated zone not loading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9009 (0x2331)&lt;/td&gt;
&lt;td&gt;DNS_ERROR_RCODE_NOTAUTH&lt;/td&gt;
&lt;td&gt;"DNS server not authoritative for zone."&lt;/td&gt;
&lt;td&gt;The node asked a server that doesn't host the zone (Step 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9010 (0x2332)&lt;/td&gt;
&lt;td&gt;DNS_ERROR_RCODE_NOTZONE&lt;/td&gt;
&lt;td&gt;"DNS name in update or prereq is not in zone."&lt;/td&gt;
&lt;td&gt;Wrong zone for the name's suffix (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft's older 1196 troubleshooting page also says to "Check the system event log for Netlogon or DNS events that occurred near the time of the failover cluster event." Those are usually the same root cause seen from the node's own registration.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Read what the name resource reports (read-only)
&lt;/h2&gt;

&lt;p&gt;Find every network name, its state, and the node that owns it. The core cluster name lives in the group Microsoft's tools call Cluster Core Resources; roles carry their own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: every Network Name resource, its role, state, and owner node&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ResourceType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Network Name'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OwnerGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OwnerNode&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# The IP address resources each name depends on (an OR list in multi-subnet clusters)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResourceDependency&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Cluster Name'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResourceDependency&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'FS01'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then read the private parameters that drive DNS registration. &lt;code&gt;Get-ClusterParameter&lt;/code&gt; is Microsoft's tool for this: used with a Network Name resource, "you can obtain DNS-related information about the resource."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: the DNS-related parameters of one network name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Cluster Name'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Get-ClusterParameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DnsName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HostRecordTTL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RegisterAllProvidersIP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PublishPTRRecords&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StatusDNS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastDNSUpdateTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CreatingDC&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# The last DNS update time is a FILETIME; this turns it into a local date and time&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Cluster Name'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ClusterParameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastDNSUpdateTime&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;FromFileTime&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;int64&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the values against Microsoft's definitions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Microsoft's definition&lt;/th&gt;
&lt;th&gt;What to look for (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DnsName&lt;/td&gt;
&lt;td&gt;"The full DNS label associated with the Netname resource."&lt;/td&gt;
&lt;td&gt;The label you expect to see in DNS; the blog adds "It cannot be more than 63 characters in length."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StatusDNS&lt;/td&gt;
&lt;td&gt;"The returned status code from the last DNS operation that the NetName resource performed."&lt;/td&gt;
&lt;td&gt;0 means the last operation succeeded; 9017 is DNS bad key, 9005 is refused (Step 2's table)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LastDNSUpdateTime&lt;/td&gt;
&lt;td&gt;"The Last time, in 100 nanosecond units, recorded by the Netname registered DNS."&lt;/td&gt;
&lt;td&gt;A date from before the problem started means nothing has registered since&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HostRecordTTL&lt;/td&gt;
&lt;td&gt;"Time To Live (TTL) in seconds to be set for the resource records published for the cluster name."&lt;/td&gt;
&lt;td&gt;Default 1200; a long TTL explains clients that keep the old address after a fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RegisterAllProvidersIP&lt;/td&gt;
&lt;td&gt;"Setting this private property to 1 registers the IP addresses of all the provider IP address resources, independent of the online status of any individual provider IP address resource."&lt;/td&gt;
&lt;td&gt;Set to 1 in a multi-subnet cluster, you should see every subnet's address in DNS, not just the online one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PublishPTRRecords&lt;/td&gt;
&lt;td&gt;"Determines if PTR resource records, apart from A or AAAA, are published for the Cluster Name."&lt;/td&gt;
&lt;td&gt;1 with no dynamic reverse zone explains Event 1262&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CreatingDC&lt;/td&gt;
&lt;td&gt;Listed by Microsoft as a Network Name private property&lt;/td&gt;
&lt;td&gt;The DC the computer object was created on; useful when replication is in doubt (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Also check the IP address resources the name depends on. Microsoft's dependency example shows the name coming online when "EITHER" provider address does, so a name can be online while one address is offline and never registered:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: state and address of the IP resources behind the name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ResourceType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'IP Address'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ClusterParameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Address&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pscustomobject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OwnerGroup&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;StatusDNS 0 and LastDNSUpdateTime recent&lt;/td&gt;
&lt;td&gt;The last attempt worked; the event is old, or another node or name is failing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StatusDNS non-zero on every name&lt;/td&gt;
&lt;td&gt;A node-wide or zone-wide cause: DNS servers, zone settings, or time (Steps 4, 5, and 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StatusDNS non-zero on one name only&lt;/td&gt;
&lt;td&gt;That name's record or computer object (Steps 6 and 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An IP address resource offline or failed&lt;/td&gt;
&lt;td&gt;Fix the address first (network, subnet, or IP conflict); the name can't register an address that isn't online&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name online on one node, failing after a move&lt;/td&gt;
&lt;td&gt;Read Step 4 on the node it fails on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distributed Network Name (DNN) instead of Network Name&lt;/td&gt;
&lt;td&gt;A different resource type with its own properties (Microsoft describes a DNN as "an access point used by clients to connect to a Scale-Out File Server."); read its parameters the same way&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 4: Which DNS servers does the owner node ask? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's 1196 text is a DNS client instruction: "Ensure that the network adapters associated with dependent IP address resources are configured with at least one accessible DNS server." Read the adapters on every node, because the owner node does the work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: DNS servers, registration settings, and suffix per adapter, on every node&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Invoke-Command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ScriptBlock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-DnsClient&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Get-DnsClientServerAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AddressFamily&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPv4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ServerAddresses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;InterfaceIndex&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InterfaceIndex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pscustomobject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;COMPUTERNAME&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nx"&gt;Adapter&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;InterfaceAlias&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nx"&gt;Servers&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ServerAddresses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;', '&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nx"&gt;Register&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RegisterThisConnectionsAddress&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nx"&gt;UseSuffix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;UseSuffixWhenRegistering&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nx"&gt;Suffix&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ConnectionSpecificSuffix&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Every node lists the same DNS servers, all of them DCs or DNS servers that host your AD zones&lt;/td&gt;
&lt;td&gt;Good; move on to Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A node lists a public resolver, a firewall, or an ISP server, even second or third&lt;/td&gt;
&lt;td&gt;A server that doesn't host your zone can't take a secure update for it; this is a common source of "DNS bad key" and refused updates. Use forwarders on your DNS servers instead (&lt;a href="https://dev.to/adminpackstudio/windows-dns-server-not-resolving-external-names-a-read-first-forwarder-root-hints-and-recursion-57fl"&gt;Windows DNS Server Not Resolving External Names&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A node lists a DC that's been retired or is down&lt;/td&gt;
&lt;td&gt;Event 1258 names it; the node waits on it before it tries another&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nodes differ from each other&lt;/td&gt;
&lt;td&gt;Registration succeeds on some owners and fails on others; that's the "works until it fails over" pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Register is False on the cluster-facing adapter&lt;/td&gt;
&lt;td&gt;Microsoft's blog: "If this check box is turned off, the network name doesn't register in DNS for both the Primary DNS suffix and the connection specific DNS suffix."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A connection-specific suffix with UseSuffix True&lt;/td&gt;
&lt;td&gt;The name also registers in that suffix's zone, so that zone has to accept the update too&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage, live migration, or heartbeat adapters list DNS servers&lt;/td&gt;
&lt;td&gt;Usually not the adapters behind the name's IP resources; leave them unless they carry the name's address (our reading)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then prove the node can reach and query each server it lists, by name and by the zone's SOA:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: from the owner node, ask each listed DNS server about the zone and the name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$zone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'CLUSTER1.contoso.com'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.10'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.11'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;53&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ComputerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TcpTestSucceeded&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$zone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SOA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PrimaryServer&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TTL&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A server that can't return the zone's SOA isn't a server this node should be updating through (our reading). Microsoft's dynamic update article explains why the SOA matters: for a directory-integrated zone, "any DNS server that is loading the zone can respond and dynamically insert its own name as the primary server of the zone in the SOA query response."&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Does the zone accept the update? (read-only)
&lt;/h2&gt;

&lt;p&gt;The name registers in a predictable zone. From Microsoft's failover clustering blog: "The registration for a cluster network name always happens in the zone corresponding to the Primary DNS Suffix of the host." Check the node's primary suffix, then the zone on each DNS server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: the primary DNS suffix of each node (the zone the name registers in)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Invoke-Command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ScriptBlock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pscustomobject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;COMPUTERNAME&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nx"&gt;Domain&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_ComputerSystem&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Domain&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nx"&gt;Suffix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters'&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Domain&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: zone type, AD integration, and dynamic update setting on each DNS server&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC01'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC02'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerZone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Server'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ZoneName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ZoneType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IsDsIntegrated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DynamicUpdate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ReplicationScope&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DynamicUpdate Secure, IsDsIntegrated True&lt;/td&gt;
&lt;td&gt;The normal, safe setting; registration then depends on the record's ACL (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamicUpdate None&lt;/td&gt;
&lt;td&gt;Event 1256 or 1578. Microsoft's guidance: "Ensure that the DNS is configured as a Dynamic DNS zone. If the DNS server does not accept dynamic updates uncheck the 'Register this connection's' addresses in DNS' in the properties of the network adapter." Pick one on purpose: a dynamic zone, or static records you maintain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamicUpdate NonsecureAndSecure&lt;/td&gt;
&lt;td&gt;Updates are accepted without security; registration should work, and anyone can overwrite the name. Not a setting to adopt as the fix (see the change-vs-avoid table)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zone not AD-integrated&lt;/td&gt;
&lt;td&gt;Microsoft: "The secure dynamic update functionality is supported only for Active Directory-integrated zones."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zone missing on one DNS server&lt;/td&gt;
&lt;td&gt;That server can't take the update; the node may be asking it (Step 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary suffix differs between nodes, or doesn't match the zone&lt;/td&gt;
&lt;td&gt;The name registers in different zones depending on the owner node; fix the suffix, not the zone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A reverse zone is missing and PublishPTRRecords is 1&lt;/td&gt;
&lt;td&gt;Event 1262 only; the A record can still be fine&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If scavenging is on, read the record's timestamp too (Step 6). Microsoft's scavenging article: "Windows clients dynamically update DNS every 24 hours. All DDNS records are set to scavenge." A cluster name that can't refresh because of a 1257 can then age out and disappear, which turns a warning into an outage (&lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt; covers the aging rules).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Who owns the existing record? (read-only)
&lt;/h2&gt;

&lt;p&gt;This is the step most 1257, 1259, 1579, and 1580 events end at. Microsoft's dynamic update article states the default policy: clients "try to overwrite a previously registered resource record, unless they are specifically blocked by update security." In a secure zone, the record's ACL is that security. Read the record first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: the record as each DNS server holds it (Timestamp empty or 0 = static)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC01'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC02'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerResourceRecord&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ZoneName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'CLUSTER1'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Server'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HostName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RecordType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeToLive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Data'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RecordData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IPv4Address&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then read its owner and ACL. In an AD-integrated zone the record is a &lt;code&gt;dnsNode&lt;/code&gt; object; this reads it without changing anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: owner and ACL entries of the record object (domain-wide replication scope shown)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$dom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ADDomain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DistinguishedName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$rec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ADObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-SearchBase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DC=DomainDnsZones,&lt;/span&gt;&lt;span class="nv"&gt;$dom&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-LDAPFilter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'(&amp;amp;(objectClass=dnsNode)(name=CLUSTER1))'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nTSecurityDescriptor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;whenCreated&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$rec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DistinguishedName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;whenCreated&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$rec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nTSecurityDescriptor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Owner&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$rec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nTSecurityDescriptor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Access&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IdentityReference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'CLUSTER1|Authenticated Users|Everyone|DnsUpdateProxy'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IdentityReference&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ActiveDirectoryRights&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AccessControlType&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In DNS Manager, the same read is the record's &lt;strong&gt;Properties &amp;gt; Security&lt;/strong&gt; tab (on older consoles, &lt;strong&gt;View &amp;gt; Advanced&lt;/strong&gt; first). Read the results like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No record exists&lt;/td&gt;
&lt;td&gt;The cluster should be able to create one; Microsoft's blog: "By default, all Authenticated Users have permissions to create a new record inside a secure zone." If it still fails, the cause is the zone, the server, or time (Steps 4, 5, and 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Owner is the CNO (or the role's computer object) and it has Full Control&lt;/td&gt;
&lt;td&gt;Ownership is fine; look at Steps 7 and 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Owner is a user or an admin account, Timestamp empty&lt;/td&gt;
&lt;td&gt;Somebody created a static record by hand; the cluster's identity has no rights on it. The blog: "if a record already exists, the security principal (in this case the cluster name identity) should have Full Control over the existing DNS record."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Owner is a SID that doesn't resolve&lt;/td&gt;
&lt;td&gt;The identity that created it is gone: often the CNO of a cluster you destroyed and rebuilt with the same name (the new CNO is a new object with a new SID)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Owner is a DHCP server or the DnsUpdateProxy group&lt;/td&gt;
&lt;td&gt;DHCP registered the address before the cluster did. Microsoft explains the general rule: "After the DHCP server becomes the owner of the client name, only that DHCP server can update the name."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The record exists in one DNS partition and the zone in another&lt;/td&gt;
&lt;td&gt;A leftover copy from an old replication scope; read both partitions before you assume which one clients get&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Record timestamp old, zone scavenging on&lt;/td&gt;
&lt;td&gt;It's refreshing on time or it's about to be scavenged (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a zone stored in the forest-wide partition, use &lt;code&gt;DC=ForestDnsZones&lt;/code&gt; and the forest root in &lt;code&gt;-SearchBase&lt;/code&gt; instead. For a role's name (FS01, a SQL Server instance), repeat with that name; Microsoft's 1580 text refers to "the cluster identity" and its record, so compare the record's owner with both the CNO and the role's own computer object rather than guessing which one should be there.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Is the computer object behind the name healthy? (read-only)
&lt;/h2&gt;

&lt;p&gt;The network name acts as a computer account in AD: the CNO for the cluster name, and a VCO for each role's client access point. Microsoft's description: "Through the CNO, virtual computer objects (VCOs) are automatically created when you set up clustered roles that use client access points." Read both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: the CNO and a VCO, as one DC sees them&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADComputer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'CLUSTER1'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DistinguishedName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;whenCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordLastSet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ObjectGUID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DistinguishedName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;whenCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordLastSet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ObjectGUID&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADComputer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'FS01'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DistinguishedName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordLastSet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DistinguishedName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordLastSet&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# The GUID the name resource expects, to compare with the AD object above&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Cluster Name'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ClusterParameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ObjectGUID&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Enabled True, GUIDs match, PasswordLastSet recent&lt;/td&gt;
&lt;td&gt;The object is healthy; the failure is DNS-side (Steps 4 to 6 and 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enabled False&lt;/td&gt;
&lt;td&gt;Microsoft's first resolution step for the rebuilt-cluster 1257 case is to "Verify that the CNO exists in Active Directory, and that it isn't disabled." A prestaged CNO is created disabled on purpose, but a running cluster's CNO shouldn't stay that way&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object not found&lt;/td&gt;
&lt;td&gt;Deleted or moved to a container the cluster can't see; restore it from the AD Recycle Bin if it's there rather than creating a new one with the same name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GUIDs differ&lt;/td&gt;
&lt;td&gt;The AD object with that name isn't the one the cluster created; often a rebuild or a hand-made replacement, and the DNS record ACL usually points at the old one (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event text "Logon failure: unknown user name or bad password."&lt;/td&gt;
&lt;td&gt;Microsoft: "the password for the cluster name account no longer matches the corresponding password stored by the clustering software." Repair Active Directory Object is the documented fix (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Events 1193 or 1194 for a role&lt;/td&gt;
&lt;td&gt;The CNO couldn't create the VCO. Microsoft's checklist: the cluster identity "can create computer objects", "The quota for computer objects has not been reached.", and an existing object grants the cluster identity "'Full Control' permission to that computer object"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Events 1206 or 1207&lt;/td&gt;
&lt;td&gt;Microsoft: "The cluster identity '%5' may lack permissions required to update the object."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Events 1211 or 1212&lt;/td&gt;
&lt;td&gt;The node couldn't find a writable DC; Microsoft's guidance adds "Also ensure that the DNS server is running in order to resolve the name of the domain controller."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rights Microsoft documents for these objects:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Object&lt;/th&gt;
&lt;th&gt;Right&lt;/th&gt;
&lt;th&gt;Where Microsoft says it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CNO on its OU or container&lt;/td&gt;
&lt;td&gt;"Create Computer objects and Read all properties"&lt;/td&gt;
&lt;td&gt;Troubleshoot issues with accounts used by failover clusters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNO on each VCO&lt;/td&gt;
&lt;td&gt;"Full control"&lt;/td&gt;
&lt;td&gt;Same article; and Prestage cluster computer objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNO on the secure DNS zone (rebuilt-cluster 1257 case)&lt;/td&gt;
&lt;td&gt;"the Create all child objects and Write all properties permissions"&lt;/td&gt;
&lt;td&gt;Cluster role doesn't come online after you rebuild the cluster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster identity on an existing DNS record&lt;/td&gt;
&lt;td&gt;"Full Control over the existing DNS record"&lt;/td&gt;
&lt;td&gt;DNS Registration with the Network Name Resource (failover clustering blog)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default Computers container&lt;/td&gt;
&lt;td&gt;"a cluster administrator can create up to 10 VCOs without any additional configuration"&lt;/td&gt;
&lt;td&gt;Prestage cluster computer objects&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 8: Is time or Kerberos in the way? (read-only)
&lt;/h2&gt;

&lt;p&gt;A secure update is signed with the identity's Kerberos credentials, so "DNS bad key", "DNS signature failed to verify.", and "DNS signature validity expired." can be identity or clock problems rather than DNS ones (our reading). Read time and tickets from the owner node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: time offset of each node against a DC, and the node's own secure channel&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Invoke-Command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ScriptBlock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;w32tm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/stripchart&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/computer:DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/samples:3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/dataonly&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;w32tm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/status&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;REM On the owner node, elevated: tickets held by the computer (SYSTEM) logon session
klist -li 0x3e7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Offsets of a few seconds&lt;/td&gt;
&lt;td&gt;Not the cause&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A node minutes off, or syncing from its host or a local clock&lt;/td&gt;
&lt;td&gt;Fix time first; &lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt; covers the w32tm and VM integration chain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kerberos errors in the System log near the 1196 (for example, the target principal name is incorrect)&lt;/td&gt;
&lt;td&gt;The DNS server's or DC's identity doesn't match its name; &lt;a href="https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak"&gt;The Target Principal Name Is Incorrect&lt;/a&gt; covers that chain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The DNS server in the node's list is a non-Windows server for your AD zone&lt;/td&gt;
&lt;td&gt;Secure updates may not be supported there at all; Microsoft's older 1196 page notes a hotfix for third-party BIND servers on Windows Server 2008 R2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time and Kerberos both clean&lt;/td&gt;
&lt;td&gt;Go back to Steps 4 and 6; BADKEY is then most often the server or the record&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 9: Change one link, then re-register (a change)
&lt;/h2&gt;

&lt;p&gt;Fix only what Steps 2 to 8 showed, then re-register the name and read the result before changing anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The node's DNS server list (Step 4).&lt;/strong&gt; Point every cluster-facing adapter at your AD DNS servers only, the same list on every node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change, on the node that was wrong: replace its DNS server list on one adapter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-DnsClientServerAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-InterfaceAlias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Mgmt'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ServerAddresses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.10'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.11'&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Re-read it&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsClientServerAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-InterfaceAlias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Mgmt'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AddressFamily&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPv4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The adapter's registration setting (Step 4).&lt;/strong&gt; If the cluster-facing adapter had registration turned off and the zone is dynamic, turn it back on for that adapter (&lt;code&gt;Set-DnsClient -InterfaceAlias 'Mgmt' -RegisterThisConnectionsAddress $true&lt;/code&gt;). If the zone is meant to be static, leave it off and maintain the records yourself, on purpose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The zone's dynamic update setting (Step 5).&lt;/strong&gt; If an AD-integrated zone was set to None by mistake, set it to secure only, not to nonsecure. Microsoft's &lt;code&gt;-DynamicUpdate&lt;/code&gt; values are None, Secure, and NonsecureAndSecure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change: AD-integrated zone back to secure dynamic updates only&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-DnsServerPrimaryZone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DynamicUpdate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Secure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The record's ACL (Step 6).&lt;/strong&gt; For an existing record the cluster can't update, the narrow fix is the record, not the zone: in DNS Manager, open the record's &lt;strong&gt;Properties &amp;gt; Security&lt;/strong&gt;, add the cluster's computer object (CLUSTER1$; enable &lt;strong&gt;Computers&lt;/strong&gt; in Object Types), and give it &lt;strong&gt;Full control&lt;/strong&gt;, as Microsoft's blog describes. For the rebuilt-cluster case, Microsoft's documented resolution is the zone-level grant: on the zone's &lt;strong&gt;Properties &amp;gt; Security&lt;/strong&gt;, "Verify that the CNO has the Create all child objects and Write all properties permissions. If the permissions are missing, configure them."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A stale record you've decided to remove (Step 6).&lt;/strong&gt; Only when its owner is gone or wrong and the cluster can't take it over. Microsoft's &lt;code&gt;Remove-DnsServerResourceRecord&lt;/code&gt; deletes "all records that match RRtype and Name" unless you give &lt;code&gt;-RecordData&lt;/code&gt;, so name the address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change: remove one stale A record by its address, previewing first&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Remove-DnsServerResourceRecord&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ZoneName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RRType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'A'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'CLUSTER1'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RecordData&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.50'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WhatIf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Remove-DnsServerResourceRecord&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ZoneName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RRType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'A'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'CLUSTER1'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RecordData&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.50'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clients that cached the old record keep it for its TTL, and the name doesn't resolve until the cluster re-registers, so do this in a window and re-register right away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The computer object (Step 7).&lt;/strong&gt; If the object is disabled and it's the running cluster's CNO, enable it (&lt;code&gt;Enable-ADAccount -Identity 'CLUSTER1$'&lt;/code&gt;). For the password mismatch, use Microsoft's procedure in Failover Cluster Manager: expand &lt;strong&gt;Cluster Core Resources&lt;/strong&gt;, under &lt;strong&gt;Cluster Name&lt;/strong&gt; right-click the &lt;strong&gt;Name&lt;/strong&gt; item and select &lt;strong&gt;Take Offline&lt;/strong&gt;, then &lt;strong&gt;More Actions &amp;gt; Repair Active Directory Object&lt;/strong&gt;. Microsoft notes that "Taking the cluster's Name resource offline shouldn't negatively impact other cluster groups, such as the SQL Server Failover Cluster Instance." Bring the name back online afterwards. Microsoft's account troubleshooting article also covers the CNO's rights on its container and on each VCO, and the computer account quota (ms-DS-MachineAccountQuota) when VCO creation fails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Re-register the name.&lt;/strong&gt; Use the online path first, then read the status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A change, without taking the name offline: re-register network names in DNS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Cluster Name'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Update-ClusterNetworkNameResource&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'FS01'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Update-ClusterNetworkNameResource&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read the result&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Cluster Name'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ClusterParameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StatusDNS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastDNSUpdateTime&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it still fails, take that one name offline and back online in a window (&lt;code&gt;Stop-ClusterResource -Name 'FS01'&lt;/code&gt; then &lt;code&gt;Start-ClusterResource -Name 'FS01'&lt;/code&gt;). Microsoft's &lt;code&gt;Stop-ClusterResource&lt;/code&gt; example notes: "Before taking the resource offline, it takes offline any dependent resources." For a role's name, that means the role's clients lose it, so read the dependency report first. Taking a name offline doesn't clean DNS either; the blog: "Offlining a network name resources does not delete the DNS records on the server. They are only cleaned up when a network name resource is deleted from the cluster."&lt;/p&gt;

&lt;p&gt;When the event is gone, collect the logs anyway if it took more than one change; Microsoft's data collection step for this issue is &lt;code&gt;Get-ClusterLog -UseLocalTime -Destination&lt;/code&gt; with a folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: cluster log from every node for the last 30 minutes, local time, copied here&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseLocalTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-TimeSpan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Destination&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Temp\ClusterLogs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Select-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Temp\ClusterLogs\&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Pattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DNS'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Last&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;40&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 10: Prove every DNS server answers with the right address (read-only)
&lt;/h2&gt;

&lt;p&gt;Ask every DNS server that clients use, not just the one the node used, and then make the cluster register from another node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: what each DNS server returns for each network name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$names&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'CLUSTER1.contoso.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'FS01.contoso.com'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$servers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.10'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.11'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.1.0.10'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$servers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$nm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$nm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Server'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TTL&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: the cluster's own view after the change&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ResourceType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Network Name'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$st&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ClusterParameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StatusDNS&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pscustomobject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Owner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OwnerNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StatusDNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$st&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in a window, move the role to each other node and read the events and &lt;code&gt;StatusDNS&lt;/code&gt; again. Microsoft's own resolution for the rebuild case ends the same way: "To test the cluster, perform a manual failover." and "Review the event logs to verify that DNS registration succeeds and doesn't generate permission errors."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A deliberate move (the role restarts on the other node), then the same reads&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Move-ClusterGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'FS01'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HVN01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'FS01'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ClusterParameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StatusDNS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastDNSUpdateTime&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass criteria (our reading): every DNS server returns the expected addresses (all subnets if RegisterAllProvidersIP is 1); &lt;code&gt;StatusDNS&lt;/code&gt; is 0 for every network name; LastDNSUpdateTime is after your change; no new 1195, 1196, 1257, 1258, 1259, 1578, 1579, or 1580 on any node after a move; the record's owner and ACL include the cluster's identity; and &lt;code&gt;Test-Cluster -Include 'Network'&lt;/code&gt; (Microsoft lists Network among the validation test types) runs clean if you changed adapters.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common false starts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;False start&lt;/th&gt;
&lt;th&gt;Why it doesn't help (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Running &lt;code&gt;ipconfig /registerdns&lt;/code&gt; on the node&lt;/td&gt;
&lt;td&gt;Microsoft describes it as a way "to manually force an update of the client name registration in DNS." It's the node's own name, not the cluster's network names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deleting every record for the name "to be safe"&lt;/td&gt;
&lt;td&gt;Without &lt;code&gt;-RecordData&lt;/code&gt;, removal deletes all records matching the name and type; clients lose the name until the cluster re-registers, and the cause (server, zone, or identity) is still there&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Giving Authenticated Users or Everyone full control of the zone&lt;/td&gt;
&lt;td&gt;Fixes the symptom by letting any account overwrite any record in the zone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switching the zone to nonsecure updates&lt;/td&gt;
&lt;td&gt;Same: every client can then overwrite the name, including the cluster's&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running Repair for a 1257&lt;/td&gt;
&lt;td&gt;Repair Active Directory Object is Microsoft's fix for the cluster name account's password; it doesn't change the record's ACL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recreating the CNO by hand with the same name&lt;/td&gt;
&lt;td&gt;A new object with a new SID; the old record ACL and the cluster's stored GUID still point at the old one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creating a static A record so it resolves&lt;/td&gt;
&lt;td&gt;Works until the next failover or address change, and the cluster's identity can't update it unless you grant it rights (Microsoft's 1196 page does say to recreate a deleted or scavenged record; if you do, give the cluster's identity Full Control on it)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing from the node you're signed in to&lt;/td&gt;
&lt;td&gt;The owner node registers; test the node in the event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reading one DC's DNS&lt;/td&gt;
&lt;td&gt;Each DNS server answers from its own copy; replication may not have arrived yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lowering HostRecordTTL as the fix&lt;/td&gt;
&lt;td&gt;Changes how fast clients notice a correct record; it doesn't make registration succeed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clearing the client DNS cache and calling it fixed&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Clear-DnsClientCache&lt;/code&gt; changes what one client remembers, not what the server holds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When a change is justified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One node lists a public or retired DNS server&lt;/td&gt;
&lt;td&gt;The same AD DNS servers on every node's cluster-facing adapters&lt;/td&gt;
&lt;td&gt;Adding more DNS servers to the list until one works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zone set to None by mistake&lt;/td&gt;
&lt;td&gt;Secure only on the AD-integrated zone&lt;/td&gt;
&lt;td&gt;NonsecureAndSecure as the fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hand-made or DHCP-owned record blocks the update&lt;/td&gt;
&lt;td&gt;Full control for the cluster's computer object on that record&lt;/td&gt;
&lt;td&gt;Full control for Authenticated Users or Everyone on the zone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rebuilt cluster with the same name, Event 1257&lt;/td&gt;
&lt;td&gt;Microsoft's grant to the new CNO on the zone, or a record ACL that names the new CNO&lt;/td&gt;
&lt;td&gt;Recreating the CNO by hand to match the old SID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stale record whose owner is gone&lt;/td&gt;
&lt;td&gt;Remove that record by its address in a window, then re-register at once&lt;/td&gt;
&lt;td&gt;Removing every record for the name without &lt;code&gt;-RecordData&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNO disabled&lt;/td&gt;
&lt;td&gt;Enable it, then read the object's location and rights&lt;/td&gt;
&lt;td&gt;Creating a second object with the same name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Logon failure: unknown user name or bad password."&lt;/td&gt;
&lt;td&gt;Take the cluster Name offline and run Repair Active Directory Object&lt;/td&gt;
&lt;td&gt;Repair as a fix for DNS ACL errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node clock off&lt;/td&gt;
&lt;td&gt;Fix time on the node and its source first&lt;/td&gt;
&lt;td&gt;Loosening DNS security to work around a Kerberos failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name registered but clients still get the old address&lt;/td&gt;
&lt;td&gt;Wait out or lower HostRecordTTL on purpose, and flush the clients that matter&lt;/td&gt;
&lt;td&gt;Deleting and recreating the record again&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does "Cluster network name resource failed registration of one or more associated DNS name(s)" mean?&lt;/strong&gt;&lt;br&gt;
The network name couldn't create or update its DNS records from the node that owns it. Event 1196 adds the DNS error as text after "for the following reason:", and Event 1195 gives it as a code. Read that reason, the name's &lt;code&gt;StatusDNS&lt;/code&gt;, and the owner node's DNS server list before you change anything (Steps 2 to 4).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I fix Event 1196 "DNS bad key" on a failover cluster?&lt;/strong&gt;&lt;br&gt;
Check, in order: that every node's cluster-facing adapter lists only your AD DNS servers; that the zone is AD-integrated and set to secure updates; that the existing record grants the cluster's computer object rights to update it; and that the node's clock and Kerberos are healthy. Fix the one that's wrong, then run &lt;code&gt;Update-ClusterNetworkNameResource&lt;/code&gt; and read &lt;code&gt;StatusDNS&lt;/code&gt; again (Steps 4 to 9).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What permissions does the cluster name object need on DNS for Event 1257?&lt;/strong&gt;&lt;br&gt;
Microsoft's guidance in the event is "Ensure that cluster name object (CNO) is granted permissions to the Secure DNS Zone." For a rebuilt cluster, its resolution is the zone-level "Create all child objects and Write all properties" for the CNO; for one existing record, the narrower fix is Full control for the cluster's identity on that record (Steps 6 and 9).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Repair Active Directory Object fix DNS registration?&lt;/strong&gt;&lt;br&gt;
Not by itself. Microsoft documents Repair for the case where "the password for the cluster name account no longer matches the corresponding password stored by the clustering software." It's greyed out until the cluster Name resource is offline. A 1257 caused by a record ACL needs the ACL fixed (Steps 7 and 9).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I re-register a cluster name in DNS without downtime?&lt;/strong&gt;&lt;br&gt;
Run &lt;code&gt;Get-ClusterResource -Name 'Cluster Name' | Update-ClusterNetworkNameResource&lt;/code&gt; (or the role's name), which Microsoft says works "in a way that doesn't interrupt cluster availability." Then read &lt;code&gt;StatusDNS&lt;/code&gt; and &lt;code&gt;LastDNSUpdateTime&lt;/code&gt;, and ask every DNS server for the name (Steps 9 and 10).&lt;/p&gt;




&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt; (when the cluster name's record was aged out and deleted)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/windows-dns-server-not-resolving-external-names-a-read-first-forwarder-root-hints-and-recursion-57fl"&gt;Windows DNS Server Not Resolving External Names&lt;/a&gt; (when nodes list a public resolver because the forwarders were wrong)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak"&gt;The Target Principal Name Is Incorrect&lt;/a&gt; (when the secure update fails on Kerberos between the node and the DNS server)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt; (when "DNS bad key" or "signature validity expired" comes from clock skew)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free checklist
&lt;/h2&gt;

&lt;p&gt;Giving the whole zone to Authenticated Users, or switching it to nonsecure updates, before anyone read which record and which identity failed, is a change made everywhere at once. So is a Conditional Access policy enforced before anyone read the report-only results. The free &lt;strong&gt;Conditional Access pre-enforcement checklist&lt;/strong&gt; keeps break-glass accounts, pilot groups, and report-only review on one page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=cluster-network-name-failed-registration" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=cluster-network-name-failed-registration&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the &lt;strong&gt;Intune &amp;amp; M365 Admin Starter Pack&lt;/strong&gt; pairs with this triage: &lt;a href="https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=cluster-network-name-failed-registration" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=cluster-network-name-failed-registration&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Admin Pack Studio; not affiliated with Microsoft. Steps 1-8 and 10 are read-only checks: &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;Get-ClusterNode&lt;/code&gt;, &lt;code&gt;Get-ClusterResource&lt;/code&gt;, &lt;code&gt;Get-ClusterParameter&lt;/code&gt;, &lt;code&gt;Get-ClusterResourceDependency&lt;/code&gt;, &lt;code&gt;Get-DnsClient&lt;/code&gt;, &lt;code&gt;Get-DnsClientServerAddress&lt;/code&gt;, &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;Get-DnsServerZone&lt;/code&gt;, &lt;code&gt;Get-DnsServerResourceRecord&lt;/code&gt;, &lt;code&gt;Get-ADObject&lt;/code&gt;, &lt;code&gt;Get-ADComputer&lt;/code&gt;, &lt;code&gt;w32tm /stripchart&lt;/code&gt; and &lt;code&gt;/query /status&lt;/code&gt;, &lt;code&gt;klist&lt;/code&gt;, and &lt;code&gt;Get-ClusterLog&lt;/code&gt;. Changing DNS server lists or adapter registration, zone dynamic update settings, record or zone permissions, removing records, enabling or repairing computer objects, re-registering or restarting network names, and moving roles are deliberate changes. Change one link at a time, prove it from every DNS server and every node, and check current Microsoft Learn for version-specific behavior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windowsserver</category>
      <category>dns</category>
      <category>sysadmin</category>
      <category>powershell</category>
    </item>
    <item>
      <title>FSMO Role Transfer Failed: A Read-First Owner, Replication, Permission, and Seize-or-Wait Triage</title>
      <dc:creator>AdminPackStudio</dc:creator>
      <pubDate>Mon, 19 Oct 2026 10:41:06 +0000</pubDate>
      <link>https://dev.to/adminpackstudio/fsmo-role-transfer-failed-a-read-first-owner-replication-permission-and-seize-or-wait-triage-55bg</link>
      <guid>https://dev.to/adminpackstudio/fsmo-role-transfer-failed-a-read-first-owner-replication-permission-and-seize-or-wait-triage-55bg</guid>
      <description>&lt;p&gt;Helpdesk: "DC01 died Saturday night (the vendor says the replacement board won't arrive before Thursday). Since then nobody can create new user accounts on one of the remaining DCs, and a password reset took ages to show up. Someone tried to move the roles to DC02 in Active Directory Users and Computers and got 'The current FSMO holder could not be contacted.' A forum post says to seize all five roles with ntdsutil right now, then just power DC01 back on when the board comes. Can we do that?"&lt;/p&gt;

&lt;p&gt;Not that way. &lt;strong&gt;"FSMO role transfer failed" usually isn't a broken role. A transfer is a conversation between the current holder and the new one, so it fails whenever the current holder is offline, unreachable, not yet replicated since it last started, or recorded as a server that no longer exists; a seizure skips that conversation, which is why it's a one-way decision about the old DC, not a stronger retry.&lt;/strong&gt; Microsoft's guidance is blunt about both halves: "Role seizure should be performed only as a last resort", and "Do not allow a former operations master role holder whose role has been seized to return to an online domain controller." Seizing all five roles and then powering DC01 back on is the one combination that page warns about. Microsoft also notes that "FSMO roles assigned to domain controllers that are offline or in an error state only have to be transferred or seized if role-dependent operations are being done", so the first question is which operations are actually failing. Work through it as a chain: &lt;strong&gt;which roles, and what's failing because of them&lt;/strong&gt; → &lt;strong&gt;who owns each role, according to more than one DC?&lt;/strong&gt; → &lt;strong&gt;is the current holder online and replicating?&lt;/strong&gt; → &lt;strong&gt;is the target DC the right one?&lt;/strong&gt; → &lt;strong&gt;does your account have the rights for this role?&lt;/strong&gt; → &lt;strong&gt;transfer, wait, or seize?&lt;/strong&gt; → &lt;strong&gt;transfer it properly&lt;/strong&gt; → &lt;strong&gt;seize it properly, only if Step 6 says so&lt;/strong&gt; → &lt;strong&gt;clean up the old DC and the owners that still point at it&lt;/strong&gt; → &lt;strong&gt;prove every DC agrees.&lt;/strong&gt; &lt;code&gt;netdom query fsmo&lt;/code&gt;, &lt;code&gt;Get-ADDomain&lt;/code&gt;, &lt;code&gt;Get-ADForest&lt;/code&gt;, &lt;code&gt;Get-ADObject&lt;/code&gt; on the role objects, &lt;code&gt;dcdiag /test:KnowsOfRoleHolders&lt;/code&gt;, &lt;code&gt;repadmin /replsummary&lt;/code&gt;, &lt;code&gt;Get-ADReplicationPartnerMetadata&lt;/code&gt;, &lt;code&gt;Get-ADDomainController&lt;/code&gt;, and &lt;code&gt;whoami /groups&lt;/code&gt; are the sources for that chain. Seize every role "to be safe" and you may burn RID space, leave a stale owner in a DNS application partition, and create a duplicate role holder the day the old hardware comes back.&lt;/p&gt;

&lt;p&gt;If the role holder can't be reached because replication itself fails with RPC errors, &lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt; covers that side first. If the new PDC emulator now has to become the forest's time source, &lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt; covers the time chain. This post covers &lt;strong&gt;"an operations master (FSMO) role won't transfer, or you're deciding whether to seize it: 'The requested FSMO operation failed. The current FSMO holder could not be contacted.', 0x20AF or 0x20AE from ntdsutil or PowerShell, 'Access is denied' when you try, a role owner that shows a deleted DC, a demotion that can't determine role ownership, or a role holder that died and isn't coming back, and you need a read-first path before you run &lt;code&gt;seize&lt;/code&gt; or &lt;code&gt;-Force&lt;/code&gt;."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transfer needs the old holder; seize doesn't, and that's the risk.&lt;/strong&gt; Microsoft: "We recommend that you only seize all roles when the previous role holder isn't returning to the domain." (Step 6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the owners from more than one DC.&lt;/strong&gt; &lt;code&gt;dcdiag&lt;/code&gt;'s KnowsOfRoleHolders test "doesn't check all DCs knowledge for consistency", so compare &lt;code&gt;netdom query fsmo&lt;/code&gt; and the &lt;code&gt;fSMORoleOwner&lt;/code&gt; values from each DC (Step 2).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A holder that just restarted isn't a holder yet.&lt;/strong&gt; "The DC waits until it receives inbound replication for its naming context" before acting on a role, and so does a new holder after a transfer (Steps 3 and 10).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect ntdsutil to the new holder, not the dead one.&lt;/strong&gt; In Microsoft's procedure, the server you connect to "is the name of the DC that you want to assign the Operation Master role to." (Steps 7 and 8).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seizing the RID master costs RIDs.&lt;/strong&gt; "The Move-ADDirectoryServerOperationMasterRole cmdlet increases the next Rid pool by 30,000 from what it finds in Active Directory." (Step 8).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After a seizure, the old DC never comes back as it was.&lt;/strong&gt; Clean up its metadata, and rebuild it from scratch if you want it as a DC again (Step 9).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where in the chain did it break?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What should be true&lt;/th&gt;
&lt;th&gt;Typical symptom when it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Symptom captured&lt;/td&gt;
&lt;td&gt;Which roles, which operations fail because of them, which DC you ran the move from and as whom, the full error, and whether the old holder is coming back&lt;/td&gt;
&lt;td&gt;"FSMO is broken" with no role, no error text, and no decision about the old DC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Owners read&lt;/td&gt;
&lt;td&gt;Every DC names the same owner for each role, and every owner is a live, writable DC&lt;/td&gt;
&lt;td&gt;Owners differ between DCs; an owner with a deleted (DEL) name; an owner nobody recognizes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Holder reachable&lt;/td&gt;
&lt;td&gt;The current holder is online, answering, and has replicated inbound since it last started&lt;/td&gt;
&lt;td&gt;0x20AF "The current FSMO holder could not be contacted."; replication failures on the holder or the target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Target right&lt;/td&gt;
&lt;td&gt;The new holder is in the same domain, writable, healthy, up to date, and fits the global catalog rule for the infrastructure master&lt;/td&gt;
&lt;td&gt;Transfer to an RODC; a target that's itself failing replication; infrastructure master on a GC in a domain that still needs it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Rights&lt;/td&gt;
&lt;td&gt;The account is in the group each role needs, in an elevated session&lt;/td&gt;
&lt;td&gt;"Access is denied"; a terminating permission error from PowerShell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Decision&lt;/td&gt;
&lt;td&gt;Transfer when the holder is up, wait when nothing needs the role yet, seize only when the holder isn't returning&lt;/td&gt;
&lt;td&gt;All five roles seized for a DC that's back in two days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Transfer&lt;/td&gt;
&lt;td&gt;The role moves with the holder's cooperation, from the right tool, to the right DC&lt;/td&gt;
&lt;td&gt;Transfer run against the dead DC; FQDN passed straight to &lt;code&gt;-Identity&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Seize&lt;/td&gt;
&lt;td&gt;The role is seized on the right DC after replication has caught up, and the RID warning is understood&lt;/td&gt;
&lt;td&gt;"Search failed to find any Domain Controllers"; RID pool jump nobody expected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Cleanup&lt;/td&gt;
&lt;td&gt;The old DC's metadata is gone, no role owner (including DNS application partitions) points at it, and time follows the new PDC&lt;/td&gt;
&lt;td&gt;Demotion or adprep fails later; the old DC returns and claims roles; time drifts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Proof&lt;/td&gt;
&lt;td&gt;Every DC reports the new owner and the role-dependent operation works&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;netdom&lt;/code&gt; agrees on one DC and not another; account creation still fails&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1: Capture the symptom (read-only)
&lt;/h2&gt;

&lt;p&gt;Write these on the ticket first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which roles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Schema master and domain naming master are forest-wide; PDC emulator, RID master, and infrastructure master are per domain. A move of the forest roles needs different groups and is checked against the forest root (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What's failing because of them&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Creating users, groups, or computers on a DC whose RID pool runs out (RID master); password changes, lockouts, Group Policy edits, or time (PDC emulator); adding or removing a domain or application partition (domain naming master); schema updates (schema master); cross-domain group member names or &lt;code&gt;adprep /rodcprep&lt;/code&gt; (infrastructure master). If nothing is failing, you may have time (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Current holder and its state&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Is it powered off, unreachable, booting, restored from backup, force-demoted, or reinstalled? Is it coming back, and when? This is the seize decision (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target DC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Name, domain, site, global catalog or not, writable or read-only (Step 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tool, place, and account&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Active Directory Users and Computers, Domains and Trusts, the Schema snap-in, ntdsutil, or &lt;code&gt;Move-ADDirectoryServerOperationMasterRole&lt;/code&gt;; run on which computer, as which account, elevated or not (Steps 5 and 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full error text&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The whole ntdsutil or PowerShell output, including the hex code (0x20AF, 0x20AE) and any "proceeding with seizure" line (Steps 3 and 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Since when, and what changed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hardware failure, a forced demotion, a restore, a new DC that reused an old DC's name or IP address, a DNS change, a site or firewall change&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then branch on what you see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it usually means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0x20AF "The requested FSMO operation failed. The current FSMO holder could not be contacted."&lt;/td&gt;
&lt;td&gt;The holder is offline, unreachable from the DC doing the work, or hasn't finished inbound replication since it started&lt;/td&gt;
&lt;td&gt;Steps 3 and 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x20AE "The role owner attribute could not be read."&lt;/td&gt;
&lt;td&gt;The role object's owner value can't be read or resolved on the DC you asked&lt;/td&gt;
&lt;td&gt;Step 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An owner that contains &lt;code&gt;DEL:&lt;/code&gt; or &lt;code&gt;0ADEL&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The role points at an NTDS Settings object that has been deleted (Microsoft's reading in its seize and demotion articles)&lt;/td&gt;
&lt;td&gt;Steps 2 and 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Access is denied"&lt;/td&gt;
&lt;td&gt;Wrong group, a non-elevated session, or, during metadata cleanup, objects protected from accidental deletion&lt;/td&gt;
&lt;td&gt;Steps 5 and 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Transfer of RID FSMO failed, proceeding with seizure" then "Search failed to find any Domain Controllers"&lt;/td&gt;
&lt;td&gt;Microsoft's cause: "The fSMORoleOwner attribute of the RID Manager$ object in Active Directory is invalid."&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A demotion fails with "unable to determine the ownership of floating single-master operation roles"&lt;/td&gt;
&lt;td&gt;A DNS application partition's infrastructure master points at a deleted DC&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Different DCs name different owners&lt;/td&gt;
&lt;td&gt;Replication hasn't converged, or a DC is isolated&lt;/td&gt;
&lt;td&gt;Steps 2 and 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The holder is gone for good (dead hardware, reinstalled, force-demoted)&lt;/td&gt;
&lt;td&gt;Seizure is the expected path, after replication checks&lt;/td&gt;
&lt;td&gt;Steps 6 and 8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2: Read who owns each role, from more than one DC (read-only)
&lt;/h2&gt;

&lt;p&gt;Start with the two quick reads (Microsoft says &lt;code&gt;netdom query&lt;/code&gt; must run from an elevated command prompt), then repeat them against the target DC and at least one other DC. Each DC answers from its own copy of the directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# The role owners as this computer's DC sees them (Microsoft's netdom query fsmo)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;netdom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fsmo&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# The same question answered by specific DCs (/server is the DC that performs the query)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;netdom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/server:DC02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fsmo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;netdom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/server:DC03&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fsmo&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Domain roles and forest roles, asked of one DC at a time&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADDomain&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PDCEmulator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RIDMaster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InfrastructureMaster&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADForest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SchemaMaster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DomainNamingMaster&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;dcdiag&lt;/code&gt; has a test for this, but read its scope: KnowsOfRoleHolders "returns the DCs knowledge of the five Flexible Single Master Operation (FSMO) roles but doesn't check all DCs knowledge for consistency. Using the /e parameter provides data for comparison." The similarly named FsmoCheck test isn't the same thing; Microsoft's description ends with "This test does not test any of the servers for operations master roles."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;REM Every DC in the enterprise reports what it knows about the five roles;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;compare the answers
&lt;span class="go"&gt;dcdiag /test:KnowsOfRoleHolders /e /v
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the friendly names look wrong, read the raw owner. Each role is an &lt;code&gt;fSMORoleOwner&lt;/code&gt; value on one object, and Microsoft's own instruction for a partition's infrastructure master is to "query the fSMORoleOwner attribute on the infrastructure object under the naming context root in question." The same read works for every role object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: the raw owner (an NTDS Settings DN) of every role object, as DC02 sees it&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC02'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$root&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ADRootDSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$dom&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;defaultNamingContext&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$fr&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rootDomainNamingContext&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$objs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$dom&lt;/span&gt;&lt;span class="w"&gt;                                          &lt;/span&gt;&lt;span class="c"&gt;# PDC emulator (domain head)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"CN=RID Manager&lt;/span&gt;&lt;span class="se"&gt;`$&lt;/span&gt;&lt;span class="s2"&gt;,CN=System,&lt;/span&gt;&lt;span class="nv"&gt;$dom&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="c"&gt;# RID master&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"CN=Infrastructure,&lt;/span&gt;&lt;span class="nv"&gt;$dom&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="c"&gt;# infrastructure master&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"CN=Partitions,&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configurationNamingContext&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# domain naming master&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$root&lt;/span&gt;&lt;span class="err"&gt;.schemaNamingContext&lt;/span&gt;&lt;span class="w"&gt;                     &lt;/span&gt;&lt;span class="c"&gt;# schema master&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"CN=Infrastructure,DC=DomainDnsZones,&lt;/span&gt;&lt;span class="nv"&gt;$dom&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;# DNS application partition (domain)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"CN=Infrastructure,DC=ForestDnsZones,&lt;/span&gt;&lt;span class="nv"&gt;$fr&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c"&gt;# DNS application partition (forest)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$objs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Get-ADObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fSMORoleOwner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Stop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DistinguishedName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fSMORoleOwner&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Not found on &lt;/span&gt;&lt;span class="nv"&gt;${dc}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="nv"&gt;$o&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it with &lt;code&gt;$dc&lt;/code&gt; set to each DC you care about. Read the results like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Every DC names the same live DC for every role&lt;/td&gt;
&lt;td&gt;Ownership is consistent; the failure is about reaching or rights (Steps 3 and 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DCs disagree about an owner&lt;/td&gt;
&lt;td&gt;Replication hasn't converged, or one DC is isolated; don't move anything until Step 3 explains why&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An owner value contains &lt;code&gt;DEL:&lt;/code&gt; or &lt;code&gt;0ADEL&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The owner's NTDS Settings object was deleted. Microsoft's RID seize article shows "CN=NTDS Settings DEL:" as an invalid value; its demotion article explains that "The fSMORoleOwner attribute contains the string 0ADEL indicating that the role owning DC's NTDS Settings object has been deleted." (Steps 8 and 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The DNS application partition owners point at an old DC while the five main roles look fine&lt;/td&gt;
&lt;td&gt;The classic leftover after a forced removal; &lt;code&gt;netdom query fsmo&lt;/code&gt; doesn't show these (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An owner is a DC you've never heard of&lt;/td&gt;
&lt;td&gt;Check &lt;code&gt;Get-ADDomainController -Filter *&lt;/code&gt; and the Sites and Services Servers container before you assume it's gone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Get-ADObject&lt;/code&gt; returns nothing for a DNS partition&lt;/td&gt;
&lt;td&gt;That partition may not exist in this domain or forest, or the DC you asked doesn't host it (our reading)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 3: Is the current holder online and replicating? (read-only)
&lt;/h2&gt;

&lt;p&gt;A transfer only works when the current holder takes part, and a holder only acts as one after it has replicated. Microsoft's transfer-or-seize article: "When a DC that has been acting as a role holder starts to run (for example, after a failure or a shutdown), it doesn't immediately resume behaving as the role holder." The per-role details are in Microsoft's FSMO roles article: the RID master "is active only when the role owner has inbound replicated the domain NC successfully since the Directory Service started", and the schema and domain naming masters have the same rule for their partitions. The PDC emulator is the exception: "There is no inbound replication requirement."&lt;/p&gt;

&lt;p&gt;So read replication for the holder and the target before anything else:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;REM Forest-wide summary: which DCs are failing inbound or outbound replication, errors first
repadmin /replsummary /errorsonly

REM Inbound replication status, per partition and partner, for the target and for the holder
repadmin /showrepl DC02
repadmin /showrepl DC01
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: the target's inbound partners for every partition it holds, with the last result&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADReplicationPartnerMetadata&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Partition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Partner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastReplicationAttempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastReplicationSuccess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;LastReplicationResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ConsecutiveReplicationFailures&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: replication failures recorded for the target and the holder&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADReplicationFailure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Is the holder's name resolving and answering at all? (ICMP can be blocked; this is a hint, not proof)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's note on the &lt;code&gt;/showrepl&lt;/code&gt; output: "If @ [Never] appears in the output for a directory partition, replication of that directory partition has never succeeded from the identified source replication partner over the listed connection." Then look at the events around the failed attempt on the DC that did the work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Directory Service events Microsoft's role articles mention (1586 after a PDC seizure, 2091 in a demotion log)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Directory Service'&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1586&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2091&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# RID issuance events (Microsoft: logged in the System log under Directory-Services-SAM)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'System'&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16642&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16643&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16644&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16645&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16655&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16656&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16657&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The holder is up and replicates both ways with the target&lt;/td&gt;
&lt;td&gt;Reachability isn't the problem; check the target (Step 4) and rights (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The holder restarted recently and its inbound replication for the role's partition has failed since&lt;/td&gt;
&lt;td&gt;It won't act as the holder yet, and a transfer can fail with 0x20AF. Fix its replication first (Step 6 "wait")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error 1722 (RPC server unavailable) between holder and target&lt;/td&gt;
&lt;td&gt;A name, port, or firewall problem; &lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt; covers that chain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A target-principal-name error between holder and target&lt;/td&gt;
&lt;td&gt;Kerberos reached the wrong DC name or a stale password; &lt;a href="https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak"&gt;The Target Principal Name Is Incorrect&lt;/a&gt; covers it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The holder is down or unreachable from every DC&lt;/td&gt;
&lt;td&gt;Transfer is impossible until it's back; this is the Step 6 decision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The target itself fails inbound replication&lt;/td&gt;
&lt;td&gt;It isn't "the most recent replicated writable copy"; fix it or pick another target (Step 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RID events on the DC that can't create accounts&lt;/td&gt;
&lt;td&gt;The DC's RID pool ran low and the RID master couldn't supply a new one; that's the role you need first&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 4: Is the target DC the right one? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's criteria for the new role holder are short: "It resides in the same domain as the previous role holder." and "It has the most recent replicated writable copy of the role partition." Its placement guidance adds: "Place the RID master on the domain PDC in the same domain." and "Place the schema master on the PDC of the forest root domain." The usual answer is a healthy DC in the same site that's a direct replication partner of the old holder. Microsoft's standby-master guidance says to "Ensure that the standby operations masters are direct replication partners of the actual operations masters."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: every DC in the domain, its site, and whether it's a GC or read-only&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADDomainController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IsGlobalCatalog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IsReadOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Microsoft's single-DC global catalog check (True or False)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ADDomainController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-Eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC02'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsGlobalCatalog&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Is the AD Recycle Bin enabled? (changes whether the infrastructure master matters)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADOptionalFeature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Recycle Bin Feature'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;REM Health of the proposed target, verbose
dcdiag /s:DC02 /v
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The target is a read-only DC&lt;/td&gt;
&lt;td&gt;It can't hold a role. Microsoft: "RODCs cannot act as operations master role holders." and the move cmdlet "does not work with a read-only domain controller."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The target is in another domain&lt;/td&gt;
&lt;td&gt;Domain roles stay in their own domain; pick a DC in the same domain as the old holder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The target fails &lt;code&gt;dcdiag&lt;/code&gt; or replication&lt;/td&gt;
&lt;td&gt;Fix it first, or pick a healthier DC; a new holder waits for inbound replication before it acts (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure master target is a global catalog&lt;/td&gt;
&lt;td&gt;Our reading: matters only when some DCs in a multi-domain forest aren't GCs and the Recycle Bin is off. Microsoft: "Don't put the infrastructure master role on the same DC as the global catalog server." but also "The infrastructure master role isn't used anymore once you enable Active Directory Recycle Bin." and "In a forest that contains a single Active Directory domain, there are no phantoms."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The target is a far site behind a slow link&lt;/td&gt;
&lt;td&gt;Every DC needs to reach the RID master and PDC; prefer a hub-site DC (Microsoft's placement guidance)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you need a property that isn't in that list, Microsoft's note on &lt;code&gt;Get-ADDomainController&lt;/code&gt; is to pipe one DC to &lt;code&gt;Get-Member&lt;/code&gt; and read all of them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Does your account have the rights for this role? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's current article: "The signed-in user should be a member of the Enterprise Administrators group to transfer Schema master or Domain naming master roles, or a member of the Domain Administrators group of the domain where the PDC emulator, RID master and the infrastructure master roles are being transferred." Its older per-role procedures name Schema Admins for the schema master ("Membership in Schema Admins, or equivalent, is the minimum required to complete this procedure."), so for a schema master move, be in both (our reading).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Group Microsoft names&lt;/th&gt;
&lt;th&gt;Where the group lives&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Schema master&lt;/td&gt;
&lt;td&gt;Enterprise Admins (current article); Schema Admins (per-role procedure and seize table)&lt;/td&gt;
&lt;td&gt;Forest root domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain naming master&lt;/td&gt;
&lt;td&gt;Enterprise Admins&lt;/td&gt;
&lt;td&gt;Forest root domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDC emulator, RID master, infrastructure master&lt;/td&gt;
&lt;td&gt;Domain Admins of that domain&lt;/td&gt;
&lt;td&gt;The domain that holds the role&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only: what the current session's token actually contains (look for the groups above)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;whoami&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/groups&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Read-only: who's in the forest-level groups (ask a forest root DC)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADGroupMember&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Schema Admins'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SamAccountName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADGroupMember&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Enterprise Admins'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SamAccountName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The group is missing from &lt;code&gt;whoami /groups&lt;/code&gt; but the account is a member&lt;/td&gt;
&lt;td&gt;The membership was added after you signed in; sign out and back in so the token has it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The groups are there, but ntdsutil says "Access is denied"&lt;/td&gt;
&lt;td&gt;The prompt isn't elevated. Microsoft's procedures start with "Open a Command Prompt as an administrator"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PowerShell stops with a permission error&lt;/td&gt;
&lt;td&gt;Microsoft: "If the acting credentials do not have directory-level permission to perform the task, Active Directory module for Windows PowerShell returns a terminating error." Run as the right account, or pass &lt;code&gt;-Credential&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running from a workstation&lt;/td&gt;
&lt;td&gt;Fine for PowerShell; for ntdsutil Microsoft says "We recommend that you log on to the DC to which you are assigning Operation Master roles."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Access is denied" during metadata cleanup, not the move&lt;/td&gt;
&lt;td&gt;A different cause: objects protected from accidental deletion (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 6: Transfer, wait, or seize? (decision, no changes yet)
&lt;/h2&gt;

&lt;p&gt;This is the step the forum post skips. Microsoft's rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transfer when "The current role holder is operational and can be accessed on the network by the new Operation Master owner."&lt;/li&gt;
&lt;li&gt;Seize when "The current role holder is experiencing an operational error that prevents an Operation Master-dependent operation from completing successfully, and you can't transfer the role.", after a forced demotion, or when "The operating system on the computer that originally owned a specific role no longer exists or has been reinstalled."&lt;/li&gt;
&lt;li&gt;Wait when you can: "If the role holder can be made operational before the role is needed, you may delay seizing the role." Except for one role: "The PDC role in each domain should always be online."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How much each role can wait, and how bad a duplicate would be (Microsoft's function list and its replication-island table):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;When you need it (Microsoft)&lt;/th&gt;
&lt;th&gt;Conflict if two DCs hold it (Microsoft)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PDC emulator&lt;/td&gt;
&lt;td&gt;"Must be online and accessible 24 hours a day, seven days a week."&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RID master&lt;/td&gt;
&lt;td&gt;When DCs need a new RID pool, including newly promoted DCs&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure master&lt;/td&gt;
&lt;td&gt;Cross-domain references; no work in a single-domain forest&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain naming master&lt;/td&gt;
&lt;td&gt;"Must be online when domains and application partitions in a forest are added or removed."&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema master&lt;/td&gt;
&lt;td&gt;"Must be online when schema updates are performed."&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then decide:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Decision (our reading of Microsoft's rules)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Holder online, replicating, transfer failed for a reason Steps 3-5 found&lt;/td&gt;
&lt;td&gt;Fix that reason and transfer (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Holder down, returning soon, nothing failing but the PDC functions&lt;/td&gt;
&lt;td&gt;Bring it back if you can. If the PDC can't wait, seizing only the PDC is the lowest-risk seizure in Microsoft's island table, but plan the old DC's return as a rebuild or a cleanup (Step 9), not a power-on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Holder down, returning soon, nothing role-dependent failing&lt;/td&gt;
&lt;td&gt;Wait and fix the holder; don't seize&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Holder gone: dead hardware, reinstalled, force-demoted&lt;/td&gt;
&lt;td&gt;Seize all its roles on the chosen target (Step 8), then clean up (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The plan is to restore the old DC from a backup&lt;/td&gt;
&lt;td&gt;Don't. Microsoft: "The restoration process rebuilds the DC as a role holder again." Rebuild it from scratch instead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two parts of the network each have a holder (replication islands)&lt;/td&gt;
&lt;td&gt;Microsoft: "Before you reintegrate islands, determine which role holders to keep." Remove the duplicate schema, naming, and RID masters with the cleanup procedures&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Before a seizure, Microsoft also asks for patience: "do not perform a role seizure until enough time has passed to complete at least one end-to-end replication cycle across your network." The more of the old holder's last changes reach the target, the less you lose.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Transfer it properly (a change)
&lt;/h2&gt;

&lt;p&gt;Only when Step 6 says transfer. In PowerShell, &lt;code&gt;-Identity&lt;/code&gt; is the DC that gets the roles; Microsoft: "The Identity parameter specifies the directory server that receives the roles." The cmdlet doesn't have to run on either DC: it "can be remotely executed from any domain joined computer where the Active Directory module for Windows PowerShell administration module is installed and available for use."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Preview, then move the three domain roles to DC02 (Domain Admins of that domain)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Move-ADDirectoryServerOperationMasterRole&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-OperationMasterRole&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PDCEmulator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RIDMaster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InfrastructureMaster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WhatIf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Move-ADDirectoryServerOperationMasterRole&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-OperationMasterRole&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PDCEmulator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RIDMaster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InfrastructureMaster&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# The two forest roles (Enterprise Admins; Schema Admins as well for the schema master)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Move-ADDirectoryServerOperationMasterRole&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-OperationMasterRole&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SchemaMaster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DomainNamingMaster&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Only have the FQDN? Microsoft's Example 5: resolve it with Get-ADDomainController first&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ADDomainController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dc02.contoso.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Move-ADDirectoryServerOperationMasterRole&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-OperationMasterRole&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PDCEmulator&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last pattern matters: "There is a known issue where the Move-ADDirectoryServerOperationMasterRole cmdlet fails when an FQDN is specified directly as the value of the Identity parameter."&lt;/p&gt;

&lt;p&gt;With ntdsutil, run it on the DC that will receive the roles (Microsoft's recommendation), connect to that DC, then transfer. Microsoft's syntax is &lt;code&gt;transfer &amp;lt;role&amp;gt;&lt;/code&gt;; type &lt;code&gt;?&lt;/code&gt; at the &lt;code&gt;fsmo maintenance:&lt;/code&gt; prompt to see the exact role names your version accepts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;C:\&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ntdsutil
&lt;span class="go"&gt;ntdsutil: roles
fsmo maintenance: connections
server connections: connect to server DC02
server connections: q
fsmo maintenance: ?
fsmo maintenance: transfer pdc
fsmo maintenance: transfer rid master
fsmo maintenance: transfer infrastructure master
fsmo maintenance: q
ntdsutil: q
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The consoles do the same thing, one role at a time, as long as you point them at the target DC first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Console&lt;/th&gt;
&lt;th&gt;Path (Microsoft's procedures)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RID master, PDC emulator, infrastructure master&lt;/td&gt;
&lt;td&gt;Active Directory Users and Computers&lt;/td&gt;
&lt;td&gt;Right-click &lt;strong&gt;Active Directory Users and Computers&lt;/strong&gt; &amp;gt; &lt;strong&gt;Change Active Directory Domain Controller&lt;/strong&gt; &amp;gt; select DC02 &amp;gt; right-click again &amp;gt; &lt;strong&gt;All Tasks&lt;/strong&gt; &amp;gt; &lt;strong&gt;Operations Masters&lt;/strong&gt; &amp;gt; the &lt;strong&gt;RID&lt;/strong&gt;, &lt;strong&gt;PDC&lt;/strong&gt;, or &lt;strong&gt;Infrastructure&lt;/strong&gt; tab &amp;gt; &lt;strong&gt;Change&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain naming master&lt;/td&gt;
&lt;td&gt;Active Directory Domains and Trusts&lt;/td&gt;
&lt;td&gt;Right-click &lt;strong&gt;Active Directory Domains and Trusts&lt;/strong&gt; &amp;gt; &lt;strong&gt;Change Active Directory Domain Controller&lt;/strong&gt; &amp;gt; select DC02 &amp;gt; right-click again &amp;gt; &lt;strong&gt;Operations Master&lt;/strong&gt; &amp;gt; &lt;strong&gt;Change&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema master&lt;/td&gt;
&lt;td&gt;Active Directory Schema snap-in&lt;/td&gt;
&lt;td&gt;Register it first with &lt;code&gt;regsvr32 schmmgmt.dll&lt;/code&gt; and add it to an MMC; right-click &lt;strong&gt;Active Directory Schema&lt;/strong&gt; &amp;gt; &lt;strong&gt;Change Active Directory Domain Controller&lt;/strong&gt; &amp;gt; select DC02 &amp;gt; right-click again &amp;gt; &lt;strong&gt;Operations Master&lt;/strong&gt; &amp;gt; &lt;strong&gt;Change&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Transfer result&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Completed, and &lt;code&gt;netdom query fsmo&lt;/code&gt; on DC02 shows DC02&lt;/td&gt;
&lt;td&gt;Go to Step 10 to prove it everywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x20AF "The current FSMO holder could not be contacted."&lt;/td&gt;
&lt;td&gt;Steps 3 and 6: the holder isn't taking part; don't keep retrying&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Access is denied" or a permission error&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fails only with the FQDN in &lt;code&gt;-Identity&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Microsoft's known issue; use the &lt;code&gt;Get-ADDomainController&lt;/code&gt; pattern above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The console's lower box shows the wrong DC&lt;/td&gt;
&lt;td&gt;You didn't change the console's domain controller to the target first&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 8: Seize it properly, only if Step 6 says so (a change)
&lt;/h2&gt;

&lt;p&gt;A seizure is a decision about the old DC, so make it once and write it on the ticket. Microsoft's older procedure explains the risk: "If two domain controllers are performing the same operations master role simultaneously, the severity of the effect from duplicate operations master roles varies, depending on the role that was seized. The effect can range from no visible effect to potential corruption of the Active Directory database."&lt;/p&gt;

&lt;p&gt;On the target DC, in an elevated prompt, connect ntdsutil to that DC (Microsoft: "If ServerFQDN does not succeed, use the NetBIOS name of the DC."), then seize. The seize commands are Microsoft's; note the two exceptions: "Exceptions are for the PDC emulator role, whose syntax is seize pdc, and the Domain naming master, whose syntax is seize naming master."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;C:\&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ntdsutil
&lt;span class="go"&gt;ntdsutil: roles
fsmo maintenance: connections
server connections: connect to server DC02.contoso.com
server connections: quit
fsmo maintenance: seize pdc
fsmo maintenance: seize rid master
fsmo maintenance: seize infrastructure master
fsmo maintenance: seize naming master
fsmo maintenance: seize schema master
fsmo maintenance: quit
ntdsutil: quit
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Credentials (Microsoft's seize table)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seize naming master&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enterprise Admins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seize schema master&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Schema Admins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seize infrastructure master&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Domain Admins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seize pdc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Domain Admins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seize rid master&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Domain Admins&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Seize only the roles the dead DC held (from Step 2), not every role in the forest. Expect ntdsutil to try a transfer first: "When you use Ntdsutil.exe to seize an operations master role, the tool first attempts a transfer from the current role owner." You'll see a transfer error and then the seizure. For the RID master, Microsoft adds that the target "tries to synchronize with a replication partner before accepting this role", and if it can't, "a dialog box appears asking you whether you want to continue with the operation despite this computer not being able to synchronize with a partner. Click Yes."&lt;/p&gt;

&lt;p&gt;The PowerShell equivalent is the Step 7 command with &lt;code&gt;-Force&lt;/code&gt;. Microsoft: "This operation still attempts graceful transfer first, then seizes if transfer is not possible."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Seize only the roles the dead DC held (Microsoft's Example 4 form, with this post's role list)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Move-ADDirectoryServerOperationMasterRole&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-OperationMasterRole&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PDCEmulator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RIDMaster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InfrastructureMaster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Know what a RID master seizure costs before you run it. Microsoft: "Rid Master seizures increment the next available RID in the pool when you seize the RID master role." The amount depends on the tool: "The Move-ADDirectoryServerOperationMasterRole cmdlet increases the next Rid pool by 30,000 from what it finds in Active Directory." and with ntdsutil "it increases the next Rid pool by 10,000." Microsoft's conclusion: "So seize the Rid Master only when you're sure that the current Rid Master can't be brought back into service." A domain has "capacity for roughly one billion security principals", so one seizure is affordable; a habit of seizing isn't (our reading). Microsoft's read of the remaining pool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;REM Microsoft's form: the available RID pool for the domain, from the RidManager test
Dcdiag.exe /TEST:RidManager /v | find /i "Available RID Pool for the Domain"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Seize result&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The role list at the end shows DC02 for each seized role&lt;/td&gt;
&lt;td&gt;Seized. Go to Step 9 before anything else&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Transfer of RID FSMO failed, proceeding with seizure ..." then "Search failed to find any Domain Controllers"&lt;/td&gt;
&lt;td&gt;Microsoft's cause: "The fSMORoleOwner attribute of the RID Manager$ object in Active Directory is invalid." Its fix is to set &lt;code&gt;fSMORoleOwner&lt;/code&gt; on &lt;code&gt;CN=RID Manager$,CN=System&lt;/code&gt; to the new DC's NTDS Settings DN in ADSI Edit, and "Changing the fSMORoleOwner attribute accomplishes the same thing as seizing the role with Ntdsutil." Use it for that error only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Access is denied"&lt;/td&gt;
&lt;td&gt;Step 5: wrong group (Schema Admins for the schema master) or not elevated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You seized the infrastructure master&lt;/td&gt;
&lt;td&gt;Microsoft's note: "After you seize the infrastructure master role, you may receive an error later if you need to run Adprep /Rodcprep." Check the DNS application partition owners in Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 9: Clean up the old DC and every owner that still points at it (a change)
&lt;/h2&gt;

&lt;p&gt;After a seizure, the old DC doesn't get its old life back. Microsoft's options for it: format and reinstall, or forcibly demote it, then remove its metadata from another DC; "After you clean up the metadata, you can repromote the computer to a DC, and transfer a role back to it." Restoring it from a backup is the wrong rebuild: "If you plan to use the repaired computer as a DC, we recommend that you rebuild the computer into a DC from scratch instead of restoring the DC from a backup." When the board in the opener arrives, keep DC01 off the network until it's reinstalled or demoted (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Metadata cleanup.&lt;/strong&gt; Microsoft: "Metadata cleanup is a required procedure after a forced removal of Active Directory Domain Services (AD DS)." The GUI way is to delete the DC's computer object from the &lt;strong&gt;Domain Controllers&lt;/strong&gt; OU in Active Directory Users and Computers and select "This Domain Controller is permanently offline and can no longer be demoted using the Active Directory Domain Services Installation Wizard (DCPROMO)". If it still holds roles, that dialog moves them to a DC it picks: "You cannot change this domain controller. If you want to move the role to a different domain controller, you must move the role after you complete the server metadata cleanup procedure." The command-line way, connected to a replication partner of the removed DC (Microsoft: "This domain controller must be a replication partner of the removed domain controller."):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;C:\&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ntdsutil
&lt;span class="go"&gt;ntdsutil: metadata cleanup
metadata cleanup: connections
server connections: connect to server DC02
server connections: quit
metadata cleanup: remove selected server DC01
metadata cleanup: quit
ntdsutil: quit
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If cleanup says "Access is denied", Microsoft's note is to "make sure that the computer object and the NTDS Settings object for the domain controller are not protected against accidental deletion." Afterward, Microsoft's check is that the DC is gone from the Domain Controllers OU and that its server object in Sites and Services no longer has an NTDS Settings object.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DNS application partition owners.&lt;/strong&gt; Rerun the Step 2 read for &lt;code&gt;CN=Infrastructure,DC=DomainDnsZones,...&lt;/code&gt; and &lt;code&gt;CN=Infrastructure,DC=ForestDnsZones,...&lt;/code&gt;. If either still names a deleted owner, demotions and &lt;code&gt;adprep /rodcprep&lt;/code&gt; fail later. Microsoft's resolution: "Use ADSIEDIT.MSC to assign the DN path for the fsMORoleOwner attribute to a live DC that was a direct replication partner of the original FSMO role owner." or run the script in its adprep article, &lt;code&gt;cscript fixfsmo.vbs DC=DomainDnsZones,DC=contoso,DC=com&lt;/code&gt; (and again for ForestDnsZones), copied from that article, not retyped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time.&lt;/strong&gt; If the PDC emulator of the forest root moved, the time source moved with it. Microsoft: "The PDC emulator at the root of the forest becomes authoritative for the enterprise, and should be configured to gather the time from an external source." Microsoft's &lt;code&gt;w32tm /config&lt;/code&gt; example for a manual peer list, plus its &lt;code&gt;/reliable:YES&lt;/code&gt; option ("This setting is only meaningful on domain controllers."), with your own time servers in place of its example names:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;REM On the new forest-root PDC emulator (Microsoft's example peer names;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;use your own&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;w32tm /config /manualpeerlist:"ntpserver.contoso.com clock.adatum.com" /syncfromflags:manual /reliable:YES /update

REM On a former PDC that's still a DC (transfer case): follow the domain hierarchy again
w32tm /config /syncfromflags:domhier /update
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt; covers checking that chain afterward. The PDC emulator is also Microsoft's "Default target domain controller for Group Policy updates.", so Group Policy edits now land on the new holder; if they don't show up on clients, &lt;a href="https://dev.to/adminpackstudio/group-policy-not-applying-a-read-first-scope-filtering-replication-and-client-triage-31ho"&gt;Group Policy Not Applying&lt;/a&gt; covers that path. Microsoft's placement article also notes that NTDS Replication event 1586 occurs when "the PDC FSMO role for a particular domain has been seized.", so expect it after a PDC seizure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 10: Prove every DC agrees (read-only)
&lt;/h2&gt;

&lt;p&gt;A new holder doesn't start work the moment the command returns. Microsoft: "After a role transfer or seizure, the new role holder doesn't act immediately." It waits for a successful inbound replication cycle of the role's partition, and "To have full effect, the change must replicate to all domain controllers in the domain for a domain-level role and to all domain controllers in the forest for a forest-level role."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Every DC's answer, not just the one you're signed in to&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADDomainController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ADDomain&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ADForest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pscustomobject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;AskedDC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;PDC&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PDCEmulator&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;RID&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RIDMaster&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Infra&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;InfrastructureMaster&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Schema&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SchemaMaster&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Naming&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DomainNamingMaster&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;REM The same check, the dcdiag way, plus RID master health and replication
dcdiag /test:KnowsOfRoleHolders /e
dcdiag /test:RidManager /v
repadmin /replsummary
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's ntdsutil view of the connected DC's roles is &lt;strong&gt;roles&lt;/strong&gt; &amp;gt; &lt;strong&gt;connections&lt;/strong&gt; &amp;gt; &lt;strong&gt;connect to server&lt;/strong&gt; DC02 &amp;gt; &lt;strong&gt;quit&lt;/strong&gt; &amp;gt; &lt;strong&gt;select operation target&lt;/strong&gt; &amp;gt; &lt;strong&gt;list roles for connected server&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pass criteria (our reading): every DC names the same live holder for every role, the Step 2 &lt;code&gt;fSMORoleOwner&lt;/code&gt; read (including both DNS application partitions) shows no deleted owner, &lt;code&gt;repadmin /replsummary&lt;/code&gt; shows no failures, &lt;code&gt;dcdiag /test:RidManager&lt;/code&gt; passes, and the operation from the ticket (creating an account on the DC that couldn't, a password reset, a Group Policy edit) works. Then close the ticket with the decision from Step 6 written down.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common false starts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tempting move&lt;/th&gt;
&lt;th&gt;Why it's premature (our reading)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Seize all five roles right away&lt;/td&gt;
&lt;td&gt;The dead DC may not hold all five, the RID seizure burns RIDs, and nothing may need the forest roles this week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power the old DC back on after seizing its roles&lt;/td&gt;
&lt;td&gt;Microsoft: "Do not allow a former operations master role holder whose role has been seized to return to an online domain controller." Rebuild it instead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restore the old DC from backup&lt;/td&gt;
&lt;td&gt;Restores it as a role holder again; Microsoft recommends a rebuild from scratch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connect ntdsutil to the dead DC&lt;/td&gt;
&lt;td&gt;The connection is to the DC that will receive the role&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retry the transfer over and over, or reboot the holder&lt;/td&gt;
&lt;td&gt;A freshly started holder waits for inbound replication before it acts; fix replication (Step 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trust &lt;code&gt;netdom query fsmo&lt;/code&gt; from one DC&lt;/td&gt;
&lt;td&gt;It shows that DC's view; compare several DCs and the raw &lt;code&gt;fSMORoleOwner&lt;/code&gt; (Step 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use &lt;code&gt;dcdiag /test:FsmoCheck&lt;/code&gt; as proof&lt;/td&gt;
&lt;td&gt;Microsoft: "This test does not test any of the servers for operations master roles."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edit &lt;code&gt;fSMORoleOwner&lt;/code&gt; in ADSI Edit first&lt;/td&gt;
&lt;td&gt;That's a seizure by another route; Microsoft uses it for specific invalid-owner errors, not as a shortcut&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Move the infrastructure master onto a GC without checking&lt;/td&gt;
&lt;td&gt;Fine in a single-domain forest, with every DC a GC, or with the Recycle Bin on; otherwise it stops working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add yourself to Schema Admins and leave it&lt;/td&gt;
&lt;td&gt;Microsoft: "You should carefully manage and monitor membership in the SA group"; add for the change, remove after&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pass the target's FQDN straight to &lt;code&gt;-Identity&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Microsoft's known issue; resolve it with &lt;code&gt;Get-ADDomainController&lt;/code&gt; first&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  When a change is justified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Holder online, transfer failed on replication&lt;/td&gt;
&lt;td&gt;Fix replication, then transfer&lt;/td&gt;
&lt;td&gt;Seizing a role from a DC that's working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Holder online, transfer failed on rights&lt;/td&gt;
&lt;td&gt;The right group in a fresh, elevated session, then transfer&lt;/td&gt;
&lt;td&gt;Permanent extra Schema Admins or Enterprise Admins members&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Holder down for days, PDC functions failing&lt;/td&gt;
&lt;td&gt;Bring the holder back; if you can't, seize the PDC alone and plan the old DC's rebuild&lt;/td&gt;
&lt;td&gt;Seizing all five and powering the old DC on later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Holder dead or reinstalled&lt;/td&gt;
&lt;td&gt;Seize the roles it held on a healthy, up-to-date DC in the same domain and site&lt;/td&gt;
&lt;td&gt;Seizing to an RODC, a far site, or a DC that fails replication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RID master gone&lt;/td&gt;
&lt;td&gt;Seize once, with the cost understood&lt;/td&gt;
&lt;td&gt;Repeated RID seizures "to be safe"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Old DC still listed after a seizure&lt;/td&gt;
&lt;td&gt;Metadata cleanup from a replication partner&lt;/td&gt;
&lt;td&gt;Leaving its NTDS Settings object in place&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS application partition owner points at a deleted DC&lt;/td&gt;
&lt;td&gt;Microsoft's ADSI Edit or script fix for that partition&lt;/td&gt;
&lt;td&gt;Ignoring it until the next demotion fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forest-root PDC moved&lt;/td&gt;
&lt;td&gt;Configure the new PDC's external time source&lt;/td&gt;
&lt;td&gt;Leaving the old time configuration on a DC that isn't the PDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Old hardware repaired&lt;/td&gt;
&lt;td&gt;Reinstall, promote fresh, and transfer roles back if you want&lt;/td&gt;
&lt;td&gt;Restoring the old DC from backup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between transferring and seizing FSMO roles?&lt;/strong&gt;&lt;br&gt;
A transfer moves a role with the current holder's cooperation, so nothing is lost; Microsoft recommends it when "The current role holder is operational and can be accessed on the network by the new Operation Master owner." A seizure assigns the role without the old holder, so it's for a holder that isn't coming back, and that old DC must not return as it was (Steps 6-8).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does FSMO role transfer fail with "The current FSMO holder could not be contacted"?&lt;/strong&gt;&lt;br&gt;
The DC doing the work couldn't get the current holder to take part: it's offline, unreachable from that DC, or it restarted and hasn't completed inbound replication for the role's partition yet. Read replication for the holder and the target with &lt;code&gt;repadmin /replsummary&lt;/code&gt; and &lt;code&gt;repadmin /showrepl&lt;/code&gt; before you think about seizing (Steps 3 and 6).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I bring the old domain controller back after seizing its roles?&lt;/strong&gt;&lt;br&gt;
Not as it was. Microsoft: "Do not allow a former operations master role holder whose role has been seized to return to an online domain controller." Reinstall it or force-demote it, clean up its metadata, then promote it fresh if you want it back as a DC (Step 9).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does seizing FSMO roles say "Access is denied"?&lt;/strong&gt;&lt;br&gt;
Usually the account isn't in the group the role needs (Schema Admins for the schema master, Enterprise Admins for the domain naming master, Domain Admins for the domain roles), the membership was added after you signed in, or the prompt isn't elevated. Check &lt;code&gt;whoami /groups&lt;/code&gt; in the same window (Step 5). During metadata cleanup, it can also mean the objects are protected from accidental deletion (Step 9).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I seize FSMO roles with PowerShell?&lt;/strong&gt;&lt;br&gt;
Use &lt;code&gt;Move-ADDirectoryServerOperationMasterRole&lt;/code&gt; with &lt;code&gt;-Identity&lt;/code&gt; set to the DC that receives the roles, &lt;code&gt;-OperationMasterRole&lt;/code&gt; listing only the roles the dead DC held, and &lt;code&gt;-Force&lt;/code&gt;. It "still attempts graceful transfer first, then seizes if transfer is not possible." For the RID master, it raises the next RID pool by 30,000, three times what ntdsutil does (Step 8).&lt;/p&gt;




&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt; (when the role holder can't be reached because replication fails with RPC errors)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt; (when the new forest-root PDC emulator has to become the time source)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak"&gt;The Target Principal Name Is Incorrect&lt;/a&gt; (when the holder and the target fail Kerberos between them)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/group-policy-not-applying-a-read-first-scope-filtering-replication-and-client-triage-31ho"&gt;Group Policy Not Applying&lt;/a&gt; (when policy edits stall after the PDC emulator moves)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free checklist
&lt;/h2&gt;

&lt;p&gt;Seizing all five roles before anyone read who owns them, or whether the old DC is coming back, is a change made everywhere at once. So is a Conditional Access policy enforced before anyone read the report-only results. The free &lt;strong&gt;Conditional Access pre-enforcement checklist&lt;/strong&gt; keeps break-glass accounts, pilot groups, and report-only review on one page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=fsmo-role-transfer-failed" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=fsmo-role-transfer-failed&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the &lt;strong&gt;Intune &amp;amp; M365 Admin Starter Pack&lt;/strong&gt; pairs with this triage: &lt;a href="https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=fsmo-role-transfer-failed" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=fsmo-role-transfer-failed&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Admin Pack Studio; not affiliated with Microsoft. Steps 1-6 and 10 are read-only checks: &lt;code&gt;netdom query&lt;/code&gt;, &lt;code&gt;Get-ADDomain&lt;/code&gt;, &lt;code&gt;Get-ADForest&lt;/code&gt;, &lt;code&gt;Get-ADRootDSE&lt;/code&gt;, &lt;code&gt;Get-ADObject&lt;/code&gt;, &lt;code&gt;dcdiag&lt;/code&gt;, &lt;code&gt;repadmin /replsummary&lt;/code&gt; and &lt;code&gt;/showrepl&lt;/code&gt;, &lt;code&gt;Get-ADReplicationPartnerMetadata&lt;/code&gt;, &lt;code&gt;Get-ADReplicationFailure&lt;/code&gt;, &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;Get-ADDomainController&lt;/code&gt;, &lt;code&gt;Get-ADOptionalFeature&lt;/code&gt;, &lt;code&gt;whoami /groups&lt;/code&gt;, and &lt;code&gt;Get-ADGroupMember&lt;/code&gt;. Transferring or seizing roles, editing &lt;code&gt;fSMORoleOwner&lt;/code&gt;, metadata cleanup, demoting or rebuilding a DC, changing group membership, and changing the time configuration are deliberate changes. Change one link at a time, prove it from every DC, and check current Microsoft Learn for version-specific behavior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windowsserver</category>
      <category>activedirectory</category>
      <category>sysadmin</category>
      <category>powershell</category>
    </item>
    <item>
      <title>Hyper-V Live Migration Failed (Event 21502): A Read-First Switch, Processor, Version, and Kerberos Triage</title>
      <dc:creator>AdminPackStudio</dc:creator>
      <pubDate>Mon, 19 Oct 2026 08:41:26 +0000</pubDate>
      <link>https://dev.to/adminpackstudio/hyper-v-live-migration-failed-event-21502-a-read-first-switch-processor-version-and-kerberos-181f</link>
      <guid>https://dev.to/adminpackstudio/hyper-v-live-migration-failed-event-21502-a-read-first-switch-processor-version-and-kerberos-181f</guid>
      <description>&lt;p&gt;Helpdesk: "Since we added the two new hosts last week, moving VMs to them fails. Hyper-V Manager says the migration operation failed at migration source, and the cluster logged Event 21502. One VM moves fine, three don't, and one we moved last month won't go back to the old host either. A forum post says to turn on processor compatibility for every VM, switch every host to CredSSP, allow live migration on any network, and turn off the firewall on the new hosts. Can we do that?"&lt;/p&gt;

&lt;p&gt;Not yet. &lt;strong&gt;"Hyper-V live migration failed" is almost never one setting. Event 21502 is the summary Hyper-V logs when a live migration fails (you'll see it most on clustered hosts), and the reason is in the message text under it: a virtual switch name that doesn't exist on the destination, processor features the destination can't offer, a configuration version it doesn't support, migration settings that don't match, an authentication path that can't delegate, a connection to TCP 6600 that never opens, or a destination that can't hold the VM (memory, storage path, ISO, owners).&lt;/strong&gt; Microsoft says it directly: "live migration can fail due to a wide array of factors", and its troubleshooting page lists about twenty different messages under the single heading Event ID 21502. Turning on processor compatibility for every VM hides CPU features from workloads that didn't need it (and needs each VM shut down), switching to CredSSP trades a delegation problem for a sign-in problem (and stops working on Windows Server 2025 with Credential Guard), any-network migration sends unencrypted VM memory over networks you didn't choose, and turning off the host firewall proves nothing about why the listener on 6600 isn't answering. Work through it as a chain: &lt;strong&gt;which VM, which hosts, which inner message&lt;/strong&gt; → &lt;strong&gt;what does the full error say on both hosts?&lt;/strong&gt; → &lt;strong&gt;what does &lt;code&gt;Compare-VM&lt;/code&gt; report?&lt;/strong&gt; → &lt;strong&gt;do the virtual switches, adapters, and attached media exist on the destination?&lt;/strong&gt; → &lt;strong&gt;can the destination offer the VM's processor features?&lt;/strong&gt; → &lt;strong&gt;does the destination support the VM's configuration version?&lt;/strong&gt; → &lt;strong&gt;are migration settings and networks the same on both sides?&lt;/strong&gt; → &lt;strong&gt;can the source authenticate to the destination?&lt;/strong&gt; → &lt;strong&gt;does TCP 6600 connect?&lt;/strong&gt; → &lt;strong&gt;can the destination hold the VM?&lt;/strong&gt; &lt;code&gt;Get-WinEvent&lt;/code&gt; on the Hyper-V logs of both hosts, &lt;code&gt;Compare-VM&lt;/code&gt;, &lt;code&gt;Get-VMNetworkAdapter&lt;/code&gt;, &lt;code&gt;Get-VMSwitch&lt;/code&gt;, &lt;code&gt;Get-VMProcessor&lt;/code&gt;, &lt;code&gt;Get-VM&lt;/code&gt;, &lt;code&gt;Get-VMHostSupportedVersion&lt;/code&gt;, &lt;code&gt;Get-VMHost&lt;/code&gt;, &lt;code&gt;Get-VMMigrationNetwork&lt;/code&gt;, &lt;code&gt;Get-ADComputer&lt;/code&gt;, &lt;code&gt;Test-NetConnection&lt;/code&gt;, and the failover cluster cmdlets are the sources for that chain. Change processor compatibility, authentication, and networks at once and you'll never know which one was broken.&lt;/p&gt;

&lt;p&gt;If the inner message is "The target principal name is incorrect", &lt;a href="https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak"&gt;The Target Principal Name Is Incorrect&lt;/a&gt; covers the Kerberos side of that error. If the VM won't move because a checkpoint or its AVHDX chain is broken, &lt;a href="https://dev.to/adminpackstudio/hyper-v-checkpoint-operation-failed-a-read-first-vss-storage-permissions-and-orphaned-avhdx-5ep"&gt;Hyper-V Checkpoint Operation Failed&lt;/a&gt; covers that side. This post covers &lt;strong&gt;"a running Hyper-V VM won't live migrate between Windows Server hosts, clustered or not: Event 21502 in the cluster, 'failed at migration source' or 'failed at migration destination' in Hyper-V Manager, a processor or hardware compatibility error, a failed-to-authenticate or no-credentials error, a failed-to-establish-a-connection error, or a failure that happens one way only, and you need a read-first path before you change processor compatibility, authentication, migration networks, or firewall rules."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Event 21502 is the envelope, not the letter.&lt;/strong&gt; Read the inner message and its hex code on both hosts before you change anything (Step 2). Microsoft's first check is a compatibility report: run &lt;code&gt;Compare-VM&lt;/code&gt; against the destination (Step 3).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch names must match exactly.&lt;/strong&gt; Microsoft: "The virtual switch must have the same name on all nodes." (Step 4).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processor compatibility is per VM, needs the VM off, and has limits.&lt;/strong&gt; "Even when processor compatibility is enabled, you can't move VMs between hosts with different processor manufacturers." (Step 5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One way only usually means version.&lt;/strong&gt; A VM upgraded on a newer host can't go back: "This action can't be rolled back." (Step 6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication is a choice with consequences.&lt;/strong&gt; "Kerberos lets you avoid signing in to the server, but requires you to set up constrained delegation." CredSSP needs a sign-in on the source and breaks with Credential Guard on Windows Server 2025 (Step 8).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the listener before the firewall.&lt;/strong&gt; Microsoft's checklist: "Check whether the TCP Port 6600 and 3343 (for clustering) are listening on both sides." (Step 9).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where in the chain did it break?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What should be true&lt;/th&gt;
&lt;th&gt;Typical symptom when it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Symptom captured&lt;/td&gt;
&lt;td&gt;Which VM, which source and destination, clustered or not, started from where, the full message, since when&lt;/td&gt;
&lt;td&gt;"Live migration is broken" with no VM, host pair, or time written down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Full error read&lt;/td&gt;
&lt;td&gt;The inner message and hex code are known, on both the source and the destination&lt;/td&gt;
&lt;td&gt;Event 21502 quoted alone; the actual reason never read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Compatibility report&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Compare-VM&lt;/code&gt; from the source against the destination returns no incompatibilities&lt;/td&gt;
&lt;td&gt;The report names a missing switch, a processor, or a version the destination can't take&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Switches and media&lt;/td&gt;
&lt;td&gt;Every switch the VM uses exists with the same name on the destination; attached ISOs are reachable there&lt;/td&gt;
&lt;td&gt;Fails at less than 10%; a switch that "doesn't exist on the destination node"; an ISO or virtual disk provider error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Processor&lt;/td&gt;
&lt;td&gt;The destination offers the processor features the running VM was started with&lt;/td&gt;
&lt;td&gt;"processor-specific features not supported"; "hardware on the destination computer isn't compatible"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Configuration version&lt;/td&gt;
&lt;td&gt;The destination supports the VM's configuration version&lt;/td&gt;
&lt;td&gt;Moves one way, fails the other; Event 10698 with 21502&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Settings and networks&lt;/td&gt;
&lt;td&gt;Migration enabled, same authentication protocol, a reachable migration network on both sides, limits not hit&lt;/td&gt;
&lt;td&gt;Event 21501 (limit reached); traffic on the wrong network; 0x000013AB in a cluster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Authentication&lt;/td&gt;
&lt;td&gt;CredSSP with a sign-in on the source, or Kerberos with constrained delegation both ways&lt;/td&gt;
&lt;td&gt;0x8009030E "No credentials are available"; 0x8009030D; 0x80090322&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Connection&lt;/td&gt;
&lt;td&gt;The destination's listener on TCP 6600 answers the source (and 3343 between cluster nodes)&lt;/td&gt;
&lt;td&gt;0x8007274D refused; 0x8007274C timed out; 0x8007271D access forbidden; listener disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Destination capacity&lt;/td&gt;
&lt;td&gt;Enough memory, a writable storage path, the right possible owners, no leftover state&lt;/td&gt;
&lt;td&gt;0x800705AA or 0x8007000E memory; Event 20413 path; 0x80071398 owner; folder errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11. Change&lt;/td&gt;
&lt;td&gt;Only after Steps 1-10 agree: one link, one change&lt;/td&gt;
&lt;td&gt;Every VM in compatibility mode, every host on CredSSP, same failure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1: Capture the symptom (read-only)
&lt;/h2&gt;

&lt;p&gt;Write these on the ticket first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which VM, and how many&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One VM, every VM to one host, or every VM everywhere. One VM points at its own settings (Steps 4-6); one destination points at that host (Steps 4, 7, 9, 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Source and destination host&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exact names, Windows Server version and build of each, CPU vendor and generation of each. Different versions point at Step 6; different CPUs at Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Clustered or not&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A clustered VM moved in Failover Cluster Manager, a standalone move in Hyper-V Manager, a &lt;code&gt;Move-VM&lt;/code&gt;, or System Center Virtual Machine Manager. The settings that apply differ (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Started from where&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Signed in on the source host, on the destination, or from a management server or jump box. With CredSSP it matters a lot (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full message and percentage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The inner lines, the hex code, and roughly how far it got. Microsoft ties "fails at &amp;lt; 10%" to a missing switch and "90%~100%" to a path problem (Steps 4 and 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Since when, and what changed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;New hosts, a Windows Server upgrade, BIOS or firmware updates, a VM configuration upgrade, a new switch, a GPO or security baseline, an AD delegation change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time of one failing attempt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;So you can match it to events on both hosts and in the cluster log (Step 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then branch on what you see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it usually means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;a virtual switch that "doesn't exist on the destination node", or failure under 10%&lt;/td&gt;
&lt;td&gt;The switch name differs on the destination (Microsoft's 21502 entry)&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"processor-specific features not supported" or "hardware on the destination computer isn't compatible"&lt;/td&gt;
&lt;td&gt;CPU features, BIOS settings, or microcode differ between hosts&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works one way, fails coming back&lt;/td&gt;
&lt;td&gt;The VM's configuration version was upgraded on the newer host&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"please wait for completion of an ongoing migration operation" (Event 21501)&lt;/td&gt;
&lt;td&gt;Too many simultaneous migrations for the current limit&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8009030E "No credentials are available in the security package"&lt;/td&gt;
&lt;td&gt;CredSSP without a sign-in on the source, or Kerberos delegation missing or blocked&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x80090322 "The target principal name is incorrect"&lt;/td&gt;
&lt;td&gt;Kerberos reached the wrong host or name; Microsoft's example is a cross-cluster move on the wrong network&lt;/td&gt;
&lt;td&gt;Steps 7 and 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8007274D, 0x8007274C, 0x80072746, or 0x8007271D&lt;/td&gt;
&lt;td&gt;The connection to TCP 6600: refused, timed out, reset, or blocked&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"disabled the listener for Virtual Machine migration connections"&lt;/td&gt;
&lt;td&gt;Group Policy processing on the destination failed&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x800705AA, 0x8007000E, 0x80071398, Event 20413, or a folder error&lt;/td&gt;
&lt;td&gt;The destination can't hold the VM, can't own it, or can't reach its path&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2: Read the full error on both hosts (read-only)
&lt;/h2&gt;

&lt;p&gt;Event 21502 is a summary. The reason is in the lines under it, and often in a second event on the other host. Microsoft's own list for Event ID 21502 runs from a missing virtual switch to processor features, Kerberos errors, memory, ISO files, and storage oplocks, and in Failover Cluster Manager it points you to the VM's &lt;strong&gt;Information details&lt;/strong&gt; &amp;gt; &lt;strong&gt;Show details&lt;/strong&gt; for the full text.&lt;/p&gt;

&lt;p&gt;Find the Hyper-V and clustering logs that have events on each host, then pull the migration events around the failed attempt from both the source and the destination:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On the source and on the destination: which Hyper-V and cluster logs have events here&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ListLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*Hyper-V*'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*FailoverClustering*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RecordCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-gt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RecordCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# The migration events from the last hour, oldest first, with the full message text&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$logs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ListLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*Hyper-V*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RecordCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-gt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$logs&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21502&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21501&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20413&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20417&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10698&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddHours&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MachineName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The event IDs in that filter are the ones Microsoft's live migration troubleshooting pages describe: 21502 (the failure itself), 21501 (migration limit), 21125 (configuration setup failed on the destination), 21024 (lost network after migration), 20413 (configuration registration failed on the destination), 20417 (long blackout time), and 10698 (listed with 21502 for configuration version problems). Widen the time window or drop the &lt;code&gt;Id&lt;/code&gt; filter if nothing comes back; the inner error is often logged under a different ID on the other host. Microsoft's data collection list also names the worker log ("Microsoft-Windows-Hyper-V-Worker-Admin") and, for clusters, &lt;code&gt;Get-ClusterLog -UseLocalTime -Destination &amp;lt;Path&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clustered hosts only: write the cluster log for every node, in local time, to one folder&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseLocalTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Destination&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Temp\ClusterLogs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the hex code first. Microsoft's 21502 entries map them like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code or text in the message&lt;/th&gt;
&lt;th&gt;Microsoft's meaning&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"a virtual switch used by the VM doesn't exist on the destination node"&lt;/td&gt;
&lt;td&gt;Switch name missing or different on the destination&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0xC03A0014 "A virtual disk support provider for the specified file was not found."&lt;/td&gt;
&lt;td&gt;An attached ISO the destination can't open&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"processor-specific features not supported on host"&lt;/td&gt;
&lt;td&gt;CPU features differ&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The hardware on the destination computer isn't compatible with the hardware requirements of this virtual machine"&lt;/td&gt;
&lt;td&gt;Processor compatibility off, or microcode differs&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"please wait for completion of an ongoing migration operation" (Event 21501)&lt;/td&gt;
&lt;td&gt;Simultaneous migration limit&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x000013AB "A cluster Network isn't available for this operation."&lt;/td&gt;
&lt;td&gt;No usable cluster network for the move&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8009030E "No credentials are available in the security package"&lt;/td&gt;
&lt;td&gt;No credentials to delegate&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8009030D "The credentials supplied to the package were not recognized"&lt;/td&gt;
&lt;td&gt;Source can't authenticate to the destination&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x80090322 "The target principal name is incorrect."&lt;/td&gt;
&lt;td&gt;Wrong host or network for Kerberos; cross-cluster network order&lt;/td&gt;
&lt;td&gt;Steps 7 and 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8007274D, 0x80072746, 0x8007274C&lt;/td&gt;
&lt;td&gt;Connection refused, reset, or timed out&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8007271D "An attempt was made to access a socket in a way forbidden by its access permissions."&lt;/td&gt;
&lt;td&gt;Firewall or antivirus&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The Virtual Machine Management Service disabled the listener for Virtual Machine migration connections."&lt;/td&gt;
&lt;td&gt;Group Policy failure on the host&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x800705AA, 0x8007000E&lt;/td&gt;
&lt;td&gt;Not enough memory on the destination&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x80071398 "the specified cluster node isn't the owner of the group, or the node isn't a possible owner of the group"&lt;/td&gt;
&lt;td&gt;Possible owners don't include the destination&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x80070569 "Logon failure: the user has not been granted the requested logon type at this computer."&lt;/td&gt;
&lt;td&gt;User rights for the virtual machine accounts&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 3: What does Compare-VM report? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's basic checklist says to "Check compatibilities issues by running a Compare-VM command." The cmdlet doesn't move anything: "The Compare-VM cmdlet compares a virtual machine and a virtual machine host for compatibility, returning a compatibility report." Run it on the source host, against the destination, for the VM that failed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On the source host: compare the running VM with the destination host&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$report&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Compare-VM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DestinationHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Each incompatibility has a message, an ID, and the object it came from&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$report&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Incompatibilities&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MessageId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Wrap&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# If the move includes storage, compare that move instead&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$report&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Compare-VM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DestinationHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-IncludeStorage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DestinationStoragePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;D:\VMs\APP01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$report&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Incompatibilities&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MessageId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Wrap&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Message&lt;/code&gt;, &lt;code&gt;MessageId&lt;/code&gt;, and &lt;code&gt;Source&lt;/code&gt; are the columns Microsoft's own &lt;code&gt;Compare-VM&lt;/code&gt; example shows, where the report says "Could not find Ethernet switch 'Production'." for a VM whose adapter used a switch the host didn't have. An empty &lt;code&gt;Incompatibilities&lt;/code&gt; list means the destination can take the VM's configuration, so look at Steps 7-10 (settings, authentication, connection, capacity). A non-empty list usually tells you which of Steps 4-6 to read next (our reading). If &lt;code&gt;Compare-VM&lt;/code&gt; itself fails with a credentials or connection error, that's the same problem the migration has: go to Steps 8 and 9.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Do the switches, adapters, and attached media exist on the destination? (read-only)
&lt;/h2&gt;

&lt;p&gt;The first entry under Event ID 21502 on Microsoft's live migration page is a switch: "Live migration of VM failed. VM failed to live migrate because a virtual switch used by the VM doesn't exist on the destination node". The action is short: "The virtual switch must have the same name on all nodes." Microsoft also notes "If a virtual machine is connected to a virtual switch that doesn't exist on the destination node, then live migration fails at &amp;lt; 10%."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On the source: which switch each of the VM's adapters uses&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMNetworkAdapter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-VMName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VMName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SwitchName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# On both hosts: the switches that exist, by exact name and type&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMSwitch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SwitchType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMSwitch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SwitchType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# On the source: anything attached to the VM's DVD drives&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMDvdDrive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-VMName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VMName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ControllerType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ControllerNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What to look for:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A &lt;code&gt;SwitchName&lt;/code&gt; on the source that isn't in the destination's list&lt;/td&gt;
&lt;td&gt;The cause Microsoft lists first; names must match exactly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same name, different &lt;code&gt;SwitchType&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The name matches but it's Internal or Private on one side and External on the other; the VM loses its network or the cluster check fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adapter on an Internal or Private switch, VM clustered&lt;/td&gt;
&lt;td&gt;Microsoft: "You can't live migrate a VM across nodes in a cluster if that VM is connected to an internal or private virtual switch." The message says "the destination has disconnected VM switch(s)"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A &lt;code&gt;Path&lt;/code&gt; to an ISO on a local disk or a share the destination can't read&lt;/td&gt;
&lt;td&gt;Microsoft's 0xC03A0014 entry: an ISO the destination can't open fails the move; the fix is to set the DVD drive to &lt;strong&gt;None&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event 21125 "Configuration setup for live migration failed on the destination node."&lt;/td&gt;
&lt;td&gt;The same switch problem seen from the destination; Microsoft's action is to make the virtual network names match and refresh the VM configuration in Failover Cluster Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event 21024 after a successful move&lt;/td&gt;
&lt;td&gt;The move worked but the VM lost its network: different subnets or VLANs on the destination switch, not a migration failure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In a cluster, after you rename or create a switch, Microsoft's steps end with Failover Cluster Manager &amp;gt; the VM role &amp;gt; &lt;strong&gt;More Actions&lt;/strong&gt; &amp;gt; &lt;strong&gt;Refresh virtual machine configuration&lt;/strong&gt; before you retry. That refresh is a change (Step 11), not a check.&lt;/p&gt;

&lt;p&gt;Microsoft's broader checklist adds team consistency: "Validate network teaming (SET or LBFO) consistency." A switch with the right name bound to a team with a different configuration is worth a second look (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Can the destination offer the VM's processor features? (read-only)
&lt;/h2&gt;

&lt;p&gt;A running VM sees the features of the host it started on. Microsoft explains why that blocks a move: "If software in the VM detects and starts using a particular processor capability, and then the VM is moved to a new virtualization host without that capability, the software can fail." So "Hyper-V performs initial checks whenever a VM live migration or save/restore operation is initiated", and "If these feature sets don't match, the migration or restore operation is canceled."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On the source: is processor compatibility turned on for this VM, and in which mode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMProcessor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-VMName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VMName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CompatibilityFor&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Same check for every VM on the host&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-VMProcessor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VMName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CompatibilityForMigrationEnabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Does the VM have checkpoints (Microsoft ties this to the hardware-not-compatible error)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMSnapshot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-VMName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VMName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SnapshotType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the result against the messages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;CompatibilityForMigrationEnabled&lt;/code&gt; False, hosts with different CPU generations&lt;/td&gt;
&lt;td&gt;Expected failure. Microsoft: "If a virtual machine doesn't have processor compatibility turned on and has one or more snapshots, the move fails if the hosts have different processor versions."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compatibility True, still "processor-specific features not supported"&lt;/td&gt;
&lt;td&gt;Microsoft's checks: "Make sure the BIOS of the host has the same settings." and "Run the Get-SpeculationControlSettings cmdlet and check the results. It should be the same on all nodes."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intel source, AMD destination (or the reverse)&lt;/td&gt;
&lt;td&gt;No setting fixes it: "Even when processor compatibility is enabled, you can't move VMs between hosts with different processor manufacturers." Shut down and move, or rebuild on the other platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New hosts got a microcode or firmware update the old ones didn't&lt;/td&gt;
&lt;td&gt;Microsoft's guidance for side channel mitigations: "the best option is to live migrate VMs only from old to new microcode (uCode) revisions"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Server 2025 cluster, &lt;code&gt;CompatibilityForMigrationMode&lt;/code&gt; shown&lt;/td&gt;
&lt;td&gt;Dynamic processor compatibility (&lt;code&gt;CommonClusterFeatureSet&lt;/code&gt;) needs configuration version 10.0 or later; &lt;code&gt;MinimumFeatureSet&lt;/code&gt; is the standard mode Microsoft says to use toward older processors outside the cluster&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two rules from Microsoft keep this from turning into a fleet-wide change. First, "You don't need to enable processor compatibility mode if you plan to stop and restart the VMs", because the guest reads the new host's features at boot. Second, "Processor compatibility mode can't be enabled or disabled while the VM is running." So for a running VM that has to move now, the choice is a short shutdown either way; the guide's tip is "Always start VMs for the first time on the oldest (least capable) CPU host." The &lt;code&gt;CompatibilityFor*&lt;/code&gt; wildcard is our form; it shows &lt;code&gt;CompatibilityForMigrationMode&lt;/code&gt; only where the host's Hyper-V module has it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Does the destination support the VM's configuration version? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's troubleshooting guide describes the pattern exactly: "Migration works one way but not in reverse (especially after moving to a newer OS)." with Event IDs 10698 and 21502. The VM's configuration version decides which hosts can run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On the source: configuration version of every VM (Microsoft's form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Version&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# On the destination: which configuration versions it can run, and its default&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMHostSupportedVersion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMHostSupportedVersion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Default&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# On the source: integration services that report a version mismatch&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMIntegrationService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-VMName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VMName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SecondaryOperationalStatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The VM's &lt;code&gt;Version&lt;/code&gt; isn't in the destination's &lt;code&gt;Get-VMHostSupportedVersion&lt;/code&gt; list&lt;/td&gt;
&lt;td&gt;The destination is an older Windows Server than the version needs. You can't fix this from the VM side; move it to a host that supports it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same version on both lists, moves one way only&lt;/td&gt;
&lt;td&gt;Look at Steps 5 and 7-9 instead; the version isn't the blocker (our reading)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;SecondaryOperationalStatus&lt;/code&gt; ProtocolMismatch&lt;/td&gt;
&lt;td&gt;Out-of-date integration services; Microsoft's checklist says to "Confirm VM integration services are up-to-date."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Don't upgrade a VM's configuration version to make a mixed-version move work. Microsoft's guidance is not to upgrade until "You upgrade your Hyper-V hosts to the latest version of Windows or Windows Server.", "You upgrade the cluster functional level.", and "You're sure that you won't need to move the virtual machine back to a Hyper-V host that runs a previous version of Windows or Windows Server." The troubleshooting guide adds: "This action can't be rolled back. VMs with the upgraded version can't be migrated back to older hosts." During a rolling upgrade, keep VMs at the version the oldest host supports until the last old host is gone (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Are migration settings and networks the same on both sides? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's basic checklist has two lines for this: "Check whether the migration is authorized on each side." and "Check whether the protocol used is identical on each side." Read the host settings on both hosts, then the networks each one accepts migrations on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On both hosts: every live migration setting (the wildcard is our form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Migration&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Migration&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Networks each host accepts incoming live migration on&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMMigrationNetwork&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-VMMigrationNetwork&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Clustered hosts: cluster networks and their role, the cluster-wide limit,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# and which networks the Virtual Machine resource type excludes from migration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterNetwork&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Cluster&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MaximumParallelMigrations&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-ClusterResourceType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Virtual Machine"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ClusterParameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MigrationExcludeNetworks&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What the settings mean, from Microsoft's &lt;code&gt;Set-VMHost&lt;/code&gt; reference:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;What to compare&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VirtualMachineMigrationAuthenticationType&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"The acceptable values for this parameter are: Kerberos and CredSSP." Both hosts should use the same one (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UseAnyNetworkForMigration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"If set to $False, incoming live migration traffic is transmitted only on the networks specified in the MigrationNetworks property of the host." The destination must list a network the source can reach&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MaximumVirtualMachineMigrations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The per-host limit. In a cluster, the cluster property wins: Microsoft says to check it with &lt;code&gt;(Get-Cluster).MaximumParallelMigrations&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VirtualMachineMigrationPerformanceOption&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TCP/IP, Compression, or SMB. "Compression is the default setting." SMB moves memory over SMB 3.0 instead of a plain TCP stream&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the result:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Migration not enabled on the destination&lt;/td&gt;
&lt;td&gt;Microsoft's setup step is Hyper-V Settings &amp;gt; Live Migrations &amp;gt; &lt;strong&gt;Enable incoming and outgoing live migrations&lt;/strong&gt;, on each host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kerberos on one host, CredSSP on the other&lt;/td&gt;
&lt;td&gt;The source can't authenticate the way the destination expects; pick one (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;UseAnyNetworkForMigration&lt;/code&gt; False and no shared subnet in &lt;code&gt;Get-VMMigrationNetwork&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The destination only accepts migrations on a network the source isn't on; the connection fails (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event 21501, "please wait for completion of an ongoing migration operation"&lt;/td&gt;
&lt;td&gt;The limit was hit. Microsoft: "Wait to finish other live migrations or increase the number of simultaneous live migrations."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster, 0x000013AB&lt;/td&gt;
&lt;td&gt;Microsoft: "Make sure the cluster network is configured and Allow cluster network communication on this network is selected." A &lt;code&gt;Role&lt;/code&gt; of 0 means "Do not allow cluster network communication"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;MigrationExcludeNetworks&lt;/code&gt; lists the only network both nodes share&lt;/td&gt;
&lt;td&gt;The cluster has nothing left to migrate over&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-cluster move, 0x80090322&lt;/td&gt;
&lt;td&gt;Microsoft: "Migration was cross-cluster but as per Live Migration Network order, the private Network was selected."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event 20417, "unexpectedly long blackout time"&lt;/td&gt;
&lt;td&gt;The move worked but slowly. Microsoft: "Make sure there's enough bandwidth available for the live migration."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft's cluster network guidance sets the rule for every host involved: "All Hyper-V hosts that can initiate or receive a live migration must have connectivity to a network that is configured to allow live migrations." It also explains why "allow any network" is not a free fix: "live migration traffic isn't encrypted when sent over the network", so isolate it "onto trusted, private networks". In a cluster, "By default, live migration traffic uses the cluster network topology to discover available networks and to establish priority." The order and exclusions you set in Failover Cluster Manager (right-click &lt;strong&gt;Networks&lt;/strong&gt; &amp;gt; &lt;strong&gt;Live Migration Settings&lt;/strong&gt;) are what &lt;code&gt;MigrationExcludeNetworks&lt;/code&gt; shows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Can the source authenticate to the destination? (read-only)
&lt;/h2&gt;

&lt;p&gt;The source host opens the migration connection to the destination, so it needs credentials it can present there. Microsoft's setup page gives the two options and their cost: "Kerberos lets you avoid signing in to the server, but requires you to set up constrained delegation." and "CredSSP lets you avoid setting up constrained delegation, but requires you to sign in to the source server." When neither works you get this, from the same page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Virtual machine migration operation failed at migration Source.
Failed to establish a connection with host computer name: No credentials are available in the security package 0x8009030E.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read which protocol each host uses, what each host may delegate to in AD, and what the account starting the move allows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Which protocol each host uses for live migration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VirtualMachineMigrationAuthenticationType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Kerberos: what each host may delegate to (Microsoft's blog form; run for both hosts)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADComputer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;msDS-AllowedToDelegateTo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExpandProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;msDS-AllowedToDelegateTo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADComputer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;msDS-AllowedToDelegateTo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExpandProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;msDS-AllowedToDelegateTo&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Protocol transition ("Use any authentication protocol") on each host's account&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADComputer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TrustedToAuthForDelegation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TrustedToAuthForDelegation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# The admin account that starts the move: marked sensitive, or in Protected Users?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;jsmith-adm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AccountNotDelegated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AccountNotDelegated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADGroupMember&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Protected Users"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SamAccountName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;REM SPNs registered on each host (Microsoft's data collection form)
setspn -L HV01
setspn -L HV02
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the result:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CredSSP, move started from a management server, Failover Cluster Manager on another node, or a remote console&lt;/td&gt;
&lt;td&gt;Expected 0x8009030E. Microsoft: "To fix this problem, sign in to the source server and try the move again." Moving back means signing in to the other host first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source host is Windows Server 2025, CredSSP&lt;/td&gt;
&lt;td&gt;Microsoft: "Starting with Windows Server 2025, Credential Guard is enabled by default on all domain-joined servers that aren't domain controllers." and "If the source machine of a Live Migration uses CredSSP for delegation with Credential Guard enabled, the Live Migration fails."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kerberos, but a host's &lt;code&gt;msDS-AllowedToDelegateTo&lt;/code&gt; lacks the other host&lt;/td&gt;
&lt;td&gt;Delegation is missing, or set one way only. Microsoft's steps set it on the source for the destination and then "repeat the process" on the destination for the source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The list has Microsoft Virtual Console Service, not Migration Service&lt;/td&gt;
&lt;td&gt;Microsoft's blog warns "don't mix up the Microsoft Virtual System Migration Service with the Microsoft Virtual Console Service" in Active Directory Users and Computers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No cifs entry for the other host&lt;/td&gt;
&lt;td&gt;Moves of the VM alone may work; moves that include storage need it: "Add cifs (required to migrate storage) and Microsoft Virtual System Migration Service (required to migrate virtual machine)."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;TrustedToAuthForDelegation&lt;/code&gt; False ("Use Kerberos only")&lt;/td&gt;
&lt;td&gt;Microsoft's blog: on Windows Server 2016 and later, live migration started from a remote system needs "Use any authentication protocol", because it uses protocol transition (paraphrased)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The admin account has &lt;code&gt;AccountNotDelegated&lt;/code&gt; True, or is in Protected Users&lt;/td&gt;
&lt;td&gt;Its credentials can't be delegated, so remotely started moves fail even with correct delegation. Microsoft: "check the setting and group membership when you troubleshoot delegation issues"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8009030D "The credentials supplied to the package were not recognized"&lt;/td&gt;
&lt;td&gt;Microsoft's text: "Make sure the operation is initiated on the source host of the migration, or the source host is configured to use Kerberos for the authentication of migration connections and constrained delegation is enabled for the host in active directory."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;setspn -L&lt;/code&gt; shows no Microsoft Virtual System Migration Service SPN&lt;/td&gt;
&lt;td&gt;Microsoft's guide: "Ensure the required Service Principal Names (SPNs) are registered."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x80090322 within one cluster or between standalone hosts&lt;/td&gt;
&lt;td&gt;Kerberos got a ticket for a different machine than the one that answered: check name resolution and SPNs the way the &lt;a href="https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak"&gt;Target Principal Name post&lt;/a&gt; does (our reading)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two timing notes. Delegation changes take effect after "The changes replicate to the domain controllers that the servers running Hyper-V are logged into." and "The domain controller issues a new Kerberos ticket." Microsoft's 0x8009030D fix says to "Wait up to 15 minutes for Keberos tickets to time out" (sic) or purge the computer's tickets (Step 11). A fix that "didn't work" five minutes after the change may simply not have reached the host yet (our reading). Microsoft's blog also confirms that Hyper-V Manager and &lt;code&gt;Move-VM&lt;/code&gt; fail the same way, so switching tools doesn't help.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: Does TCP 6600 connect from the source to the destination? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's checks use TCP 6600 for the Hyper-V migration listener and 3343 for clustering. Microsoft's form of the check is &lt;code&gt;netstat -ano | findstr /I /C:"6600"&lt;/code&gt;. The same reading in PowerShell, plus a test from the source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On the destination: is the Hyper-V Virtual Machine Management service running and listening&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vmms&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetTCPConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;6600&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OwningProcess&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Clustered nodes: the cluster service port&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetTCPConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3343&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# From the source: does 6600 answer by name and on the migration network address&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;6600&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.168.10.12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;6600&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# On both hosts: the Hyper-V firewall rules and their state (the wildcard is our form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DisplayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*Hyper-V*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the result:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nothing listening on 6600 on the destination&lt;/td&gt;
&lt;td&gt;Migration isn't enabled there (Step 7), the service is stopped, or Group Policy disabled the listener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The Virtual Machine Management Service disabled the listener for Virtual Machine migration connections."&lt;/td&gt;
&lt;td&gt;Microsoft's fix starts with &lt;code&gt;gpupdate /force&lt;/code&gt;; if that reports that "The processing of Group Policy failed", the local policy file is suspect: "The file must start with the PReg signature." The &lt;a href="https://dev.to/adminpackstudio/group-policy-not-applying-a-read-first-scope-filtering-replication-and-client-triage-31ho"&gt;Group Policy Not Applying post&lt;/a&gt; covers the rest of that path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Listening, but &lt;code&gt;Test-NetConnection&lt;/code&gt; fails from the source&lt;/td&gt;
&lt;td&gt;A firewall between the hosts or on the destination. 0x8007274C means the connection attempt timed out; Microsoft also lists a corrupt Registry.pol for it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8007274D "No connection could be made because the target machine actively refused it"&lt;/td&gt;
&lt;td&gt;The source reached an address where nothing listens on 6600: often a different network than the one in the destination's &lt;code&gt;Get-VMMigrationNetwork&lt;/code&gt; list (our reading)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x80072746 "An existing connection was forcibly closed by the remote host."&lt;/td&gt;
&lt;td&gt;The connection opened and then dropped: Microsoft points to the listening ports and the cluster network metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8007271D&lt;/td&gt;
&lt;td&gt;Microsoft: "Check Firewall settings and Antivirus exclusion." Its Hyper-V antivirus guidance lists process exclusions for vmms.exe and vmwp.exe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Events 20406 and 280, "The client cannot connect to the destination specified in the request"&lt;/td&gt;
&lt;td&gt;WinRM between the hosts. Microsoft: "Ensure hosts can resolve and reach each other via hostname/IP (test with ping)." and use &lt;code&gt;winrm quickconfig&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;Test-NetConnection -Port&lt;/code&gt; tests TCP only. The listener answering by name but not on the migration address (or the reverse) is the most useful split you can get here: it tells you whether the problem is the path or the host (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 10: Can the destination hold the VM? (read-only)
&lt;/h2&gt;

&lt;p&gt;The last group of 21502 messages is about the destination itself: memory, the storage path, cluster ownership, user rights, and leftover state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On the source: the VM's memory settings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMMemory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-VMName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# On the destination: what's already running and how much memory it holds&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Running'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MemoryAssigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Where the VM's disks live, and whether the destination path exists&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMHardDiskDrive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-VMName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VMName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ControllerType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Invoke-Command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ScriptBlock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Test-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'D:\VMs'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Clustered: which nodes may own the VM and its configuration (Microsoft's form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Virtual Machine APP01"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ClusterOwnerNode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-ClusterResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Virtual Machine Configuration APP01"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ClusterOwnerNode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-ClusterNode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the result:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0x800705AA "Insufficient system resources exist to complete the requested service." or 0x8007000E "Ran out of memory"&lt;/td&gt;
&lt;td&gt;Microsoft: "Reduce the memory assigned to the virtual machine or turn off some virtual machines on the destination node."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x80071398, destination missing from &lt;code&gt;Get-ClusterOwnerNode&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Microsoft: "The owner node must have all cluster nodes." Check both the Virtual Machine and the Virtual Machine Configuration resource&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event 20413, fails at 90% to 100%&lt;/td&gt;
&lt;td&gt;Microsoft: the nodes have different system drive letters, and the destination can't register the configuration at its path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Folder errors on the destination, or the path test returns False&lt;/td&gt;
&lt;td&gt;Microsoft's checklist: "Compare permissions on the folders containing the virtual machines files with a working host with the same operating system level." Storage moves also need cifs delegation (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x80070569 logon type not granted&lt;/td&gt;
&lt;td&gt;Microsoft's checklist: under User Rights Assignment, &lt;strong&gt;Create symbolic links&lt;/strong&gt; should list Administrators and NT VIRTUAL MACHINE\Virtual Machines, and &lt;strong&gt;Log on as a service&lt;/strong&gt; should list NT SERVICE\ALL SERVICES and NT VIRTUAL MACHINE\Virtual Machines. A security baseline GPO that rewrites those lists breaks this&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared VHDX attached&lt;/td&gt;
&lt;td&gt;Microsoft: "Shared virtual disks can only be used in clustered VM roles and can't be migrated using standard methods."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vTPM or shielded VM, "The key protector for the virtual machine could not be unwrapped."&lt;/td&gt;
&lt;td&gt;The destination doesn't have the key protector certificates; Microsoft's fix is to export them from the source and import them on the destination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saved state that can't be read, a VM stuck in "Backing up", or a broken checkpoint chain&lt;/td&gt;
&lt;td&gt;Fix the VM's state first; the &lt;a href="https://dev.to/adminpackstudio/hyper-v-checkpoint-operation-failed-a-read-first-vss-storage-permissions-and-orphaned-avhdx-5ep"&gt;Hyper-V Checkpoint Operation Failed post&lt;/a&gt; covers checkpoints and AVHDX chains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x800705B4 timeout after a node crashed&lt;/td&gt;
&lt;td&gt;Microsoft's entry: symbolic links for the VM left on the destination; its workaround is quick migrations in both directions or a configuration version upgrade&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;MemoryAssigned&lt;/code&gt;, &lt;code&gt;Path&lt;/code&gt;, and the other property lists above are our forms; Microsoft's own wording for the memory case is simply "Check the available memory on the destination host."&lt;/p&gt;




&lt;h2&gt;
  
  
  Common false starts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tempting move&lt;/th&gt;
&lt;th&gt;Why it's premature (our reading)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Turn on processor compatibility for every VM&lt;/td&gt;
&lt;td&gt;Hides CPU features from every workload, needs each VM shut down, and doesn't help with a switch, version, authentication, or connection failure. Microsoft recommends it "only during the migration process"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switch every host to CredSSP&lt;/td&gt;
&lt;td&gt;Trades a delegation problem for a sign-in-on-the-source problem, and fails on Windows Server 2025 sources with Credential Guard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set &lt;code&gt;UseAnyNetworkForMigration&lt;/code&gt; to $true&lt;/td&gt;
&lt;td&gt;Sends unencrypted VM memory over networks you didn't pick, and doesn't fix a listener or delegation problem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Turn off the host firewall&lt;/td&gt;
&lt;td&gt;Proves nothing about a listener that isn't there, and leaves the host open while you test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upgrade the VM configuration version&lt;/td&gt;
&lt;td&gt;Can't be undone, and blocks the VM from every older host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rename the switch on the source&lt;/td&gt;
&lt;td&gt;Breaks every other VM on that host that uses the old name; match the destination to the source or both to a standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unconstrained delegation for the hosts&lt;/td&gt;
&lt;td&gt;Wider than Hyper-V needs, and Credential Guard blocks Kerberos unconstrained delegation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart VMMS or reboot the destination&lt;/td&gt;
&lt;td&gt;Clears the evidence (the listener state, the events) without changing the setting that caused it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick migration "because live migration is broken"&lt;/td&gt;
&lt;td&gt;Works for some causes because it saves and restores the VM, but hides which link was broken; the next live migration fails the same way&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evict and re-add the cluster node&lt;/td&gt;
&lt;td&gt;Changes ownership, networks, and possibly the cluster log you needed, before anyone read the inner error&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 11: Change one link, then prove it
&lt;/h2&gt;

&lt;p&gt;Before any change, write down what you're about to change: the &lt;code&gt;Get-VMHost&lt;/code&gt; migration settings, the switch list, the VM's processor and version settings, and the delegation lists from Steps 4-8. Then change only the link Steps 1-10 pointed to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Switches and media (Step 4).&lt;/strong&gt; Create or rename the switch on the destination so it matches the name the VM uses, with the same type and uplink, following Microsoft's resolution: "If the virtual switch doesn't exist, create or rename it with the same name and settings such as in other hosts." In a cluster, refresh the VM configuration in Failover Cluster Manager afterward. For an ISO the destination can't open, eject it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On the source: remove the ISO from the VM's DVD drive (Microsoft's fix is to select None)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-VMDvdDrive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-VMName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set-VMDvdDrive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a clustered VM on an Internal or Private switch, Microsoft's workaround is to clear the adapter's &lt;strong&gt;Protected network&lt;/strong&gt; option, which in PowerShell is &lt;code&gt;Set-VMNetworkAdapter -NotMonitoredInCluster $true&lt;/code&gt; for that adapter. That stops the cluster from checking that adapter's connectivity, so use it only for adapters that are meant to be host-local (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Processor (Step 5).&lt;/strong&gt; Shut the VM down, turn on compatibility for that VM only, start it, and move it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Microsoft's forms; the VM must be off&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Stop-VM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-VMProcessor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-VMName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-CompatibilityForMigrationEnabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Windows Server 2025 cluster, configuration version 10.0 or later: dynamic mode instead&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Set-VMProcessor -VMName APP01 -CompatibilityForMigrationEnabled $true -CompatibilityForMigrationMode CommonClusterFeatureSet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-VM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the hardware refresh is done, Microsoft recommends turning it back off so the VM can use the full processor; that's another short shutdown. If BIOS settings or &lt;code&gt;Get-SpeculationControlSettings&lt;/code&gt; results differ between hosts, fix the host that's out of line instead of masking it on every VM. Across microcode levels, move old to new.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration version (Step 6).&lt;/strong&gt; Don't downgrade; you can't. Keep the VM on hosts that support its version, or, once every host in its path runs the newer Windows Server and the cluster functional level is raised, upgrade it with Microsoft's &lt;code&gt;Update-VMVersion &amp;lt;vmname&amp;gt;&lt;/code&gt; (VM shut down, one-way).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Settings and networks (Step 7).&lt;/strong&gt; Enable migration on the host that's missing it, make the authentication protocol the same on both hosts, and add the shared migration network to the destination. Microsoft's PowerShell form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On each host that needs it (Microsoft's three-cmdlet example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Enable-VMMigration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Set-VMMigrationNetwork&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.168.10.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-VMHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-VirtualMachineMigrationAuthenticationType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Kerberos&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Raise the simultaneous migration limit only if the host and the network can take it; Microsoft's note on that setting is "Consider host performance when changing this number." In a cluster, change the live migration network order in Failover Cluster Manager (&lt;strong&gt;Networks&lt;/strong&gt; &amp;gt; &lt;strong&gt;Live Migration Settings&lt;/strong&gt;) or the &lt;code&gt;MigrationExcludeNetworks&lt;/code&gt; parameter, not each host. For a cross-cluster move that picked a private network, Microsoft's fix is "Change the Live Migration Network order for cross-cluster and change it back after the migration."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication (Step 8).&lt;/strong&gt; Prefer Kerberos with constrained delegation. With a Domain Admins account, on the source host's computer object in Active Directory Users and Computers: &lt;strong&gt;Delegation&lt;/strong&gt; tab &amp;gt; &lt;strong&gt;Trust this computer for delegation to the specified services only&lt;/strong&gt; &amp;gt; &lt;strong&gt;Use any authentication protocol&lt;/strong&gt; &amp;gt; &lt;strong&gt;Add&lt;/strong&gt; the destination host, and select &lt;strong&gt;cifs&lt;/strong&gt; and &lt;strong&gt;Microsoft Virtual System Migration Service&lt;/strong&gt;. Then repeat on the destination for the source. Set both hosts to Kerberos (Step 7 example). Then let the change take effect, either by waiting or, on each host, with Microsoft's ticket purge for the computer account's logon session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;REM Purge the host's own (SYSTEM, 0x3e7) Kerberos tickets so it requests new ones with the delegation change
klist purge -li 0x3e7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's &lt;code&gt;klist&lt;/code&gt; reference warns: "Purging tickets destroys all tickets that you have cached, so use this attribute with caution." On Windows Server 2025, don't disable Credential Guard to bring CredSSP back; Microsoft's resolution is that "Kerberos Constrained Delegation and Resource-Based Kerberos Constrained Delegation are recommended" instead. If the admin account is in Protected Users or marked sensitive, start the move while signed in on the source host, or use an account meant for that, rather than removing the protection (our reading). If the Microsoft Virtual System Migration Service SPN is missing, Microsoft's guide registers it with &lt;code&gt;setspn -s Microsoft Virtual System Migration Service/&amp;lt;FQDN&amp;gt; &amp;lt;ComputerName&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connection (Step 9).&lt;/strong&gt; If the listener was disabled by Group Policy, run &lt;code&gt;gpupdate /force&lt;/code&gt; on that host and read the result; if Registry.pol is corrupt, Microsoft's fix is to restore it from a backup or copy the GroupPolicy folder from a working server. Open TCP 6600 between the hosts on the migration network (and 3343 between cluster nodes) in whatever firewall sits between them. Add Microsoft's Hyper-V process exclusions to third-party antivirus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Destination capacity (Step 10).&lt;/strong&gt; Free memory on the destination or pick another one; add the missing node to the possible owners of both cluster resources; give the destination the same system drive letter as the other nodes; restore the default user rights for the NT VIRTUAL MACHINE\Virtual Machines group in the GPO that removed them; fix the folder permissions on the destination path to match a working host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then prove it.&lt;/strong&gt; Run &lt;code&gt;Compare-VM -Name APP01 -DestinationHost HV02&lt;/code&gt; again and confirm the &lt;code&gt;Incompatibilities&lt;/code&gt; list is empty, then move the VM the way the user did (same tool, same host it was started from):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Standalone hosts (Microsoft's Move-VM form; add -IncludeStorage for a storage move)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Move-VM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APP01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DestinationHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Clustered VM (Microsoft's form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Move-ClusterVirtualMachineRole&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"APP01"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HV02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MigrationType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Live&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass criteria (our reading): the move completes, &lt;code&gt;Get-VM -ComputerName HV02&lt;/code&gt; shows the VM Running there, no new 21502 or worker errors on either host for that time, the VM's network works on the destination (no Event 21024), and the move back to the source works too. Then retry the other VMs from the ticket.&lt;/p&gt;




&lt;h2&gt;
  
  
  When a change is justified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Switch name missing on the destination&lt;/td&gt;
&lt;td&gt;Create or rename it to the standard name, same type and uplink&lt;/td&gt;
&lt;td&gt;Renaming the source switch and breaking its other VMs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Processor features differ, same vendor&lt;/td&gt;
&lt;td&gt;Compatibility on for the VMs that must move live, then off again&lt;/td&gt;
&lt;td&gt;Compatibility on for every VM permanently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intel to AMD (or back)&lt;/td&gt;
&lt;td&gt;A planned shutdown and cold move&lt;/td&gt;
&lt;td&gt;Hoping a setting makes it live-migratable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration version newer than the destination&lt;/td&gt;
&lt;td&gt;Keep the VM on newer hosts until the old ones are retired&lt;/td&gt;
&lt;td&gt;Upgrading versions mid-migration, then needing to go back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CredSSP failing from a remote console&lt;/td&gt;
&lt;td&gt;Kerberos with constrained delegation, both directions&lt;/td&gt;
&lt;td&gt;CredSSP everywhere with "sign in first" as the process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Server 2025 source, CredSSP&lt;/td&gt;
&lt;td&gt;Kerberos constrained or resource-based constrained delegation&lt;/td&gt;
&lt;td&gt;Turning off Credential Guard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No shared migration network&lt;/td&gt;
&lt;td&gt;Add a dedicated, isolated migration network to both hosts&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;UseAnyNetworkForMigration&lt;/code&gt; set to $true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nothing listening on 6600&lt;/td&gt;
&lt;td&gt;Re-enable migration, fix the GPO, open the port between hosts&lt;/td&gt;
&lt;td&gt;Turning off the host firewall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination out of memory&lt;/td&gt;
&lt;td&gt;Move other VMs off it or choose another host&lt;/td&gt;
&lt;td&gt;Shrinking the VM's memory without asking its owner&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is Event ID 21502 in Hyper-V?&lt;/strong&gt;&lt;br&gt;
It's the summary event Hyper-V logs when a live migration fails (most often seen on clustered hosts), and the real reason is in its message text. Microsoft lists about twenty different causes under that one ID, from "a virtual switch used by the VM doesn't exist on the destination node" to processor features, Kerberos errors, memory, and ISO files. Read the full message on both hosts and run &lt;code&gt;Compare-VM&lt;/code&gt; (Steps 2 and 3).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does Hyper-V live migration fail with a processor compatibility error?&lt;/strong&gt;&lt;br&gt;
The destination can't offer every CPU feature the running VM saw when it started. Turn on processor compatibility for that VM (it has to be off to change the setting), make the hosts' BIOS settings and speculation control results match, and move from older to newer microcode. It won't help between Intel and AMD hosts (Step 5).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I use CredSSP or Kerberos for live migration?&lt;/strong&gt;&lt;br&gt;
Kerberos with constrained delegation, set on both hosts for each other with cifs and Microsoft Virtual System Migration Service. CredSSP only works when you're signed in on the source host, and Microsoft says "you can't use CredSSP-based live migration with Hyper-V after upgrading to Windows Server 2025" with Credential Guard on (Step 8).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does live migration fail with 0x8009030E "No credentials are available in the security package"?&lt;/strong&gt;&lt;br&gt;
Either CredSSP is in use and the move was started from somewhere other than the source host, or Kerberos is in use and delegation is missing, one-way, set to "Kerberos only", pointed at the wrong service, or blocked because the admin account can't be delegated (Protected Users or sensitive). Read &lt;code&gt;msDS-AllowedToDelegateTo&lt;/code&gt; for both hosts (Step 8).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does live migration work one way but not the other?&lt;/strong&gt;&lt;br&gt;
Usually the VM's configuration version was upgraded on the newer host, or the newer host has CPU features or microcode the older host lacks. Compare &lt;code&gt;Get-VM&lt;/code&gt; versions with &lt;code&gt;Get-VMHostSupportedVersion&lt;/code&gt; on the older host and check processor compatibility (Steps 5 and 6). With CredSSP, it can also be because you're signed in on one host but not the other.&lt;/p&gt;




&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak"&gt;The Target Principal Name Is Incorrect&lt;/a&gt; (when the migration fails with 0x80090322 and the Kerberos name is the problem)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/hyper-v-checkpoint-operation-failed-a-read-first-vss-storage-permissions-and-orphaned-avhdx-5ep"&gt;Hyper-V Checkpoint Operation Failed&lt;/a&gt; (when a broken checkpoint, saved state, or AVHDX chain blocks the move)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/group-policy-not-applying-a-read-first-scope-filtering-replication-and-client-triage-31ho"&gt;Group Policy Not Applying&lt;/a&gt; (when the migration listener is disabled because policy processing failed)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt; (the same name, port, and firewall reading for RPC between servers)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free checklist
&lt;/h2&gt;

&lt;p&gt;Turning on processor compatibility, CredSSP, and any-network migration on every host before anyone read the inner error is a change made everywhere at once. So is a Conditional Access policy enforced before anyone read the report-only results. The free &lt;strong&gt;Conditional Access pre-enforcement checklist&lt;/strong&gt; keeps break-glass accounts, pilot groups, and report-only review on one page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=hyper-v-live-migration-failed" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=hyper-v-live-migration-failed&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the &lt;strong&gt;Intune &amp;amp; M365 Admin Starter Pack&lt;/strong&gt; pairs with this triage: &lt;a href="https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=hyper-v-live-migration-failed" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=hyper-v-live-migration-failed&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Admin Pack Studio; not affiliated with Microsoft. Steps 1-10 favor read-only checks: &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;Get-ClusterLog&lt;/code&gt;, &lt;code&gt;Compare-VM&lt;/code&gt;, &lt;code&gt;Get-VMNetworkAdapter&lt;/code&gt;, &lt;code&gt;Get-VMSwitch&lt;/code&gt;, &lt;code&gt;Get-VMDvdDrive&lt;/code&gt;, &lt;code&gt;Get-VMProcessor&lt;/code&gt;, &lt;code&gt;Get-VMSnapshot&lt;/code&gt;, &lt;code&gt;Get-VM&lt;/code&gt;, &lt;code&gt;Get-VMHostSupportedVersion&lt;/code&gt;, &lt;code&gt;Get-VMIntegrationService&lt;/code&gt;, &lt;code&gt;Get-VMHost&lt;/code&gt;, &lt;code&gt;Get-VMMigrationNetwork&lt;/code&gt;, &lt;code&gt;Get-ClusterNetwork&lt;/code&gt;, &lt;code&gt;Get-Cluster&lt;/code&gt;, &lt;code&gt;Get-ClusterParameter&lt;/code&gt;, &lt;code&gt;Get-ADComputer&lt;/code&gt;, &lt;code&gt;Get-ADUser&lt;/code&gt;, &lt;code&gt;Get-ADGroupMember&lt;/code&gt;, &lt;code&gt;setspn -L&lt;/code&gt;, &lt;code&gt;Get-Service&lt;/code&gt;, &lt;code&gt;Get-NetTCPConnection&lt;/code&gt;, &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;Get-NetFirewallRule&lt;/code&gt;, &lt;code&gt;Get-VMMemory&lt;/code&gt;, &lt;code&gt;Get-VMHardDiskDrive&lt;/code&gt;, &lt;code&gt;Test-Path&lt;/code&gt;, &lt;code&gt;Get-ClusterResource&lt;/code&gt;, &lt;code&gt;Get-ClusterOwnerNode&lt;/code&gt;, and &lt;code&gt;Get-ClusterNode&lt;/code&gt;. Writing the cluster log creates files on every node. Changing switches, DVD media, processor compatibility, configuration versions, migration settings and networks, cluster network order, AD delegation, SPNs, Kerberos tickets, Group Policy, firewall rules, antivirus exclusions, user rights, cluster owners, or VM memory, and stopping, starting, or moving VMs, are deliberate changes. Change one link at a time, prove it with &lt;code&gt;Compare-VM&lt;/code&gt; and a move in both directions, and check current Microsoft Learn for version-specific behavior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windowsserver</category>
      <category>sysadmin</category>
      <category>virtualization</category>
      <category>powershell</category>
    </item>
    <item>
      <title>RD Gateway Not Working: A Read-First Certificate, Port, CAP/RAP, and NPS Triage</title>
      <dc:creator>AdminPackStudio</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:41:08 +0000</pubDate>
      <link>https://dev.to/adminpackstudio/rd-gateway-not-working-a-read-first-certificate-port-caprap-and-nps-triage-436g</link>
      <guid>https://dev.to/adminpackstudio/rd-gateway-not-working-a-read-first-certificate-port-caprap-and-nps-triage-436g</guid>
      <description>&lt;p&gt;Helpdesk: "Since the certificate renewal on Friday, nobody outside the office can connect through the gateway. Most users get 'the Remote Desktop Gateway server is temporarily unavailable', two get a certificate warning first, and from inside the office everything works. The MFA prompt on the phone also stopped showing up for one team. A forum post says to reinstall the RD Gateway role, turn off the Windows Firewall on the gateway, change the CAP and RAP to allow everyone to everything, and uninstall the NPS extension. Can we do that?"&lt;/p&gt;

&lt;p&gt;Not yet. &lt;strong&gt;"RD Gateway not working" is almost never the role itself. A connection through Remote Desktop Gateway is a chain of separate checks, and each one fails with a different symptom: the public name resolves to the gateway and TCP 443 reaches it, the certificate it serves matches that name and is trusted and current on the client, the TSGateway service is listening, the user passes a connection authorization policy (CAP), the target passes a resource authorization policy (RAP), NPS and the MFA extension answer inside the RADIUS timeout, and the gateway can reach the target on 3389.&lt;/strong&gt; Microsoft states the authorization part plainly: "For users to be granted access to network resources through a Remote Desktop Gateway, they must meet the conditions specified in one RD Connection Authorization Policy (RD CAP) and one RD Resource Authorization Policy (RD RAP)." Reinstalling the role throws away the CAPs, RAPs, and certificate binding you need to read, turning off the firewall proves nothing about the edge firewall in front of it, an allow-everything CAP and RAP opens the gateway to the internet, and removing the NPS extension removes MFA instead of fixing it. Work through it as a chain: &lt;strong&gt;which user, which client, which name, which error&lt;/strong&gt; → &lt;strong&gt;does the public name reach the gateway on 443?&lt;/strong&gt; → &lt;strong&gt;is the certificate it serves the right one, trusted, current, and checkable?&lt;/strong&gt; → &lt;strong&gt;is the gateway service healthy and listening?&lt;/strong&gt; → &lt;strong&gt;does the user pass a CAP?&lt;/strong&gt; → &lt;strong&gt;does the target pass a RAP?&lt;/strong&gt; → &lt;strong&gt;do NPS and the MFA extension answer in time?&lt;/strong&gt; → &lt;strong&gt;can the gateway reach the target?&lt;/strong&gt; → &lt;strong&gt;is UDP 3391 working, and why is Gateway Manager empty?&lt;/strong&gt; &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;Test-Certificate&lt;/code&gt;, &lt;code&gt;Get-RDCertificate&lt;/code&gt;, &lt;code&gt;netsh http show sslcert&lt;/code&gt;, &lt;code&gt;Get-CimInstance&lt;/code&gt; against the RD Gateway WMI classes, and &lt;code&gt;Get-WinEvent&lt;/code&gt; on the TerminalServices-Gateway log are the sources for that chain. Change the certificate, the CAP, and the firewall at once and you'll never know which one was broken.&lt;/p&gt;

&lt;p&gt;If the session host itself refuses users after the gateway lets them through with a licensing message, &lt;a href="https://dev.to/adminpackstudio/remote-desktop-licensing-mode-is-not-configured-a-read-first-license-server-cal-and-grace-period-2j3l"&gt;Remote Desktop Licensing Mode Is Not Configured&lt;/a&gt; covers that side. If NPS logs Event 6273 for the gateway's RADIUS requests, &lt;a href="https://dev.to/adminpackstudio/nps-event-6273-reason-code-16-or-22-a-read-first-policy-eap-type-certificate-and-account-triage-26i6"&gt;NPS Event 6273 Reason Code 16 or 22&lt;/a&gt; covers reason codes. This post covers &lt;strong&gt;"users can't connect through a Windows Server RD Gateway (usually from outside the network): 'temporarily unavailable', a certificate expired or untrusted warning, an authorization failure, no MFA prompt, a session that fails after authorization, or an empty RD Gateway Manager, and you need a read-first path before you reinstall the role, replace the certificate, open the policies, or change NPS."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inside working proves little.&lt;/strong&gt; Internal clients may skip the gateway entirely: &lt;code&gt;BypassLocal&lt;/code&gt; "Indicates whether authorized remote users bypass the RD Gateway server for local connections." Test from outside (Step 2).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The certificate has to match the name clients type.&lt;/strong&gt; Microsoft: "The name of the certificate must match the FQDN used to access RD Gateway" (Step 3). A renewed certificate that isn't bound to 443 is still the old one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two policies, two events.&lt;/strong&gt; A CAP failure is event 201, a RAP failure is event 301; read the TerminalServices-Gateway log before you touch either (Steps 5 and 6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MFA needs time and the right methods.&lt;/strong&gt; Microsoft's RD Gateway guide says to change the RADIUS timeout "from 3 to a value between 30 and 60 seconds", and SMS codes don't work through the gateway (Step 7).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorized but not connected is the target, not the gateway.&lt;/strong&gt; Event 304 means the user passed both policies and the gateway couldn't reach the computer (Step 8).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UDP 3391 is a second transport, not the only one.&lt;/strong&gt; Read which transport live connections use before you blame UDP (Step 9).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where in the chain did it break?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What should be true&lt;/th&gt;
&lt;th&gt;Typical symptom when it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Symptom captured&lt;/td&gt;
&lt;td&gt;Which user, which client and network, which gateway name, which exact message, since when&lt;/td&gt;
&lt;td&gt;"The gateway is down" with no user, name, or time written down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Name and TCP 443&lt;/td&gt;
&lt;td&gt;The public name resolves to the gateway's public address and 443 reaches it from outside&lt;/td&gt;
&lt;td&gt;Works inside, fails outside; "temporarily unavailable" for everyone outside&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Certificate&lt;/td&gt;
&lt;td&gt;The certificate served on 443 matches the name, is trusted by the client, is current, and its revocation can be checked&lt;/td&gt;
&lt;td&gt;Certificate expired, untrusted, or name mismatch warnings; some clients fail, others don't&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Gateway service&lt;/td&gt;
&lt;td&gt;TSGateway running, listening on 443 (and 3391), configured, under its connection limit&lt;/td&gt;
&lt;td&gt;Every connection fails at once, including from inside through the gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. CAP&lt;/td&gt;
&lt;td&gt;The user (and, if set, the client computer) is in a group of an enabled CAP&lt;/td&gt;
&lt;td&gt;Event 201; "not authorized" before any session starts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. RAP&lt;/td&gt;
&lt;td&gt;The target name, as typed, is in a RAP's resource list for that user, on that port&lt;/td&gt;
&lt;td&gt;Event 301; works by IP or FQDN, fails by short name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. NPS and MFA&lt;/td&gt;
&lt;td&gt;The central NPS answers the gateway inside the timeout, and the extension can reach Microsoft Entra ID&lt;/td&gt;
&lt;td&gt;No phone prompt, prompt arrives late, or "temporarily unavailable" after the password&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Gateway to target&lt;/td&gt;
&lt;td&gt;The gateway reaches the target on 3389, and the target accepts the user&lt;/td&gt;
&lt;td&gt;Event 304; or the session host's own error after authorization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. UDP and monitoring&lt;/td&gt;
&lt;td&gt;UDP 3391 passes both ways, and you're looking at the right gateway&lt;/td&gt;
&lt;td&gt;Slow or HTTP-only sessions; RD Gateway Manager shows no connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Change&lt;/td&gt;
&lt;td&gt;Only after Steps 1-9 agree: one link, one change&lt;/td&gt;
&lt;td&gt;Role reinstalled, same failure, and the policies are gone&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1: Capture the symptom (read-only)
&lt;/h2&gt;

&lt;p&gt;Write these on the ticket first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which user and which client&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One user, one group, everyone; a managed laptop, a home PC, a Mac, a web (RD Web) launch. Home PCs don't trust an internal CA (Step 3) and aren't in AD groups a CAP may require (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which network&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Outside, inside, on VPN. Inside may bypass the gateway (Step 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which gateway name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The exact FQDN in the client or the .rdp file, and the target name typed (short name, FQDN, or IP; Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exact message and when it appears&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Before the password prompt (name, 443, certificate), after the password (CAP, NPS, MFA), or after a pause with the session starting (RAP, target)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Since when, and what changed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A certificate renewal, a firewall or ISP change, a new public IP, an MFA rollout, a new NPS server, a Windows update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time of one failing attempt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;So you can match it to events 200-304 on the gateway and 6272/6273 on NPS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then branch on what you see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it usually means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Everyone outside fails, everyone inside works&lt;/td&gt;
&lt;td&gt;The public path (DNS, NAT, edge firewall) or internal clients bypassing the gateway&lt;/td&gt;
&lt;td&gt;Step 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A certificate expired, untrusted, or name mismatch warning&lt;/td&gt;
&lt;td&gt;The certificate served on 443, not necessarily the one you imported&lt;/td&gt;
&lt;td&gt;Step 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only personal or home devices fail&lt;/td&gt;
&lt;td&gt;The CA isn't trusted there, revocation can't be checked from the internet, or a CAP requires a domain computer group&lt;/td&gt;
&lt;td&gt;Steps 3 and 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everyone fails, inside through the gateway too&lt;/td&gt;
&lt;td&gt;The gateway service, its listener, or its certificate binding&lt;/td&gt;
&lt;td&gt;Steps 3 and 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fails right after the password, event 201 on the gateway&lt;/td&gt;
&lt;td&gt;CAP (or the central NPS policy when CAPs are central)&lt;/td&gt;
&lt;td&gt;Steps 5 and 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fails by short name, works by FQDN, event 301&lt;/td&gt;
&lt;td&gt;RAP resource list&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No MFA prompt, or "temporarily unavailable" after the password while MFA is on&lt;/td&gt;
&lt;td&gt;RADIUS timeout, the user's MFA method, or the NPS extension&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event 300 then 304, or the session host shows its own error&lt;/td&gt;
&lt;td&gt;The target or the path from the gateway to it&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sessions work but feel slow, or RD Gateway Manager shows nothing&lt;/td&gt;
&lt;td&gt;UDP 3391, or the wrong server or no gateway use at all&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2: Does the public name reach the gateway on TCP 443? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's role page sets the public requirement: "The RD Gateway virtual machine must be accessible through a public IP address that allows inbound TCP connections to port 443 and inbound UDP connections to port 3391." Test it from where the users are, not from your desk. On an outside PC (a home connection or a phone hotspot):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. From an OUTSIDE client: where does the public name point, and does TCP 443 answer? (name is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rdg.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rdg.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then read what the deployment tells clients, on the RD Connection Broker (deployments managed from Server Manager):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the RD Connection Broker: gateway mode, logon method, and the external FQDN handed to clients&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-RDDeploymentGatewayConfiguration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its documented output is &lt;code&gt;Gatewaymode&lt;/code&gt; (Automatic, DoNotUse, or Custom), &lt;code&gt;LogonMethod&lt;/code&gt;, and &lt;code&gt;GatewayExternalFQDN&lt;/code&gt;. The matching &lt;code&gt;Set-&lt;/code&gt; cmdlet also has &lt;code&gt;-BypassLocal&lt;/code&gt;, which "Indicates whether authorized remote users bypass the RD Gateway server for local connections." With that on, an inside test can succeed without ever touching the gateway (our reading), so "it works from the office" is not a gateway test.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The public name resolves to an old address, or not at all from outside&lt;/td&gt;
&lt;td&gt;The public DNS record wasn't updated after an ISP or firewall change&lt;/td&gt;
&lt;td&gt;Fix the public record (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The name resolves correctly, TCP 443 fails from outside, works inside to the gateway's internal address&lt;/td&gt;
&lt;td&gt;The edge firewall, NAT rule, or port forward&lt;/td&gt;
&lt;td&gt;Fix the edge rule (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TCP 443 answers, but Step 3 shows a certificate that isn't the gateway's&lt;/td&gt;
&lt;td&gt;The forward lands on another server or a reverse proxy&lt;/td&gt;
&lt;td&gt;Step 3, then the edge rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;GatewayExternalFQDN&lt;/code&gt; differs from the public DNS name or the certificate name&lt;/td&gt;
&lt;td&gt;RD Web launches hand clients a name that won't match&lt;/td&gt;
&lt;td&gt;Step 3; fix with &lt;code&gt;Set-RDDeploymentGatewayConfiguration&lt;/code&gt; (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Gatewaymode&lt;/code&gt; is DoNotUse&lt;/td&gt;
&lt;td&gt;RD Web launches don't use the gateway at all; outside clients try 3389 directly&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everything here passes&lt;/td&gt;
&lt;td&gt;The path is fine&lt;/td&gt;
&lt;td&gt;Step 3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;Test-NetConnection -Port&lt;/code&gt; only proves TCP: its &lt;code&gt;-Port&lt;/code&gt; parameter "Specifies the TCP port number on the remote computer." UDP 3391 needs a different test (Step 9).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Is the certificate it serves the right one, trusted, current, and checkable? (read-only)
&lt;/h2&gt;

&lt;p&gt;This is where most "it broke after the renewal" tickets end. The client checks the certificate the gateway serves on 443, not the one you imported last week. Microsoft's requirements for the gateway certificate (from the original TS Gateway guidance, still the clearest list): "The name in the Subject line of the server certificate (certificate name, or CN) must match the DNS name that the client uses to connect to the TS Gateway server, unless you are using wildcard certificates or the SAN attributes of certificates.", "The certificate has not expired.", and "The certificate must be trusted on clients." The current RDS certificates page adds the usage: "Issued for Server Authentication (EKU 1.3.6.1.5.5.7.3.1)."&lt;/p&gt;

&lt;p&gt;On the RD Gateway, compare the binding, the gateway's own setting, and the store:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the RD Gateway: every HTTP.sys SSL binding (look at the :443 entries and their certificate hash)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;netsh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;show&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sslcert&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# The certificate hash the RD Gateway service uses (CertHash), as a thumbprint string (our form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$gw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;root/CIMV2/TerminalServices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_TSGatewayServerSettings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$thumb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$gw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CertHash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'X2'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$thumb&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Server authentication certificates in the computer store: names, expiry, thumbprints&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Cert:\LocalMachine\My&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-SSLServerAuthentication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DnsNameList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NotAfter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Thumbprint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Issuer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Does the certificate the gateway uses pass SSL policy for the public name? (name is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-Certificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Cert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cert:\LocalMachine\My\&lt;/span&gt;&lt;span class="nv"&gt;$thumb&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Policy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SSL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DNSName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rdg.contoso.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;netsh http show sslcert&lt;/code&gt; "Lists SSL server certificate bindings along with their associated client certificate policies." &lt;code&gt;CertHash&lt;/code&gt; "Specifies the certificate hash for HTTPS binding on port 443 in IIS." &lt;code&gt;Test-Certificate -DNSName&lt;/code&gt; "Specifies the DNS name to verify as valid for the certificate." In a deployment managed from Server Manager, read what the deployment thinks too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the RD Connection Broker: the certificate assigned to the RD Gateway role&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-RDCertificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Role&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RDGateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SubjectAlternateName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IssuedBy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ExpiresOn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Thumbprint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Level&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Test-Certificate&lt;/code&gt; runs on the gateway, which trusts your internal CA and can reach your internal CRLs. A home PC can't. So check one failing outside client as well: export the gateway certificate's public part (.cer, no private key) and run Microsoft's chain check there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On a failing OUTSIDE client, with the exported gateway certificate (file name is an example)
certutil -urlfetch -verify rdg.cer
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-urlfetch&lt;/code&gt; is documented as "Retrieve and verify AIA Certs and CDP CRLs." So it shows whether that client can build the chain and download the CRL from where it sits.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The &lt;code&gt;netsh&lt;/code&gt; hash for :443 or &lt;code&gt;$thumb&lt;/code&gt; isn't the new certificate's thumbprint&lt;/td&gt;
&lt;td&gt;The renewal imported a certificate, but the gateway still binds and serves the old one (our reading)&lt;/td&gt;
&lt;td&gt;Bind the new one (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;NotAfter&lt;/code&gt; or &lt;code&gt;ExpiresOn&lt;/code&gt; is in the past&lt;/td&gt;
&lt;td&gt;Expired; clients refuse it&lt;/td&gt;
&lt;td&gt;Replace it (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Test-Certificate -DNSName&lt;/code&gt; returns False&lt;/td&gt;
&lt;td&gt;The name clients use isn't in the subject or SAN. "The name of the certificate must match the FQDN used to access RD Gateway, whether the FQDN is the public IP address' externally facing DNS name or the CNAME DNS record pointing to the public IP address."&lt;/td&gt;
&lt;td&gt;A certificate with the right name, or the right name in DNS and the client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Level&lt;/code&gt; is Untrusted&lt;/td&gt;
&lt;td&gt;"The role service is configured with a self-signed certificate." Outside clients won't trust it&lt;/td&gt;
&lt;td&gt;A publicly trusted certificate (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;certutil&lt;/code&gt; chain fails on a home PC, passes on a domain PC&lt;/td&gt;
&lt;td&gt;A private CA. Microsoft: "If you use a privately issued certificate, you'll need to make sure to configure all clients with the certificate's trust chain beforehand."&lt;/td&gt;
&lt;td&gt;A public certificate for the gateway, or deploy the root to those clients&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;certutil&lt;/code&gt; builds the chain but can't fetch the CRL from outside&lt;/td&gt;
&lt;td&gt;The CDP is only reachable inside, so outside clients can't check revocation (our reading); &lt;a href="https://dev.to/adminpackstudio/revocation-server-was-offline-0x80092013-a-read-first-crl-cdp-cache-and-offline-root-triage-59pf"&gt;Revocation Server Was Offline 0x80092013&lt;/a&gt; covers CDP reachability&lt;/td&gt;
&lt;td&gt;Publish the CRL where outside clients can reach it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;SslBridging&lt;/code&gt; (Step 4) is 1 or 2&lt;/td&gt;
&lt;td&gt;A device in front terminates TLS (values: "HTTPS to HTTP bridging." and "HTTPS to HTTPS bridging."), so clients see the proxy's certificate (our reading)&lt;/td&gt;
&lt;td&gt;Check the certificate on the proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All pass on the gateway and on an outside client&lt;/td&gt;
&lt;td&gt;The certificate is fine&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 4: Is the gateway service healthy and listening? (read-only)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the RD Gateway: the gateway service and the local NPS service it uses&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TSGateway&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IAS&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Listeners: TCP 443 (HTTPS) and UDP 3391 (RDP over UDP)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetTCPConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;443&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Listen&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetUDPEndpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3391&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Gateway settings from its WMI provider (namespace Root\CIMv2\TerminalServices)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$gw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;root/CIMV2/TerminalServices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_TSGatewayServerSettings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$gw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IsConfigured&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CentralCAPEnabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MaxConnections&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;UnlimitedConnections&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SslBridging&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;EnforceChannelBinding&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. Which transports are enabled and where they listen: 0 = RPC over HTTP, 1 = HTTP, 2 = UDP (our form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nv"&gt;$on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Invoke-CimMethod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-InputObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$gw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MethodName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IsTransportEnabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Arguments&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TransportType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;uint16&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nv"&gt;$ep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Invoke-CimMethod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-InputObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$gw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MethodName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;GetIPAndPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Arguments&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TransportType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;uint16&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pscustomobject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Transport&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$on&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ep&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IPAddress&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ep&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Errors and warnings in the gateway log, last two days&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Microsoft-Windows-TerminalServices-Gateway/Operational'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Level&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The RD Gateway WMI classes need an elevated session: "You must be a member of the Administrators group to use this class." The NPS service shows up as IAS (Microsoft's NPS extension guide says to "Restart the Network Policy Server (IAS) service."), and it's on the gateway by design: "By default, the role is already present on the computer configured as the Remote Desktop Gateway."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TSGateway is stopped&lt;/td&gt;
&lt;td&gt;Every connection fails at once&lt;/td&gt;
&lt;td&gt;Start it, then read the gateway log for why it stopped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nothing listening on 443, or &lt;code&gt;IsConfigured&lt;/code&gt; False&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;IsConfigured&lt;/code&gt; "Specifies if IIS and RPC settings required by the RD Gateway service are configured."&lt;/td&gt;
&lt;td&gt;The IIS site or binding (Step 3 for the certificate), then Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The HTTP transport port isn't 443&lt;/td&gt;
&lt;td&gt;The port was changed: per Microsoft's ports page, TCP 443 "can be configured using the RD Gateway Management console." Clients and the edge rule must use the same port (our reading)&lt;/td&gt;
&lt;td&gt;Match the client, the edge rule, and the gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;UnlimitedConnections&lt;/code&gt; False and &lt;code&gt;MaxConnections&lt;/code&gt; low&lt;/td&gt;
&lt;td&gt;New connections are refused at the limit. &lt;code&gt;MaxConnections&lt;/code&gt; "Returns the maximum number of connections that are allowed through RD Gateway."&lt;/td&gt;
&lt;td&gt;Raise it on purpose (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;CentralCAPEnabled&lt;/code&gt; True&lt;/td&gt;
&lt;td&gt;"Specifies whether central RD CAP servers are used for controlling this server." The CAP decision is made by the central NPS, so editing local CAPs changes nothing (our reading)&lt;/td&gt;
&lt;td&gt;Steps 5 and 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gateway log errors at the time of the failures&lt;/td&gt;
&lt;td&gt;The message names the failing part (certificate, service, authorization)&lt;/td&gt;
&lt;td&gt;Map it back to Steps 3-8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All healthy&lt;/td&gt;
&lt;td&gt;The gateway is up&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 5: Does the user pass a connection authorization policy (CAP)? (read-only)
&lt;/h2&gt;

&lt;p&gt;The gateway logs every authorization decision. Microsoft's RD Gateway guide reads the success events with &lt;code&gt;Get-WinEvent&lt;/code&gt; on &lt;code&gt;Microsoft-Windows-TerminalServices-Gateway/Operational&lt;/code&gt;; read the failures the same way, for one user, around the failure time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the RD Gateway: CAP, RAP, and connection events for one user, last 4 hours (user name is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Microsoft-Windows-TerminalServices-Gateway/Operational'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;302&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;303&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;304&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddHours&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*jsmith*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's event table for the gateway (written for TS Gateway, same IDs): 200 "Successful Connection Authorization", 201 "Failed Connection Authorization", 300 "Successful Resource Authorization", 301 "Failed Resource Authorization", 302 "Successful User Connection to the Resource", 303 when the client disconnects, 202 when an administrator disconnects it, and 304 "Failed User Connection to the Resource". A good attempt reads 200, 300, 302 in that order.&lt;/p&gt;

&lt;p&gt;Then read the local CAPs in the order the gateway evaluates them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the RD Gateway: local CAPs, in evaluation order&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;root/CIMV2/TerminalServices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_TSGatewayConnectionAuthorizationPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;UserGroupNames&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ComputerGroupNames&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordAllowed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SmartcardAllowed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DeviceRedirectionType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AllowOnlySDRServers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Event 201 for the user&lt;/td&gt;
&lt;td&gt;"The remote client could not connect to a TS Gateway server because the client did not meet the conditions specified in the TS CAPs." Read the message for the reason, then compare the user's groups with &lt;code&gt;UserGroupNames&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Step 10 (group membership, not a wider CAP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No 200 or 201 at all for the attempt&lt;/td&gt;
&lt;td&gt;The request never reached authorization (our reading)&lt;/td&gt;
&lt;td&gt;Steps 2-4, or the RADIUS timeout in Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ComputerGroupNames&lt;/code&gt; is set on the only matching CAP&lt;/td&gt;
&lt;td&gt;"If a value is specified, then the client computer must belong to one of these computer groups for the user to access the RD Gateway server." Home and personal PCs fail by design&lt;/td&gt;
&lt;td&gt;Decide whether those devices should connect at all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;PasswordAllowed&lt;/code&gt; False, users sign in with a password&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;PasswordAllowed&lt;/code&gt; "Indicates if a password can be used to connect to the RD Gateway server."&lt;/td&gt;
&lt;td&gt;Match the CAP to how users sign in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The CAP you expect has &lt;code&gt;Enabled&lt;/code&gt; False&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Enabled&lt;/code&gt; "Indicates whether this RD CAP will be used to evaluate a user for authorization."&lt;/td&gt;
&lt;td&gt;Find out who disabled it before you enable it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;AllowOnlySDRServers&lt;/code&gt; True and only some targets fail later&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AllowOnlySDRServers&lt;/code&gt; "Indicates whether connections allowed only to secure device redirection (SDR) RDS servers." Targets that don't enforce it are refused (our reading)&lt;/td&gt;
&lt;td&gt;Step 8 for those targets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;CentralCAPEnabled&lt;/code&gt; True (Step 4)&lt;/td&gt;
&lt;td&gt;This list isn't what decides; the central NPS network policy is&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event 200 for the user&lt;/td&gt;
&lt;td&gt;The CAP passed&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 6: Does the target pass a resource authorization policy (RAP)? (read-only)
&lt;/h2&gt;

&lt;p&gt;RAPs always live on the gateway itself: "RD RAPs can't use a central policy, as they're processed on the RD Gateway." Read them, and the resource groups they point at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On EACH RD Gateway: RAPs and the resource groups behind them&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;root/CIMV2/TerminalServices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_TSGatewayResourceAuthorizationPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;UserGroupNames&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ResourceGroupType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ResourceGroupName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PortNumbers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;root/CIMV2/TerminalServices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_TSGatewayResourceGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AssociatedRAPs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Resources&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ResourceGroupType&lt;/code&gt; is &lt;code&gt;RG&lt;/code&gt; (a gateway-managed group, listed in &lt;code&gt;Win32_TSGatewayResourceGroup&lt;/code&gt;), &lt;code&gt;CG&lt;/code&gt; (an Active Directory computer group), or &lt;code&gt;ALL&lt;/code&gt;. &lt;code&gt;Resources&lt;/code&gt; is a "Semicolon-separated list of resources in this resource group."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Event 301, the user typed a short name, the resource group lists FQDNs&lt;/td&gt;
&lt;td&gt;Microsoft's own example: "this issue might occur if the user attempts to connect to the computer by using its NetBIOS name when the TS RAP configured on the TS Gateway server uses an FQDN name for the computer."&lt;/td&gt;
&lt;td&gt;Add the name users type, or have them use the FQDN (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ResourceGroupType&lt;/code&gt; CG, the target isn't in that AD computer group&lt;/td&gt;
&lt;td&gt;The RAP doesn't cover it&lt;/td&gt;
&lt;td&gt;Add the computer to the group (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The target listens on a non-default port that isn't in &lt;code&gt;PortNumbers&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;PortNumbers&lt;/code&gt; is a "List of semicolon-separated port numbers that are allowed for this policy."&lt;/td&gt;
&lt;td&gt;Add the port to that RAP (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The user passes the CAP but isn't in the RAP's &lt;code&gt;UserGroupNames&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A RAP has its own user groups, separate from the CAP (our reading)&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works through one gateway in a farm, fails through another&lt;/td&gt;
&lt;td&gt;The RAPs differ between servers, since each gateway processes its own (our reading)&lt;/td&gt;
&lt;td&gt;Compare this output on every gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event 300 for the user and target&lt;/td&gt;
&lt;td&gt;The RAP passed&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 7: Do NPS and the MFA extension answer in time? (read-only)
&lt;/h2&gt;

&lt;p&gt;Skip this step if &lt;code&gt;CentralCAPEnabled&lt;/code&gt; is False and no MFA is in the path. With a central NPS (the usual MFA design), the gateway is a RADIUS client: "Acting as a RADIUS client, the Remote Desktop Gateway server converts the request to a RADIUS Access-Request message and sends the message to the RADIUS (NPS) server where the NPS extension is installed." Read which NPS servers it uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the RD Gateway: central NPS servers and their order (the class also exposes SharedSecret; don't select it)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;root/CIMV2/TerminalServices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_TSGatewayRADIUSServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Priority&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Priority&lt;/code&gt; matters: "The RD Gateway server looks for RD CAPs on RADIUS servers based on the priority." Then open the NPS console on the gateway and read the timeout Microsoft tells you to change: &lt;strong&gt;NPS (Local)&lt;/strong&gt; → &lt;strong&gt;RADIUS Clients and Servers&lt;/strong&gt; → &lt;strong&gt;Remote RADIUS Server&lt;/strong&gt; → &lt;strong&gt;TS GATEWAY SERVER GROUP&lt;/strong&gt; → the server → &lt;strong&gt;Edit&lt;/strong&gt; → &lt;strong&gt;Load Balancing&lt;/strong&gt;. Microsoft: "change the default value from 3 to a value between 30 and 60 seconds". Three seconds isn't enough for a person to find a phone and approve a push.&lt;/p&gt;

&lt;p&gt;On the NPS server where the extension is installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the central NPS server: NPS decisions (6272 granted, 6273 denied) for the last 4 hours&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6272&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6273&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddHours&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;40&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# The NPS extension's own logs (AzureMfa): list them, then read the channels it shows (our form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ListLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*AzureMfa*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RecordCount&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Can this server reach the MFA endpoints on TCP 443?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;login.microsoftonline.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;strongauthenticationservice.auth.microsoft.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;adnotifications.windowsazure.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On the NPS server: is NPS auditing on? (Microsoft's form)
auditpol /get /subcategory:"Network Policy Server"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's NPS checklist says to look for 6273 or 6274: "Most authentication failures produce these events." The extension's logs are under &lt;strong&gt;Applications and Services Logs&lt;/strong&gt; → &lt;strong&gt;Microsoft&lt;/strong&gt; → &lt;strong&gt;AzureMfa&lt;/strong&gt;, and the endpoints come from the extension's network requirements: "The NPS server must be able to communicate with the following URLs over TCP port 443:".&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The push arrives, but the connection has already failed, or only instant approvals work&lt;/td&gt;
&lt;td&gt;The gateway's RADIUS timeout is still the default 3 seconds (our reading of Microsoft's instruction to raise it)&lt;/td&gt;
&lt;td&gt;Step 10 (30-60 seconds)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The user only has SMS or a code registered&lt;/td&gt;
&lt;td&gt;"The SMS text method doesn't work with Remote Desktop Gateway because it doesn't provide the option to enter a verification code."&lt;/td&gt;
&lt;td&gt;Register phone call or Authenticator push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The user has a TOTP code and push registered, and fails&lt;/td&gt;
&lt;td&gt;"If your organization uses Remote Desktop Gateway and the user registered for a TOTP code along with Authenticator push notifications, the user can't meet the Microsoft Entra MFA challenge and Remote Desktop Gateway sign-in fails."&lt;/td&gt;
&lt;td&gt;Step 10 (Microsoft's registry override)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The extension is installed on the gateway itself, or the AzureMfa log shows REQUEST_FORMAT_ERROR&lt;/td&gt;
&lt;td&gt;"Don't install the NPS extension on your Remote Desktop Gateway (RDG) server." and "NPS servers that are installed as dependencies for services like RDG and RRAS don't receive radius requests."&lt;/td&gt;
&lt;td&gt;Move it to a separate NPS server (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No 6272 or 6273 on the NPS server for the attempt, and an NPS event 13&lt;/td&gt;
&lt;td&gt;"A RADIUS message was received from the invalid RADIUS client IP address", so the gateway isn't a RADIUS client there&lt;/td&gt;
&lt;td&gt;Add the gateway as a RADIUS client (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NPS event 18&lt;/td&gt;
&lt;td&gt;"The NPS event log records this event when authentication fails because the shared secret key of the radius client doesn't match the shared secret key of the NPS server."&lt;/td&gt;
&lt;td&gt;Reset the secret on both sides (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6273 on the NPS server&lt;/td&gt;
&lt;td&gt;Read the reason code; &lt;a href="https://dev.to/adminpackstudio/nps-event-6273-reason-code-16-or-22-a-read-first-policy-eap-type-certificate-and-account-triage-26i6"&gt;NPS Event 6273 Reason Code 16 or 22&lt;/a&gt; maps them. Microsoft's RD Gateway guide: "Ensure that your new policy is at the top of the list, that the policy is enabled, and that it grants access."&lt;/td&gt;
&lt;td&gt;Fix the network policy order or conditions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AzureMfa log: AccessReject&lt;/td&gt;
&lt;td&gt;"This error usually reflects an authentication failure in AD or that the NPS server is unable to receive responses from Microsoft Entra ID."&lt;/td&gt;
&lt;td&gt;The AD account first, then the endpoints above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AzureMfa log: InvalidSession&lt;/td&gt;
&lt;td&gt;"The session has taken more than three minutes to complete."&lt;/td&gt;
&lt;td&gt;The user's response time, or latency on the path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A &lt;code&gt;Test-NetConnection&lt;/code&gt; above fails&lt;/td&gt;
&lt;td&gt;Outbound 443 from the NPS server is blocked or proxied&lt;/td&gt;
&lt;td&gt;Allow the endpoints from that server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompts are sent, but users never see them&lt;/td&gt;
&lt;td&gt;The phone side; &lt;a href="https://dev.to/adminpackstudio/microsoft-authenticator-not-receiving-notifications-a-read-first-sign-in-log-device-and-policy-ffn"&gt;Microsoft Authenticator Not Receiving Notifications&lt;/a&gt; covers it&lt;/td&gt;
&lt;td&gt;That post&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Discarded duplicate requests in the NPS log are expected while a user is still answering the prompt: "Discarded requests in the NPS server event log don't indicate there's a problem with the NPS server or the Microsoft Entra multifactor authentication NPS extension."&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Can the gateway reach the target, and does the target accept the user? (read-only)
&lt;/h2&gt;

&lt;p&gt;Once events 200 and 300 are logged, the gateway's job is to open RDP to the target from inside. Microsoft's ports page lists that leg: "TCP and UDP 3389: Used by RDP." From the gateway:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. From the RD Gateway: does the target resolve, and does it answer on 3389, by the name users type? (names are examples)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;app01.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;app01.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3389&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Event 304&lt;/td&gt;
&lt;td&gt;"The remote client met the conditions specified in the TS CAP and the TS RAP, but could not connect to the internal network resource (computer) through the TS Gateway server because the remote computer was unavailable."&lt;/td&gt;
&lt;td&gt;The tests above, then the target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The name doesn't resolve from the gateway&lt;/td&gt;
&lt;td&gt;The gateway needs internal DNS: "TCP and UDP 53: Used by the Domain Name System (DNS) for internal resource name resolution."&lt;/td&gt;
&lt;td&gt;The gateway's DNS client settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3389 fails from the gateway, works from a PC on the same subnet as the target&lt;/td&gt;
&lt;td&gt;A firewall between the gateway's subnet and the target (our reading)&lt;/td&gt;
&lt;td&gt;Allow 3389 from the gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3389 fails from everywhere&lt;/td&gt;
&lt;td&gt;The target's RDP listener or service. Microsoft: "On both the local (client) computer and the remote (target) computer, the RDP listener should be listening on port 3389."&lt;/td&gt;
&lt;td&gt;The target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event 302 then 303 within seconds&lt;/td&gt;
&lt;td&gt;The session reached the target and ended there (our reading); a licensing message points at &lt;a href="https://dev.to/adminpackstudio/remote-desktop-licensing-mode-is-not-configured-a-read-first-license-server-cal-and-grace-period-2j3l"&gt;Remote Desktop Licensing Mode Is Not Configured&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;The session host's own logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Access is denied" after the session starts&lt;/td&gt;
&lt;td&gt;"This error usually indicates that the user who is trying to connect doesn't have the necessary permission to access the remote server." For a domain controller target: "Only members of the Domain Admins group can use RDP to connect to a domain controller."&lt;/td&gt;
&lt;td&gt;Remote Desktop Users or the collection's user groups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Account restriction is preventing this user from signing in"&lt;/td&gt;
&lt;td&gt;Credential Guard: "It's not supported for connections that use RD Connection Broker or RD Gateway."&lt;/td&gt;
&lt;td&gt;Microsoft's linked Credential Guard guidance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 9: Is UDP 3391 working, and why is RD Gateway Manager empty? (read-only)
&lt;/h2&gt;

&lt;p&gt;Read the live connections on the gateway. This is the same kind of list RD Gateway Manager's &lt;strong&gt;Monitoring&lt;/strong&gt; node shows (our reading):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On EACH RD Gateway: live connections and their transport (0 = RPC over HTTP, 1 = HTTP, 2 = UDP)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;root/CIMV2/TerminalServices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_TSGatewayConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;UserName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ClientAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ConnectedResource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ConnectedPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TransportProtocol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ConnectedTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ConnectionDuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;UDP is the second transport: "UDP 3391: Used for RDP over UDP." Microsoft also notes that firewalls doing directional UDP analysis need the UDP rule set to Send Receive. Step 4 already showed whether transport 2 is enabled and listening.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UDP enabled and listening on 3391, every live connection shows &lt;code&gt;TransportProtocol&lt;/code&gt; 1&lt;/td&gt;
&lt;td&gt;UDP isn't making it through the edge or a load balancer, and sessions run on HTTP only (our reading)&lt;/td&gt;
&lt;td&gt;Allow UDP 3391 both ways (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A load balancer in front, HTTPS rule only&lt;/td&gt;
&lt;td&gt;Microsoft's high-availability steps create a separate UDP rule for 3391 next to the 443 rule&lt;/td&gt;
&lt;td&gt;Add the UDP rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Some connections show 2&lt;/td&gt;
&lt;td&gt;UDP works for those clients&lt;/td&gt;
&lt;td&gt;Compare client networks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nothing listed here or in Monitoring, but users say they're connected&lt;/td&gt;
&lt;td&gt;They aren't going through this gateway: another server in the farm, &lt;code&gt;Gatewaymode&lt;/code&gt; DoNotUse, or local bypass (Step 2) (our reading)&lt;/td&gt;
&lt;td&gt;Run this on every gateway, then Step 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoring was open before the user connected&lt;/td&gt;
&lt;td&gt;It doesn't update on its own. Microsoft: "To refresh the display of connection status, in the Actions pane, click Refresh."&lt;/td&gt;
&lt;td&gt;Refresh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ClientAddress&lt;/code&gt; is the same address for everyone&lt;/td&gt;
&lt;td&gt;"If your network configuration includes proxy servers, the IP address that appears in this column will reflect the IP address of the proxy server, rather than the IP address of the Terminal Services client."&lt;/td&gt;
&lt;td&gt;Expected behind a proxy or NAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connections show here, but no 200/300/302 events&lt;/td&gt;
&lt;td&gt;Those events aren't being logged. In RD Gateway Manager, the server's &lt;strong&gt;Properties&lt;/strong&gt; → &lt;strong&gt;Auditing&lt;/strong&gt; tab is where "you can specify the types of events that you want to monitor" (Microsoft's TS Gateway wording)&lt;/td&gt;
&lt;td&gt;Turn the event types back on&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Common false starts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What people try&lt;/th&gt;
&lt;th&gt;Why it misleads (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reinstalling the RD Gateway role&lt;/td&gt;
&lt;td&gt;It removes the CAPs, RAPs, resource groups, NPS settings, and certificate binding you needed to read, and the cause (a name, a certificate, a policy, a firewall) is usually still there&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing from inside the office&lt;/td&gt;
&lt;td&gt;Inside clients may resolve a different address or bypass the gateway (Step 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Importing the renewed certificate and stopping there&lt;/td&gt;
&lt;td&gt;The gateway may still bind and serve the old one; compare &lt;code&gt;CertHash&lt;/code&gt;, &lt;code&gt;netsh http show sslcert&lt;/code&gt;, and the thumbprint (Step 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Turning off the Windows Firewall on the gateway&lt;/td&gt;
&lt;td&gt;The edge firewall or NAT in front is the usual block for outside users; this opens the server and proves little&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changing the CAP and RAP to allow everyone to everything&lt;/td&gt;
&lt;td&gt;The gateway becomes an open path from the internet to every internal computer; events 201 and 301 already say which policy and which name failed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uninstalling the NPS extension&lt;/td&gt;
&lt;td&gt;MFA is gone, and if CAPs are central the RADIUS timeout or method problem is still there (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Installing the NPS extension on the gateway&lt;/td&gt;
&lt;td&gt;Microsoft: "Don't install the NPS extension on your Remote Desktop Gateway (RDG) server."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Test-NetConnection&lt;/code&gt; to 3391&lt;/td&gt;
&lt;td&gt;It tests TCP only; 3391 is UDP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blaming UDP for a connection that never starts&lt;/td&gt;
&lt;td&gt;UDP is a second transport; a session that never starts is usually Steps 2-8 (our reading)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restarting TSGateway as the fix&lt;/td&gt;
&lt;td&gt;It can clear a stuck state, and it also hides which link failed; read the log first&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 10: Change one link, then prove it
&lt;/h2&gt;

&lt;p&gt;Only after Steps 1-9 agree on which link failed. Save the gateway's configuration first. The &lt;code&gt;Export&lt;/code&gt; method "Returns the Remote Desktop Gateway (RD Gateway) server configuration as an XML string.", and its export bits add up to everything that matters here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only, but store the file like a secret. On EACH RD Gateway: export CAPs (1), RADIUS servers (2), RAPs (4), resource groups (8), load-balancing servers (16), and server settings (32) = 63 (our form; path is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$srv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;root/CIMV2/TerminalServices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_TSGatewayServer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Invoke-CimMethod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-InputObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$srv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MethodName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Arguments&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ExportType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;uint32&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;XmlString&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Temp\rdg-before.xml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Encoding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;utf8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the Step 3 thumbprints, the Step 5 and 6 policy output, and the NPS timeout values with it (our habit).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The public name or the edge (Step 2).&lt;/strong&gt; Fix the public DNS record, or the edge rule and NAT to the gateway: TCP 443 inbound, and UDP 3391 if you use UDP, with the UDP rule allowing both directions. If RD Web launches hand out the wrong name, set it on the RD Connection Broker (names are examples):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change. On the RD Connection Broker: the external gateway name clients get from the deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-RDDeploymentGatewayConfiguration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-GatewayMode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Custom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-GatewayExternalFqdn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rdg.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogonMethod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseCachedCredentials&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-BypassLocal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ConnectionBroker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rdcb.contoso.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Custom&lt;/code&gt; means "Remote users get Gateway settings from other parameters to this cmdlet." Setting &lt;code&gt;-BypassLocal $false&lt;/code&gt; also makes inside tests go through the gateway, which you want while you troubleshoot (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The certificate (Step 3).&lt;/strong&gt; Get a certificate whose name matches the public FQDN, with Server Authentication, from a CA your outside clients trust (Microsoft recommends public for the gateway: "Because the RD Gateway role is supposed to be public, we recommend you use a publicly issued certificate."). In a deployment, assign it to the RD Gateway role on the RD Connection Broker with Microsoft's form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change. On the RD Connection Broker: assign the PFX to the RD Gateway role (Microsoft's form with Role RDGateway; path is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Read-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AsSecureString&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Prompt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Enter Password"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-RDCertificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Role&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RDGateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ImportPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'C:\Certs\rdg-2026.pfx'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ConnectionBroker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rdcb.contoso.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows Server 2019 and later, &lt;code&gt;-Thumbprint&lt;/code&gt; can point at a certificate that's already installed ("The parameter is available on Windows Server 2019 and later."). For a standalone gateway, use RD Gateway Manager: the server's &lt;strong&gt;Properties&lt;/strong&gt; → &lt;strong&gt;SSL Certificate&lt;/strong&gt; → &lt;strong&gt;Import a certificate into the RD Gateway&lt;/strong&gt; → &lt;strong&gt;Browse and Import Certificate&lt;/strong&gt;. Microsoft's high-availability steps add a note worth keeping: "You may need to manually restart the TSGateway service running on each RD Gateway server, either through Server Manager or Task Manager." Then rerun Step 3 on the gateway and on an outside client. If outside clients can't reach your CRL, publish it where they can before you move on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The service or limits (Step 4).&lt;/strong&gt; Start TSGateway and read why it stopped. Raise &lt;code&gt;MaxConnections&lt;/code&gt; only if the limit, not an attack, was the cause (in RD Gateway Manager, server &lt;strong&gt;Properties&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The CAP (Step 5).&lt;/strong&gt; Add the user to the group the CAP already names, or add the right group to that CAP in RD Gateway Manager (&lt;strong&gt;Policies&lt;/strong&gt; → &lt;strong&gt;Connection Authorization Policies&lt;/strong&gt;). Don't widen it to Domain Users or remove the computer group condition unless you've decided those devices should connect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The RAP (Step 6).&lt;/strong&gt; Add the name users actually type (short name and FQDN) to the RD Gateway-managed computer group, or the computer to the AD group the RAP uses, or the custom port to the RAP. Do it on every gateway in the farm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NPS and MFA (Step 7).&lt;/strong&gt; Raise the gateway's RADIUS timeout to 30-60 seconds on the &lt;strong&gt;Load Balancing&lt;/strong&gt; tab, and set "Number of seconds between requests when server is identified as unavailable" to the same or more (Microsoft's step). If the NPS server doesn't know the gateway, add it as a RADIUS client with the same shared secret; if event 18 shows a secret mismatch, set a new long secret on both sides. If the NPS server isn't registered, Microsoft's step is &lt;strong&gt;Register server in Active Directory&lt;/strong&gt;: "To function properly in this scenario, the NPS server needs to be registered in Active Directory." For users with both TOTP and push registered, Microsoft's fix is a registry value under &lt;code&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AzureMfa&lt;/code&gt; on the NPS extension server, then an NPS service restart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change. On the NPS EXTENSION server (not the gateway): fall back to Approve/Deny for RD Gateway (Microsoft's value, string FALSE)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'HKLM:\SOFTWARE\Microsoft\AzureMfa'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OVERRIDE_NUMBER_MATCHING_WITH_OTP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'FALSE'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-PropertyType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IAS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's wording: "set OVERRIDE_NUMBER_MATCHING_WITH_OTP = FALSE to fall back to Approve/Deny push notifications with Authenticator." If the extension sits on the gateway, install it on a separate NPS server and point the gateway's central CAP store there, following Microsoft's RD Gateway integration steps, instead of patching it in place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The target (Step 8).&lt;/strong&gt; Fix the firewall from the gateway to the target, the target's RDP listener, or the user's rights on the target. Nothing on the gateway changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UDP (Step 9).&lt;/strong&gt; Allow UDP 3391 both ways at the edge and on any load balancer. If you can't yet, sessions keep working over HTTP; leave UDP enabled on the gateway so it starts working when the edge is fixed (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then prove it.&lt;/strong&gt; From an outside client, as the user who failed: the connection succeeds, the gateway log shows 200, 300, and 302 for that user at that time, &lt;code&gt;Win32_TSGatewayConnection&lt;/code&gt; lists the session (with &lt;code&gt;TransportProtocol&lt;/code&gt; 2 if UDP should work), &lt;code&gt;Test-Certificate -DNSName&lt;/code&gt; returns True for the public name, and NPS logs 6272 when MFA is in the path (our reading). Then have the helpdesk retest the original users.&lt;/p&gt;




&lt;h2&gt;
  
  
  When a change is justified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Public name or edge rule wrong&lt;/td&gt;
&lt;td&gt;Fix the record or the NAT and edge rule for 443 (and 3391 UDP)&lt;/td&gt;
&lt;td&gt;Opening 3389 to the internet instead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificate old, expired, mismatched, or private&lt;/td&gt;
&lt;td&gt;A public certificate with the right name, bound on every gateway&lt;/td&gt;
&lt;td&gt;Telling users to click through the warning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAP fails for a user&lt;/td&gt;
&lt;td&gt;Add the user to the group the CAP names&lt;/td&gt;
&lt;td&gt;A CAP for Domain Users with no other conditions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAP fails by short name&lt;/td&gt;
&lt;td&gt;Add the names users type, or teach the FQDN&lt;/td&gt;
&lt;td&gt;A RAP that allows any resource&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA times out&lt;/td&gt;
&lt;td&gt;RADIUS timeout 30-60 seconds&lt;/td&gt;
&lt;td&gt;Removing MFA or the NPS extension&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TOTP plus push users fail&lt;/td&gt;
&lt;td&gt;Microsoft's &lt;code&gt;OVERRIDE_NUMBER_MATCHING_WITH_OTP = FALSE&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Deleting the users' TOTP method without telling them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;304 to one target&lt;/td&gt;
&lt;td&gt;The target or the firewall in front of it&lt;/td&gt;
&lt;td&gt;Changing gateway policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UDP never used&lt;/td&gt;
&lt;td&gt;UDP 3391 open both ways on the edge and the load balancer&lt;/td&gt;
&lt;td&gt;Disabling UDP on the gateway to make the symptom go away&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why is my RD Gateway not working externally when it works inside?&lt;/strong&gt;&lt;br&gt;
Usually the public name points somewhere else, the edge firewall or NAT doesn't pass TCP 443 to the gateway, or inside clients bypass the gateway so the inside test proves nothing. Microsoft requires "inbound TCP connections to port 443 and inbound UDP connections to port 3391" on the public address. Test &lt;code&gt;Resolve-DnsName&lt;/code&gt; and &lt;code&gt;Test-NetConnection -Port 443&lt;/code&gt; from an outside network (Step 2).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does "Remote Desktop Gateway server is temporarily unavailable" mean?&lt;/strong&gt;&lt;br&gt;
The client didn't get a usable answer from the gateway: the name, 443, the TLS handshake, the service, or (with MFA) a RADIUS timeout. For Windows 365 Boot, Microsoft says "This issue might be a transient issue because of network congestion.", but for your own gateway, read Steps 2-4 and 7 before you wait it out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What ports does RD Gateway use?&lt;/strong&gt;&lt;br&gt;
From clients: TCP 443 for HTTPS and UDP 3391 for "RDP over UDP". From the gateway inward: 3389 to the targets, DNS, Kerberos and LDAP to AD, CRL ports, and "UDP 1812 and 1813: Required when Network Policy Server (NPS) is used."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I fix an expired RD Gateway certificate?&lt;/strong&gt;&lt;br&gt;
Get a new certificate with the public name and Server Authentication, assign it to the RD Gateway role (&lt;code&gt;Set-RDCertificate -Role RDGateway&lt;/code&gt;, or RD Gateway Manager's &lt;strong&gt;SSL Certificate&lt;/strong&gt; tab), restart TSGateway if needed, and confirm &lt;code&gt;CertHash&lt;/code&gt; and &lt;code&gt;netsh http show sslcert&lt;/code&gt; show the new thumbprint (Steps 3 and 10).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why isn't RD Gateway MFA with the NPS extension prompting or working?&lt;/strong&gt;&lt;br&gt;
Most often the gateway's RADIUS timeout is still 3 seconds, the user only has SMS or a code (RD Gateway supports phone call and Authenticator Approve/Deny), the user has both TOTP and push registered, or the extension is installed on the gateway. Read the AzureMfa log and Security events 6272/6273 on the NPS server (Step 7).&lt;/p&gt;




&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/nps-event-6273-reason-code-16-or-22-a-read-first-policy-eap-type-certificate-and-account-triage-26i6"&gt;NPS Event 6273 Reason Code 16 or 22&lt;/a&gt; (when the central NPS denies the gateway's RADIUS request)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/revocation-server-was-offline-0x80092013-a-read-first-crl-cdp-cache-and-offline-root-triage-59pf"&gt;Revocation Server Was Offline 0x80092013&lt;/a&gt; (when outside clients can't check the gateway certificate's CRL)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/microsoft-authenticator-not-receiving-notifications-a-read-first-sign-in-log-device-and-policy-ffn"&gt;Microsoft Authenticator Not Receiving Notifications&lt;/a&gt; (when the MFA push is sent but never shows up)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/remote-desktop-licensing-mode-is-not-configured-a-read-first-license-server-cal-and-grace-period-2j3l"&gt;Remote Desktop Licensing Mode Is Not Configured&lt;/a&gt; (when the session host refuses users after the gateway lets them through)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/certificate-autoenrollment-not-working-a-read-first-gpo-template-permission-ca-and-dcom-triage-4h86"&gt;Certificate Autoenrollment Not Working&lt;/a&gt; (when an internal CA should be renewing the gateway or NPS certificates)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free checklist
&lt;/h2&gt;

&lt;p&gt;Reinstalling the gateway and opening every policy before anyone read events 201 and 301 is a change made everywhere at once. So is a Conditional Access policy enforced before anyone read the report-only results. The free &lt;strong&gt;Conditional Access pre-enforcement checklist&lt;/strong&gt; keeps break-glass accounts, pilot groups, and report-only review on one page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=rd-gateway-not-working" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=rd-gateway-not-working&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the &lt;strong&gt;Intune &amp;amp; M365 Admin Starter Pack&lt;/strong&gt; pairs with this triage: &lt;a href="https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=rd-gateway-not-working" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=rd-gateway-not-working&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Admin Pack Studio; not affiliated with Microsoft. Steps 1-9 favor read-only checks: &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;Get-RDDeploymentGatewayConfiguration&lt;/code&gt;, &lt;code&gt;netsh http show sslcert&lt;/code&gt;, &lt;code&gt;Get-ChildItem Cert:&lt;/code&gt;, &lt;code&gt;Test-Certificate&lt;/code&gt;, &lt;code&gt;Get-RDCertificate&lt;/code&gt;, &lt;code&gt;certutil -urlfetch -verify&lt;/code&gt;, &lt;code&gt;Get-Service&lt;/code&gt;, &lt;code&gt;Get-NetTCPConnection&lt;/code&gt;, &lt;code&gt;Get-NetUDPEndpoint&lt;/code&gt;, &lt;code&gt;Get-CimInstance&lt;/code&gt; and read-only &lt;code&gt;Invoke-CimMethod&lt;/code&gt; calls on the RD Gateway WMI classes, &lt;code&gt;Get-WinEvent&lt;/code&gt;, and &lt;code&gt;auditpol /get&lt;/code&gt;. Exporting the gateway configuration creates a sensitive file. Changing DNS, edge rules, certificates, gateway settings, CAPs, RAPs, resource groups, RADIUS timeouts or secrets, NPS registration, or the NPS extension registry, and restarting services, are deliberate changes. Change one link at a time, test from an outside client and from the gateway, and check current Microsoft Learn for version-specific behavior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windowsserver</category>
      <category>sysadmin</category>
      <category>networking</category>
      <category>security</category>
    </item>
    <item>
      <title>Windows DNS Server Not Resolving External Names: A Read-First Forwarder, Root Hints, and Recursion Triage</title>
      <dc:creator>AdminPackStudio</dc:creator>
      <pubDate>Mon, 19 Oct 2026 04:41:44 +0000</pubDate>
      <link>https://dev.to/adminpackstudio/windows-dns-server-not-resolving-external-names-a-read-first-forwarder-root-hints-and-recursion-57fl</link>
      <guid>https://dev.to/adminpackstudio/windows-dns-server-not-resolving-external-names-a-read-first-forwarder-root-hints-and-recursion-57fl</guid>
      <description>&lt;p&gt;Helpdesk: "Since the firewall cutover on Friday, intranet sites open fine but external sites fail or take ten seconds, and nslookup on a PC says 'DNS request timed out' and then works on the second try. The Dallas office also can't reach the partner portal at portal.fabrikam.com, but head office can. A forum post says to point every PC at a public resolver, add five more public DNS servers as forwarders on the DCs, and restart the DNS Server service on all of them. Can we do that?"&lt;/p&gt;

&lt;p&gt;Not yet. &lt;strong&gt;"DNS not resolving external names" is almost never the client. Your domain controllers answer internal names from their own zones; external names depend on a chain the client never sees: recursion allowed on the server, a forwarder that answers inside the timeout, root hints the server can actually reach as a fallback, a conditional forwarder that exists on the DC the client asked, and a network that passes DNS over UDP and TCP 53.&lt;/strong&gt; Microsoft describes the end of that chain plainly: "If the server configuration disables recursion, the server normally returns REFUSED for a query that requires recursion. If recursive processing can't complete, the server returns SERVFAIL." And the part most fixes miss: "An unresponsive forwarder doesn't guarantee that the server reaches root hint fallback." Pointing PCs at a public resolver breaks Active Directory lookups, five more forwarders can't all be reached in the default timeout, and a service restart clears the cache and the forwarder state you need to read. Work through it as a chain: &lt;strong&gt;which client, which DNS server, which name, which error&lt;/strong&gt; → &lt;strong&gt;is the client asking the server you think?&lt;/strong&gt; → &lt;strong&gt;does the server resolve it itself, and is recursion allowed?&lt;/strong&gt; → &lt;strong&gt;which path does the server pick for this name?&lt;/strong&gt; → &lt;strong&gt;do the forwarders answer, inside the timeout?&lt;/strong&gt; → &lt;strong&gt;can root hints fallback actually happen?&lt;/strong&gt; → &lt;strong&gt;does the conditional forwarder exist on this DC, and do its targets answer?&lt;/strong&gt; → &lt;strong&gt;is a cached answer hiding the fix?&lt;/strong&gt; → &lt;strong&gt;is the network dropping large or TCP DNS?&lt;/strong&gt; &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;Get-DnsServerForwarder&lt;/code&gt;, &lt;code&gt;Get-DnsServerRecursion&lt;/code&gt;, &lt;code&gt;Get-DnsServerZone&lt;/code&gt;, &lt;code&gt;Get-DnsServerRootHint&lt;/code&gt;, &lt;code&gt;Test-DnsServer&lt;/code&gt;, &lt;code&gt;Show-DnsServerCache&lt;/code&gt;, and &lt;code&gt;nslookup&lt;/code&gt; are the sources for that chain. Change the forwarders first and you'll never know which one was dead.&lt;/p&gt;

&lt;p&gt;If external lookups fail from domain controllers at boot and Netlogon logs 5719, &lt;a href="https://dev.to/adminpackstudio/netlogon-event-id-5719-a-read-first-boot-timing-dns-dc-locator-and-site-triage-3j2a"&gt;Netlogon Event ID 5719&lt;/a&gt; covers the DC locator side. If records go missing from your internal zones, &lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt; covers aging. This post covers &lt;strong&gt;"a Windows DNS server (usually a domain controller) resolves internal names but not internet names, resolves them slowly or only on retry, or can't resolve one partner or cloud namespace through a conditional forwarder, and you need a read-first path before you change client DNS settings, forwarders, root hints, timeouts, or recursion."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prove the server, not the client.&lt;/strong&gt; Microsoft: "Check whether the resolution fails from the DNS server itself. If so, you can rule out any issue with the client or the network between the client and the DNS server." (Step 3).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The server picks one path per name.&lt;/strong&gt; Hosted zone or cache first, then a matching conditional forwarder, a delegation, the server-level forwarders, and root hints last (Step 4).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dead forwarders cost seconds each.&lt;/strong&gt; Microsoft: "with default settings, a Windows DNS server will be able to query at most three forwarders." (Step 5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Root hints are a fallback only if the clock and the firewall allow it.&lt;/strong&gt; Microsoft: "If the overall recursion timeout expires first, the query fails without reaching the root hints." (Step 6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditional forwarders are zones, and zones have a replication scope.&lt;/strong&gt; One stored in the registry of DC1 doesn't exist on DC2 (Step 7).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A negative answer can outlive the fix.&lt;/strong&gt; Clear the cache once, after the fix, not as the fix (Step 8).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where in the chain did it break?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What should be true&lt;/th&gt;
&lt;th&gt;Typical symptom when it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Symptom captured&lt;/td&gt;
&lt;td&gt;Which client, which DNS server, which name, which error, since when&lt;/td&gt;
&lt;td&gt;"DNS is down" with no server or name written down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Client points at the right server&lt;/td&gt;
&lt;td&gt;The client asks your internal DNS server, and gets the same answer you get&lt;/td&gt;
&lt;td&gt;Works from your PC, fails from theirs; nslookup works, the browser doesn't&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Server resolves, recursion allowed&lt;/td&gt;
&lt;td&gt;The DNS server resolves the name when asked directly&lt;/td&gt;
&lt;td&gt;"Query refused", or failure from the DC itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Resolution path&lt;/td&gt;
&lt;td&gt;You know whether a zone, conditional forwarder, delegation, forwarder, or root hint handles the name&lt;/td&gt;
&lt;td&gt;An internal zone answers for an external name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Forwarders&lt;/td&gt;
&lt;td&gt;Each forwarder answers fast enough, and the list fits the timeout&lt;/td&gt;
&lt;td&gt;"Server failure" after 8-12 seconds, slow first lookups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Root hints fallback&lt;/td&gt;
&lt;td&gt;Root hints are present, allowed, and reachable&lt;/td&gt;
&lt;td&gt;Forwarders down and nothing falls back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Conditional forwarder&lt;/td&gt;
&lt;td&gt;It exists on every DC that needs it, and its targets answer&lt;/td&gt;
&lt;td&gt;One partner domain fails from one site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Cache&lt;/td&gt;
&lt;td&gt;No stale negative answer on the server or the client&lt;/td&gt;
&lt;td&gt;Works after clearing the cache, breaks again later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Network&lt;/td&gt;
&lt;td&gt;UDP and TCP 53 pass both ways, including large responses&lt;/td&gt;
&lt;td&gt;Most names work, a few domains never do&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Change&lt;/td&gt;
&lt;td&gt;Only after Steps 1-9 agree: one link, one change&lt;/td&gt;
&lt;td&gt;Five new forwarders, same failure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1: Capture the symptom (read-only)
&lt;/h2&gt;

&lt;p&gt;Write these on the ticket first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which client&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One PC, one site, one VLAN, every client, or the DNS server itself. Microsoft's first questions are "Check whether all clients are facing the issue or only specific ones are." and whether the failing names are internal or external&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which DNS server it asked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The IP address in the client's DNS settings, not the one you assume. A site may use its own DC (Step 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which name and record type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;An internet name, a partner or cloud namespace (Step 7), or a name inside your own zone name (Step 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exact error text&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;nslookup's "timed out", "Server failure", "Refused", or "Nonexistent domain", or &lt;code&gt;Resolve-DnsName&lt;/code&gt;'s error. Each points at a different link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Slow or failed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A 3-12 second delay that eventually works is a timeout pattern (Step 5); an instant failure is an answer (Steps 3, 4, 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Since when, and what changed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A firewall or ISP change, a new public IP, a new forwarder, a new DC, a DNS policy, a Windows Server upgrade&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then branch on what you see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it usually means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Internal names also fail, or every query to the DC times out&lt;/td&gt;
&lt;td&gt;The client doesn't reach that DNS server, or the DNS service isn't answering&lt;/td&gt;
&lt;td&gt;Steps 2 and 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nslookup works, ping or the browser fails&lt;/td&gt;
&lt;td&gt;The client's cache, hosts file, or suffix search, not the server&lt;/td&gt;
&lt;td&gt;Step 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Refused" or "Query refused"&lt;/td&gt;
&lt;td&gt;Recursion is disabled, or a DNS policy denies the query&lt;/td&gt;
&lt;td&gt;Step 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An external name under your internal domain name fails&lt;/td&gt;
&lt;td&gt;Your internal zone answers for it authoritatively&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External names fail with "Server failure" after several seconds, or work on retry&lt;/td&gt;
&lt;td&gt;A forwarder is dead or slow, and the timeout runs out&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forwarders are unreachable and nothing falls back&lt;/td&gt;
&lt;td&gt;Root hints disabled, empty, or blocked&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One partner or cloud namespace fails, the internet is fine&lt;/td&gt;
&lt;td&gt;The conditional forwarder, its replication scope, or its targets&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works on DC1, fails on DC2&lt;/td&gt;
&lt;td&gt;Different forwarders, a conditional forwarder missing on DC2&lt;/td&gt;
&lt;td&gt;Steps 5 and 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fails, works after clearing the server cache, fails again later&lt;/td&gt;
&lt;td&gt;A negative answer cached on the server&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Most names work, a few specific domains never resolve&lt;/td&gt;
&lt;td&gt;Large UDP responses or TCP 53 dropped&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2: Is the client asking the server you think? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's client checklist starts with the configuration: run &lt;code&gt;ipconfig /all&lt;/code&gt; and "Check the DNS servers that are listed in the output, and verify that the IP addresses listed are correct." On the failing client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the failing client: which DNS servers does each adapter use?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsClientServerAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AddressFamily&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPv4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ServerAddresses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InterfaceAlias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ServerAddresses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Ask each internal DNS server directly, DNS protocol only, hosts file skipped (addresses are examples)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;www.microsoft.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10.0.0.10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NoHostsFile&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;www.microsoft.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10.20.0.10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NoHostsFile&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# What the client has cached for the name right now&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsClientCache&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Entry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;www.microsoft.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-Server&lt;/code&gt; is documented as "Specifies the IP addresses or host names of the DNS servers to be queried." and without it "the interface DNS servers are queried". So a lookup that works with &lt;code&gt;-Server&lt;/code&gt; and fails without it says the client is asking someone else.&lt;/p&gt;

&lt;p&gt;Why nslookup and the browser disagree: Microsoft notes that "Because nslookup doesn't use the client's DNS cache, name resolution will use the client's configured DNS server." Ping and browsers go through the DNS Client service, which checks its cache first, and that cache is preloaded from the hosts file: "If a Hosts file is configured locally, any host name-to-address mappings from that file are loaded into the cache when the DNS Client service is started."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The client lists a router, a public resolver, or an old DC&lt;/td&gt;
&lt;td&gt;It isn't asking your internal DNS server. Microsoft: "Run ipconfig /all on the client and confirm the correct DNS server IP is configured."&lt;/td&gt;
&lt;td&gt;Fix the DHCP scope option or static setting (Step 10); for DHCP, &lt;a href="https://dev.to/adminpackstudio/windows-server-dhcp-not-assigning-ip-addresses-a-read-first-scope-authorization-relay-and-d13"&gt;Windows Server DHCP Not Assigning IP Addresses&lt;/a&gt; covers scope options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Resolve-DnsName -Server&lt;/code&gt; works for one DC and fails for another&lt;/td&gt;
&lt;td&gt;The DNS servers differ&lt;/td&gt;
&lt;td&gt;Step 3 on the failing one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Every query to the DC times out, internal names too&lt;/td&gt;
&lt;td&gt;The client doesn't reach the DNS service. Microsoft: "Ensure that UDP port 53 communication between the client and the DNS server is allowed."&lt;/td&gt;
&lt;td&gt;Step 3 (service, listening address), then the network path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nslookup works, ping or the browser fails&lt;/td&gt;
&lt;td&gt;A hosts file entry, a cached negative answer, or a short name with the wrong suffix&lt;/td&gt;
&lt;td&gt;Read the cache and hosts file; Step 8 for the cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The same failure from every client and from the DNS server itself&lt;/td&gt;
&lt;td&gt;Server side&lt;/td&gt;
&lt;td&gt;Step 3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 3: Does the DNS server resolve it itself, and is recursion allowed? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's server checklist runs the same lookup against the server's own address: &lt;code&gt;nslookup &amp;lt;name&amp;gt; &amp;lt;IP address of the DNS server&amp;gt;&lt;/code&gt;, and "If you get a failure or time-out response, see Checking for recursion problems." On the DNS server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the DNS server: resolve through itself, on the address clients use (example address)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;www.microsoft.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10.0.0.10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NoHostsFile&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DNS&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Recursion: the server-wide setting, recursion scopes, and any query resolution policies&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerRecursion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-DnsServerRecursionScope&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerQueryResolutionPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Which addresses the service listens on&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerSetting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-All&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ListeningIPAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AllIPAddress&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the DNS server: recent errors and warnings in the DNS Server log&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DNS Server'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Level&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's recursion cmdlet defines the term: "Recursion occurs when a DNS server queries other DNS servers on behalf of a requesting client, and then sends the answer back to the client." Recursion scopes are the newer layer on top: "The legacy recursion setting and list of forwarders are referred to as the default recursion scope." That default scope is named with a single dot, and a policy can send some queries to a different scope.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;nslookup returns Refused, and &lt;code&gt;Get-DnsServerRecursion&lt;/code&gt; shows recursion disabled&lt;/td&gt;
&lt;td&gt;"If the server configuration disables recursion, the server normally returns REFUSED for a query that requires recursion."&lt;/td&gt;
&lt;td&gt;Step 10 (only on an internal-only server)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The dot scope has &lt;code&gt;EnableRecursion&lt;/code&gt; False, and a policy points internal clients at another scope&lt;/td&gt;
&lt;td&gt;Selective recursion. Queries that don't match the policy (a new subnet, a new interface) get the default: no recursion (our reading)&lt;/td&gt;
&lt;td&gt;Read the policy criteria against the client's subnet and the server interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A policy with a Deny action matches the name or record type&lt;/td&gt;
&lt;td&gt;The server refuses on purpose&lt;/td&gt;
&lt;td&gt;Find who added it before removing it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The DNS service isn't running&lt;/td&gt;
&lt;td&gt;Microsoft's forwarder article: "Ensure the DNS server service is running on both the forwarding and forwarder DNS servers"&lt;/td&gt;
&lt;td&gt;Start it, then read the DNS Server log for why it stopped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The address clients use isn't in &lt;code&gt;ListeningIPAddress&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;"the server might not be listening on the IP address that you used in your nslookup query."&lt;/td&gt;
&lt;td&gt;Step 10 (Interfaces tab)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolves fine on the server, clients fail&lt;/td&gt;
&lt;td&gt;The path between client and server&lt;/td&gt;
&lt;td&gt;Back to Step 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fails on the server too, with a delay or "Server failure"&lt;/td&gt;
&lt;td&gt;A recursion problem&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 4: Which path does the server pick for this name? (read-only)
&lt;/h2&gt;

&lt;p&gt;This is the step most fixes skip. Microsoft's current forwarding page lists the order a Windows DNS server follows for a recursive query (with the default &lt;code&gt;ForwardDelegations&lt;/code&gt; off): local zones and cache, then "Use a matching conditional forwarder.", then "Use an applicable delegation.", then "Use server-level forwarders.", then "Use root hints when the configuration permits." A zone the server hosts wins outright: "If a hosted authoritative zone covers the query, that zone determines the result."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the DNS server: which hosted zone, conditional forwarder, or root zone matches the failing name? (our form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'portal.fabrikam.com'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerZone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ZoneName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ZoneName&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ZoneName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ZoneName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ZoneType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IsDsIntegrated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IsAutoCreated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerSetting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-All&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ForwardDelegations&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's forwarder article starts the same way: &lt;code&gt;Get-DnsServerZone -Name &amp;lt;domainname&amp;gt;&lt;/code&gt; to check for a conditional forwarder, then &lt;code&gt;Get-DnsServerForwarder&lt;/code&gt;, then &lt;code&gt;Get-DnsServerRootHint&lt;/code&gt;. "If none of them are configured, the name resolution is expected to fail."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A zone named &lt;code&gt;.&lt;/code&gt; (dot) with type Primary&lt;/td&gt;
&lt;td&gt;The server thinks it's a root server and won't forward or use root hints. Microsoft's DC guidance says that to forward to the internet "you also must delete the root" zone&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A Primary or Secondary zone matches the name (for example your internal &lt;code&gt;contoso.com&lt;/code&gt; and the failing name is &lt;code&gt;www.contoso.com&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;The server answers authoritatively, and a missing record is a final answer: "It doesn't send that query to a conditional forwarder, server-level forwarder, or root hints."&lt;/td&gt;
&lt;td&gt;Add the record to the internal zone (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A zone with type Forwarder matches&lt;/td&gt;
&lt;td&gt;A conditional forwarder controls this name&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A delegation inside a hosted zone matches&lt;/td&gt;
&lt;td&gt;The delegated name servers must answer. Microsoft's broken-delegation test walks it with &lt;code&gt;nslookup&lt;/code&gt;, &lt;code&gt;set norecursion&lt;/code&gt;, and the delegated servers&lt;/td&gt;
&lt;td&gt;Fix the delegation's NS and glue records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nothing matches&lt;/td&gt;
&lt;td&gt;Server-level forwarders, then root hints&lt;/td&gt;
&lt;td&gt;Steps 5 and 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ForwardDelegations&lt;/code&gt; is True&lt;/td&gt;
&lt;td&gt;The order above may not apply. Microsoft: "If your environment enables that setting, validate the resulting interaction between delegations and forwarders before relying on this resolution order."&lt;/td&gt;
&lt;td&gt;Read it before going further&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 5: Do the forwarders answer, inside the timeout? (read-only)
&lt;/h2&gt;

&lt;p&gt;Read the forwarder list and the two timers that decide how many of them the server ever tries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the DNS server: forwarder list, per-forwarder timeout, root-hint fallback, dynamic reordering&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerForwarder&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Overall recursion budget (Timeout) and whether recursion is on&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerRecursion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then ask each forwarder directly from the DNS server, and time it. This is the test the server itself is making:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. From the DNS server: does each forwarder answer, and how fast? (our form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$fwd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerForwarder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IPAddress&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$fwd&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nv"&gt;$sw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.Diagnostics.Stopwatch&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;StartNew&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nv"&gt;$ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;www.microsoft.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-QuickTimeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nv"&gt;$sw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pscustomobject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Forwarder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Answered&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ok&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Milliseconds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$sw&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ElapsedMilliseconds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Microsoft's built-in check of the configured forwarders (the address is the DNS server's own)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-DnsServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-IPAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10.0.0.10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Context&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Forwarder&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How the timers interact, from Microsoft's timeout article (KB 2834250 in the old numbering): the server queries the first forwarder at 0 seconds, the second "after 3.5 seconds", the third "after 3.5 + 4 = 7.5 seconds", and then "At the eighth second, RecursionTimeout expires". The client gets its answer late: "We'll send the Server Failure response then after 11.5 seconds." Two Microsoft pages disagree on the default per-forwarder timeout (the timeout article says 3 seconds, the &lt;code&gt;Set-DnsServerForwarder&lt;/code&gt; reference says "The default value is 5."), so read the value &lt;code&gt;Get-DnsServerForwarder&lt;/code&gt; returns rather than trusting either.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One forwarder doesn't answer&lt;/td&gt;
&lt;td&gt;Every query that reaches it waits out its timeout first. Forwarder health is your job: "DNS Server doesn't determine whether an unresponsive forwarder is offline or slow. Monitor forwarder health separately."&lt;/td&gt;
&lt;td&gt;Remove or replace it (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Four or more forwarders&lt;/td&gt;
&lt;td&gt;"There will not be enough time to arrive to use the fourth forwarder."&lt;/td&gt;
&lt;td&gt;Keep two or three healthy ones (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All answer, but some take over a second&lt;/td&gt;
&lt;td&gt;"If a forwarder takes more than one second to respond, the server considers the response slow for reordering purposes."&lt;/td&gt;
&lt;td&gt;Replace the slow one, or look at the path to it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Server 2022 or later, every forwarder failed once (a link outage) and lookups still fail after the link is back&lt;/td&gt;
&lt;td&gt;"In Windows Server 2022 and later, if none of the forwarders respond, DNS Server uses only the first server in the dynamic list for subsequent queries until the DNS Server service restarts."&lt;/td&gt;
&lt;td&gt;Step 10 (reordering), not a blind restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A forwarder answers your direct test with Refused, or with "Nonexistent domain" for a real name&lt;/td&gt;
&lt;td&gt;A terminal answer, so no fallback: "A DNS response such as NXDOMAIN or NODATA is a valid, terminal response and doesn't normally trigger fallback." An ISP resolver that only serves its own customers refuses queries from a new public IP after a firewall or ISP change (our reading)&lt;/td&gt;
&lt;td&gt;Replace that forwarder (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The forwarder is another internal DNS server&lt;/td&gt;
&lt;td&gt;Microsoft: "If the server is healthy and can forward queries, repeat this step, and examine the server to which this server forwards queries."&lt;/td&gt;
&lt;td&gt;Repeat Steps 3-5 there&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Every forwarder answers fast from the DNS server&lt;/td&gt;
&lt;td&gt;Forwarders aren't the problem&lt;/td&gt;
&lt;td&gt;Steps 7-9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;Test-NetConnection -Port 53&lt;/code&gt; proves nothing here: its &lt;code&gt;-Port&lt;/code&gt; parameter "Specifies the TCP port number on the remote computer.", and most DNS queries go over UDP (Step 9).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Can root hints fallback actually happen? (read-only)
&lt;/h2&gt;

&lt;p&gt;Root hints are the server's way to resolve without forwarders: "Root hints are resource records that identify DNS servers authoritative for the root of a DNS namespace." With forwarders configured, they're only a fallback, and Microsoft lists four conditions for it, including "The UseRootHint setting is $true" and "The server has usable root hint data and network access to the required DNS servers."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the DNS server: are root hints present, and is fallback allowed?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerRootHint&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerForwarder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseRootHint&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Microsoft's built-in root hints check (the address is the DNS server's own)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-DnsServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-IPAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10.0.0.10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Context&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RootHints&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Can this server reach a root server directly? (198.41.0.4 is a.root-servers.net; take any address from Get-DnsServerRootHint)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;198.41.0.4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NoRecursion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's own root test uses interactive nslookup against the server being examined:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;:: Read-only. On the DNS server (Microsoft's form;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;the address is the DNS server&lt;span class="s1"&gt;'s own)
&lt;/span&gt;&lt;span class="go"&gt;nslookup
server 10.0.0.10
set q=NS
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Per that article, "If the resolver returns the IP address of a root server, you probably have a broken delegation" further down, and a timeout means checking the root hints, the network, or a firewall: "It's also possible that the recursive time-out default is too short."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;UseRootHint&lt;/code&gt; is False and the forwarders are down&lt;/td&gt;
&lt;td&gt;Failure by design: "the DNS server forwards unresolved queries only to the DNS servers in the forwarders list and does not try iterative queries if the forwarders do not resolve the queries."&lt;/td&gt;
&lt;td&gt;Fix the forwarders (Step 5), or decide on purpose (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No root hints listed&lt;/td&gt;
&lt;td&gt;Nothing to fall back to, and nothing to start from without forwarders&lt;/td&gt;
&lt;td&gt;Step 10 (import root hints)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The direct root query times out from the DNS server, forwarders answer&lt;/td&gt;
&lt;td&gt;The firewall allows DNS out only to the forwarders. Fallback can't work and only adds delay (our reading)&lt;/td&gt;
&lt;td&gt;Decide: allow it, or set &lt;code&gt;UseRootHint&lt;/code&gt; to False on purpose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Root servers answer, forwarders are dead, and the client still gets "Server failure"&lt;/td&gt;
&lt;td&gt;The timer ran out first: "If the overall recursion timeout expires first, the query fails without reaching the root hints."&lt;/td&gt;
&lt;td&gt;Fewer, healthy forwarders (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Root hints work, no forwarders configured&lt;/td&gt;
&lt;td&gt;Normal iterative resolution&lt;/td&gt;
&lt;td&gt;Step 9 if specific domains still fail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft's design note is worth reading before you change anything: keep fallback "when direct iterative resolution is acceptable" and "Disable it when policy requires all unresolved queries to remain within the forwarding boundary, and enforce the boundary with network controls."&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Does the conditional forwarder exist on this DC, and do its targets answer? (read-only)
&lt;/h2&gt;

&lt;p&gt;A conditional forwarder is stored as a zone: "DNS Server stores conditional forwarders as forwarder zones." That means it has a storage location and a replication scope, and a DC that doesn't have the zone sends the partner name down the general forwarder path instead. Read it on every DC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. Every DC: is the fabrikam.com conditional forwarder there, and how is it set? (our form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ADDomainController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HostName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerZone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fabrikam.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ZoneName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ZoneType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IsDsIntegrated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ReplicationScope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MasterServers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ForwarderTimeout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;UseRecursion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. One DC at a time: list only conditional forwarder zones (dnscmd's /forwarder filter)
dnscmd DC2 /enumzones /forwarder
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then ask each target server directly, from the DC that fails:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. From the failing DC: does each conditional forwarder target answer? (addresses are examples)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;portal.fabrikam.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.0.2.10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-QuickTimeout&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;portal.fabrikam.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.0.2.11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-QuickTimeout&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The zone exists on head-office DCs, not on the Dallas DC&lt;/td&gt;
&lt;td&gt;Not AD-integrated (for that kind, "The entries are stored in the registry." of one server), or AD-integrated with a scope that doesn't include Dallas. The scopes are Custom, Domain, Forest, and Legacy&lt;/td&gt;
&lt;td&gt;Step 10 (replication scope)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Present everywhere, the targets time out from Dallas only&lt;/td&gt;
&lt;td&gt;The VPN or firewall path from that site to the partner's DNS servers (our reading)&lt;/td&gt;
&lt;td&gt;Fix the path; Step 9 for UDP and TCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Three or more targets&lt;/td&gt;
&lt;td&gt;The conditional-forwarder timer defaults to 5 seconds per target, so "a Windows DNS server will be able to query at most two conditional forwarders."&lt;/td&gt;
&lt;td&gt;Order the healthy ones first (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A target answers Refused&lt;/td&gt;
&lt;td&gt;Microsoft's scenario: a policy on the target refuses the query, and "The DNS server won't contact the second conditional forwarder as we already got a response from the first one"&lt;/td&gt;
&lt;td&gt;Ask the partner, or check &lt;code&gt;Get-DnsServerQueryResolutionPolicy&lt;/code&gt; if it's a Windows server you run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A target answers "Nonexistent domain" for some names only&lt;/td&gt;
&lt;td&gt;Missing records on the target: "Register the missing records on the forwarder for the zone in question, either statically or dynamically."&lt;/td&gt;
&lt;td&gt;The partner's zone, not your forwarder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;UseRecursion&lt;/code&gt; False and the targets are down&lt;/td&gt;
&lt;td&gt;Failure by design; nothing else is tried&lt;/td&gt;
&lt;td&gt;Fix the targets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You try to create it and get a zone-exists error&lt;/td&gt;
&lt;td&gt;"You can't create a conditional forwarder for a DNS name that matches a primary, secondary, or stub zone that the same DNS server hosts."&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Azure private endpoints are a common version of this. Microsoft: "DNS queries for private endpoints must originate from the virtual network that is linked to the private DNS zone." So an on-premises conditional forwarder that points straight at Azure's 168.63.129.16 can't work; it points at a DNS forwarder or Private Resolver inside the linked virtual network, and "The conditional forwarding must be made to the recommended public DNS zone forwarder." (for example the public service zone rather than the privatelink zone).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Is a cached answer hiding the fix? (read-only)
&lt;/h2&gt;

&lt;p&gt;Both the DNS server and the client cache negative answers. Read before you clear:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the DNS server: what's cached for the failing name, and the cache limits&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Show-DnsServerCache&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HostName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*fabrikam*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerCache&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the client: what the DNS Client service has cached for the name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsClientCache&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Entry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;portal.fabrikam.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Get-DnsServerCache&lt;/code&gt; returns the limits, including "MaxTTL, MaxNegativeTTL"; Microsoft's example shows a &lt;code&gt;MaxNegativeTTL&lt;/code&gt; of 15 minutes, so a negative answer cached before the fix can linger that long (our reading). On the client, Microsoft's check is &lt;code&gt;ipconfig /displaydns&lt;/code&gt;: a "Name does not exist" entry means a negative response "was returned from a DNS server and was cached on the client."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A negative entry for the name on the server, upstream already fixed&lt;/td&gt;
&lt;td&gt;It ages out on its own; clearing it once is fine after the fix (Step 10)&lt;/td&gt;
&lt;td&gt;Clear once, then re-test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works after &lt;code&gt;Clear-DnsServerCache&lt;/code&gt;, then fails again later through a conditional forwarder&lt;/td&gt;
&lt;td&gt;Microsoft's dual-stack case: a bad AAAA answer from a third-party target "poisons the local DNS server cache and generates a negative cache entry for the host A record, too."&lt;/td&gt;
&lt;td&gt;Ask the target's vendor; Microsoft's workaround is a recursion policy that denies AAAA queries for that path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A stale positive answer (old IP) on the server&lt;/td&gt;
&lt;td&gt;The record's TTL hasn't run out&lt;/td&gt;
&lt;td&gt;Wait it out, or clear once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Negative entry on the client only&lt;/td&gt;
&lt;td&gt;The client cached a failure from earlier&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ipconfig /flushdns&lt;/code&gt; on that client after the server is fixed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 9: Is the network dropping large or TCP DNS? (read-only, then one optional logging change)
&lt;/h2&gt;

&lt;p&gt;DNS uses both transports. Microsoft's port page: "Messages are sent over UDP and DNS servers bind to UDP port 53." When an answer is too big, "The DNS client (message sender) can then choose to reissue the request to the DNS server using TCP (over TCP port 53)." And Windows DNS advertises bigger UDP answers by default through EDNS0, which some firewalls drop: "EDNS0 allows larger User Datagram Protocol (UDP) packet sizes. However, some firewall programs may not allow UDP packets that are larger than 512 bytes."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. From the DNS server: the same name over UDP and over TCP to one forwarder (address is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;portal.fabrikam.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;203.0.113.53&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;portal.fabrikam.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;203.0.113.53&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-TcpOnly&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# The server's EDNS settings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerEDns&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-TcpOnly&lt;/code&gt; is documented as "Uses only TCP for this query." Microsoft's symptom for the EDNS case: "After you deploy a Windows-based DNS server, DNS queries to some domains may not be resolved successfully."&lt;/p&gt;

&lt;p&gt;To see what the server itself sent and what timed out, the DNS Server analytic log records outbound recursive queries and timeouts (event 260 is RECURSE_QUERY_OUT, 262 is RECURSE_QUERY_TIMEOUT, 258 is RESPONSE_FAILURE). It's off by default; Microsoft's steps turn it on in Event Viewer (&lt;strong&gt;Applications and Services Logs&lt;/strong&gt; → &lt;strong&gt;Microsoft&lt;/strong&gt; → &lt;strong&gt;Windows&lt;/strong&gt; → &lt;strong&gt;DNS-Server&lt;/strong&gt; → &lt;strong&gt;View&lt;/strong&gt; → &lt;strong&gt;Show Analytic and Debug Logs&lt;/strong&gt; → &lt;strong&gt;Analytical&lt;/strong&gt; → &lt;strong&gt;Properties&lt;/strong&gt; → &lt;strong&gt;Enable logging&lt;/strong&gt;). Microsoft's cost note: "There's no apparent performance impact for query rates of 50,000 QPS and lower." Reproduce once, then read it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the DNS server: recursive timeouts and response failures from the analytic log (our form; -Oldest is required for analytic logs)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Microsoft-Windows-DNSServer/Analytical'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Oldest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;258&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;262&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Last&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;40&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-Oldest&lt;/code&gt; "is required to get events from .etl and .evt files and from debug and analytic logs." If the read errors while the log is enabled, disable the log first and read it then (our reading of Microsoft's note that a circular log can't be viewed while it's being written).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UDP fails, TCP works, for the same name&lt;/td&gt;
&lt;td&gt;A firewall drops large or EDNS UDP answers. Resolution: "update the firewall program to recognize and allow UDP packets that are larger than 512 bytes."&lt;/td&gt;
&lt;td&gt;The firewall first; Step 10 has Microsoft's workaround&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UDP works, TCP fails&lt;/td&gt;
&lt;td&gt;TCP 53 blocked; any truncated answer then fails (our reading)&lt;/td&gt;
&lt;td&gt;Allow TCP 53 between the DNS server and its forwarders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event 262 with the same &lt;code&gt;Destination&lt;/code&gt; again and again&lt;/td&gt;
&lt;td&gt;That forwarder or target isn't answering&lt;/td&gt;
&lt;td&gt;Step 5 or 7 for that address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event 258 for the name&lt;/td&gt;
&lt;td&gt;Read the &lt;code&gt;Reason&lt;/code&gt; and &lt;code&gt;RCODE&lt;/code&gt; fields in the message&lt;/td&gt;
&lt;td&gt;Map it back to Steps 3-7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both transports fail to every forwarder&lt;/td&gt;
&lt;td&gt;Outbound DNS from the DNS server is blocked, often after a firewall change (our reading)&lt;/td&gt;
&lt;td&gt;Allow UDP and TCP 53 from the DNS servers to the forwarders&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Common false starts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What people try&lt;/th&gt;
&lt;th&gt;Why it misleads (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pointing PCs or DCs at a public resolver&lt;/td&gt;
&lt;td&gt;Internal names and AD records stop resolving. Microsoft: "Don't configure the DNS client settings on the domain controllers to point to DNS servers of your Internet Service Provider (ISP)." Forward from your DNS servers instead; &lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt; shows what that does between DCs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adding more forwarders&lt;/td&gt;
&lt;td&gt;Past three, the extras are never reached with default timers (Step 5), and each dead one adds seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restarting the DNS Server service on every DC&lt;/td&gt;
&lt;td&gt;It clears the cache and, on Windows Server 2022 and later, the stuck forwarder state, so the symptom goes away until the next outage. You lose the evidence of which forwarder failed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clearing the server cache over and over&lt;/td&gt;
&lt;td&gt;It hides the pattern that points at negative caching (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Test-NetConnection&lt;/code&gt; to port 53&lt;/td&gt;
&lt;td&gt;It tests TCP only; DNS answers mostly come back over UDP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pinging the forwarder&lt;/td&gt;
&lt;td&gt;ICMP can pass while DNS is blocked, and the reverse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Turning on Disable recursion to stop the delays&lt;/td&gt;
&lt;td&gt;Microsoft notes "This setting also disables forwarders." External names then fail outright with Refused&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raising every timeout to the maximum&lt;/td&gt;
&lt;td&gt;A dead forwarder now costs more time per query, and clients give up first. Microsoft's own rule: "DNS: The recursion timeout must be greater than the forwarding timeout"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disabling EDNS before testing UDP against TCP&lt;/td&gt;
&lt;td&gt;It may work around a firewall bug without telling you which firewall (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recreating a conditional forwarder on one DC&lt;/td&gt;
&lt;td&gt;Without the right replication scope, the next DC still won't have it (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 10: Change one link, then prove it
&lt;/h2&gt;

&lt;p&gt;Only after Steps 1-9 agree on which link failed. Write down the current state first: &lt;code&gt;Get-DnsServerForwarder&lt;/code&gt;, &lt;code&gt;Get-DnsServerRecursion&lt;/code&gt;, &lt;code&gt;Get-DnsServerRootHint&lt;/code&gt;, the Step 7 conditional forwarder table, and &lt;code&gt;Get-DnsServerQueryResolutionPolicy&lt;/code&gt; from every DNS server (our habit). &lt;code&gt;Set-DnsServerForwarder&lt;/code&gt; replaces the whole list: "This cmdlet overwrites existing server level forwarders."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The client asks the wrong server (Step 2).&lt;/strong&gt; Fix the DHCP scope's DNS server option, or the static setting. Microsoft's command for a static client (interface name and addresses are examples):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change. On ONE client: point the adapter at the internal DNS servers (Microsoft's form, two addresses)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-DnsClientServerAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-InterfaceAlias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Ethernet'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ServerAddresses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'10.20.0.10'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.10'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Recursion off, or a policy refusing (Step 3).&lt;/strong&gt; Turn recursion on only on servers that serve internal clients; Microsoft warns "Allow recursive queries only from trusted clients and networks, and don't expose recursive DNS service to untrusted networks." If selective recursion is by design, fix the policy's subnet or interface criteria instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change. On an internal-only DNS server: allow recursion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-DnsServerRecursion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-PassThru&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A root zone or an internal zone answering (Step 4).&lt;/strong&gt; Delete the &lt;code&gt;.&lt;/code&gt; zone in DNS Manager under &lt;strong&gt;Forward Lookup Zones&lt;/strong&gt;, per Microsoft's DC guidance. For an external name under your internal zone name, add the record to the internal zone; don't create a conditional forwarder for a name you host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A dead, slow, or refusing forwarder (Step 5).&lt;/strong&gt; Replace the list with two or three forwarders you've tested from the DNS server, preferred one first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change. On the DNS server: replace the whole forwarder list (it overwrites; addresses are examples)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-DnsServerForwarder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-IPAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;203.0.113.53&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;198.51.100.53&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-PassThru&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Or remove just the dead one&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Remove-DnsServerForwarder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-IPAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.0.2.53&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-PassThru&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows Server 2022 or later, if you want the older behavior of cycling through every forwarder after they've all failed, Microsoft's switch is "To make the server cycle through all configured forwarders as in earlier versions, disable dynamic reordering with Set-DnsServerForwarder -EnableReordering $false." Change timers last, and keep the recursion timeout above the forwarder timeout (&lt;code&gt;Set-DnsServerRecursion -Timeout&lt;/code&gt;, &lt;code&gt;Set-DnsServerForwarder -Timeout&lt;/code&gt;; both cap at 15 seconds per their references).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root hints (Step 6).&lt;/strong&gt; If they're missing, Microsoft's cmdlet copies them from another DNS server: "The root hints that you copy will not overwrite any existing root hints." If policy keeps all lookups inside the forwarders, make that explicit rather than leaving a fallback that can't work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change. On the DNS server: copy root hints from a healthy DNS server (example name), or turn fallback off on purpose&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Import-DnsServerRootHint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NameServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;dc1.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-PassThru&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-DnsServerForwarder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseRootHint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-PassThru&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The conditional forwarder (Step 7).&lt;/strong&gt; Store it in AD with a scope that covers every DC that needs it, and list only targets you've tested:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change. On one DC: create the forwarder in AD, replicated to every DNS server on a DC in the forest (addresses are examples)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Add-DnsServerConditionalForwarderZone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fabrikam.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ReplicationScope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Forest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MasterServers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.0.2.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.0.2.11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-PassThru&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Or fix an existing one: targets and per-zone timeout&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-DnsServerConditionalForwarderZone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fabrikam.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MasterServers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.0.2.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.0.2.11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ForwarderTimeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-PassThru&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a registry-stored copy already exists on one DC, remove that copy first (export its settings) so the AD-integrated one doesn't collide with it (our reading). Microsoft's forest scope means "Replicate the conditional forwarder to all DNS servers that run on domain controllers in the forest."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache (Step 8).&lt;/strong&gt; Once, after the fix, on the server and then the client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change (low risk). On the DNS server, then on the client that cached the failure&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Clear-DnsServerCache&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Clear-DnsClientCache&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Clear-DnsClientCache&lt;/code&gt; is documented as "equivalent to running ipconfig /flushdns."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Large UDP or TCP 53 dropped (Step 9).&lt;/strong&gt; Fix the firewall. Microsoft's workaround, if you can't yet, turns off EDNS probes on the DNS server (a registry change; reverse it with &lt;code&gt;1&lt;/code&gt; after the firewall is fixed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Change. On the DNS server: Microsoft's EDNS0 workaround (zero, not the letter O)
dnscmd /config /enableednsprobes 0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Turn the analytic log back off when you're done (our habit).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then prove it.&lt;/strong&gt; From a failing client and from each DNS server: &lt;code&gt;Resolve-DnsName -Name www.microsoft.com -Server &amp;lt;each DNS server&amp;gt; -DnsOnly&lt;/code&gt; answers in well under a second, the partner name resolves from the Dallas DC as well as head office, &lt;code&gt;Test-DnsServer -Context Forwarder&lt;/code&gt; returns Success, and the analytic log shows no new event 262 for your forwarders (our reading). Then let the helpdesk retest the original sites.&lt;/p&gt;




&lt;h2&gt;
  
  
  When a change is justified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Client asks the wrong server&lt;/td&gt;
&lt;td&gt;Fix the DHCP option or static setting to internal DNS servers&lt;/td&gt;
&lt;td&gt;Public resolvers on domain-joined PCs or DCs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recursion refused&lt;/td&gt;
&lt;td&gt;Recursion on for internal clients, or a corrected recursion policy&lt;/td&gt;
&lt;td&gt;An open resolver reachable from the internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dead or refusing forwarder&lt;/td&gt;
&lt;td&gt;Two or three tested forwarders, preferred one first&lt;/td&gt;
&lt;td&gt;Five more forwarders on top of the dead one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forwarders fine, fallback broken&lt;/td&gt;
&lt;td&gt;Root hints reachable, or &lt;code&gt;UseRootHint&lt;/code&gt; off on purpose&lt;/td&gt;
&lt;td&gt;Raising every timeout to 15 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conditional forwarder missing on one site's DC&lt;/td&gt;
&lt;td&gt;AD-integrated forwarder with Forest or Domain scope&lt;/td&gt;
&lt;td&gt;Registry copies created by hand on each DC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stale negative answer&lt;/td&gt;
&lt;td&gt;One cache clear after the fix&lt;/td&gt;
&lt;td&gt;Clearing the cache as the fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firewall drops large UDP answers&lt;/td&gt;
&lt;td&gt;Firewall allows EDNS and TCP 53&lt;/td&gt;
&lt;td&gt;EDNS off with no ticket to turn it back on&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why is my Windows DNS server not resolving external names?&lt;/strong&gt;&lt;br&gt;
Most often a forwarder is dead or refusing and the recursion timer runs out before root hints are tried, recursion is disabled or limited by a policy, or an internal zone answers for the name. Microsoft's first split: "Check whether the resolution fails from the DNS server itself." Then read &lt;code&gt;Get-DnsServerForwarder&lt;/code&gt; and test each forwarder directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I use DNS forwarders or root hints?&lt;/strong&gt;&lt;br&gt;
Either works; forwarders centralize lookups, root hints resolve without them. Microsoft keeps root hints as a fallback by default and says to turn it off "when policy requires all unresolved queries to remain within the forwarding boundary". Don't leave fallback on if the firewall blocks it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is my DNS conditional forwarder not working?&lt;/strong&gt;&lt;br&gt;
Usually it doesn't exist on the DC the client asked (registry-stored or the wrong replication scope), its targets don't answer from that site, or a target refuses or lacks the record. Run Step 7 on every DC, then query each target directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many DNS forwarders should I configure?&lt;/strong&gt;&lt;br&gt;
Two or three healthy ones. With default timers, Microsoft says the server can reach "at most three forwarders", and every dead one in front adds seconds to each lookup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does nslookup work but ping doesn't?&lt;/strong&gt;&lt;br&gt;
nslookup asks the DNS server directly; ping goes through the DNS Client service's cache, which also holds hosts file entries and earlier negative answers. Microsoft: "Because nslookup doesn't use the client's DNS cache, name resolution will use the client's configured DNS server." Check the client cache and hosts file (Steps 2 and 8).&lt;/p&gt;




&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/netlogon-event-id-5719-a-read-first-boot-timing-dns-dc-locator-and-site-triage-3j2a"&gt;Netlogon Event ID 5719&lt;/a&gt; (when DCs can't find a domain controller through DNS at boot)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt; (when internal records go missing instead)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt; (DC DNS client settings and the ports between DCs)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/windows-server-dhcp-not-assigning-ip-addresses-a-read-first-scope-authorization-relay-and-d13"&gt;Windows Server DHCP Not Assigning IP Addresses&lt;/a&gt; (when the scope hands clients the wrong DNS servers)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free checklist
&lt;/h2&gt;

&lt;p&gt;Adding five forwarders and restarting DNS on every DC before anyone tested a single forwarder is a change made everywhere at once. So is a Conditional Access policy enforced before anyone read the report-only results. The free &lt;strong&gt;Conditional Access pre-enforcement checklist&lt;/strong&gt; keeps break-glass accounts, pilot groups, and report-only review on one page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=windows-dns-server-not-resolving-external-names" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=windows-dns-server-not-resolving-external-names&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the &lt;strong&gt;Intune &amp;amp; M365 Admin Starter Pack&lt;/strong&gt; pairs with this triage: &lt;a href="https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=windows-dns-server-not-resolving-external-names" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=windows-dns-server-not-resolving-external-names&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Admin Pack Studio; not affiliated with Microsoft. Steps 1-9 favor read-only checks: &lt;code&gt;Get-DnsClientServerAddress&lt;/code&gt;, &lt;code&gt;Get-DnsClientCache&lt;/code&gt;, &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;Get-Service&lt;/code&gt;, &lt;code&gt;Get-DnsServerRecursion&lt;/code&gt;, &lt;code&gt;Get-DnsServerRecursionScope&lt;/code&gt;, &lt;code&gt;Get-DnsServerQueryResolutionPolicy&lt;/code&gt;, &lt;code&gt;Get-DnsServerSetting&lt;/code&gt;, &lt;code&gt;Get-DnsServerZone&lt;/code&gt;, &lt;code&gt;Get-DnsServerForwarder&lt;/code&gt;, &lt;code&gt;Get-DnsServerRootHint&lt;/code&gt;, &lt;code&gt;Test-DnsServer&lt;/code&gt;, &lt;code&gt;Show-DnsServerCache&lt;/code&gt;, &lt;code&gt;Get-DnsServerCache&lt;/code&gt;, &lt;code&gt;Get-DnsServerEDns&lt;/code&gt;, &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;dnscmd /enumzones&lt;/code&gt;, and &lt;code&gt;nslookup&lt;/code&gt;. Enabling the analytic log, changing client DNS settings, recursion, forwarders, timeouts, reordering, root hints, conditional forwarders, or EDNS, and clearing caches are deliberate changes. Change one link at a time, test from the failing client and from each DNS server, and check current Microsoft Learn for version-specific behavior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windowsserver</category>
      <category>dns</category>
      <category>networking</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>LDAPS Not Working on a Domain Controller: A Read-First Certificate, LDAP Signing, and Event 2889 Triage</title>
      <dc:creator>AdminPackStudio</dc:creator>
      <pubDate>Mon, 19 Oct 2026 02:41:12 +0000</pubDate>
      <link>https://dev.to/adminpackstudio/ldaps-not-working-on-a-domain-controller-a-read-first-certificate-ldap-signing-and-event-2889-4777</link>
      <guid>https://dev.to/adminpackstudio/ldaps-not-working-on-a-domain-controller-a-read-first-certificate-ldap-signing-and-event-2889-4777</guid>
      <description>&lt;p&gt;Helpdesk: "Since we added DC3 on Windows Server 2025 last week, the door-badge server's directory sync fails with 'Strong Authentication Required' whenever it lands on DC3. The firewall's LDAPS test against DC2 says 'Cannot open connection' since DC2's certificate renewed, and every DC logs Event 2887 once a day. A forum post says to turn LDAP signing off in the Default Domain Controllers Policy, delete the old certificates on DC2, and set channel binding to Never. Can we start with that?"&lt;/p&gt;

&lt;p&gt;Not yet. &lt;strong&gt;"LDAPS not working" and "LDAP signing required" are two different breaks that show up in the same week. LDAPS on port 636 fails when the domain controller has no certificate it can use, serves a different certificate than you think, or serves one the client doesn't trust or can't match to the name it used. Signing and channel binding failures are binds the DC now rejects on purpose.&lt;/strong&gt; Microsoft: "There's no user interface for configuring LDAPS. Installing a valid certificate on a domain controller permits the LDAP service to listen for, and automatically accept, SSL connections for both LDAP and global catalog traffic." On signing, Microsoft's own warning: "After you make this configuration change, clients that rely on unsigned SASL (Negotiate, Kerberos, NTLM, or Digest) LDAP binds or on LDAP simple binds over a non-SSL/TLS connection stop working." Turning signing off domain-wide, deleting certificates, or setting channel binding to Never each removes evidence you need, and the first and last reopen the attacks those settings exist to stop. Work through it as a chain: &lt;strong&gt;which client, which DC, which port, which bind&lt;/strong&gt; → &lt;strong&gt;does the DC listen on 636 and does the client reach it?&lt;/strong&gt; → &lt;strong&gt;does the DC have a certificate it can use (Event 1220)?&lt;/strong&gt; → &lt;strong&gt;which certificate does it actually serve?&lt;/strong&gt; → &lt;strong&gt;does the client trust that certificate?&lt;/strong&gt; → &lt;strong&gt;does the name the client used match it?&lt;/strong&gt; → &lt;strong&gt;who is binding unsigned (Events 2887 and 2889)?&lt;/strong&gt; → &lt;strong&gt;which signing policy is actually in effect on each DC?&lt;/strong&gt; → &lt;strong&gt;is channel binding rejecting a TLS bind?&lt;/strong&gt; &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;Get-ChildItem Cert:\LocalMachine\My&lt;/code&gt;, &lt;code&gt;certutil&lt;/code&gt;, &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;reg query&lt;/code&gt;, &lt;code&gt;gpresult&lt;/code&gt;, and &lt;code&gt;ldp.exe&lt;/code&gt; are the sources for that chain. Turn signing off everywhere and you'll find out later which client was sending passwords in clear text.&lt;/p&gt;

&lt;p&gt;If the DC never got a certificate because enrollment fails, &lt;a href="https://dev.to/adminpackstudio/certificate-autoenrollment-not-working-a-read-first-gpo-template-permission-ca-and-dcom-triage-4h86"&gt;Certificate Autoenrollment Not Working&lt;/a&gt; covers the GPO, template, and CA side. If &lt;code&gt;certutil&lt;/code&gt; on the client fails the revocation check, &lt;a href="https://dev.to/adminpackstudio/revocation-server-was-offline-0x80092013-a-read-first-crl-cdp-cache-and-offline-root-triage-59pf"&gt;Revocation Server Was Offline 0x80092013&lt;/a&gt; covers CRLs and CDPs. This post covers &lt;strong&gt;"LDAPS on port 636 (or 3269) to a domain controller fails, an application or appliance gets 'Strong Authentication Required' after LDAP signing changes or a new Windows Server 2025 DC, or Directory Service Events 1220, 2886, 2887, 2889, 3039, or 3075 appear, and you need a read-first path before you replace certificates, restart DCs, change signing or channel binding policy, or edit NTDS registry values."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LDAPS is a certificate problem first.&lt;/strong&gt; Microsoft's requirements include: "The Enhanced Key Usage extension includes the Server Authentication (1.3.6.1.5.5.7.3.1) object identifier (also known as OID)." and the DC's FQDN in the subject CN or a SAN DNS entry (Step 3).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The DC may not serve the certificate you're looking at.&lt;/strong&gt; Microsoft: "If there is a certificate in the NT Directory Services (NTDS) store, DC use the certificate in the NTDS store instead." (Step 4).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The client has to trust it.&lt;/strong&gt; Microsoft: "The certificate was issued by a CA that the domain controller and the LDAPS clients trust." (Step 5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event 2889 names the unsigned clients.&lt;/strong&gt; Microsoft: "The log entry displays the IP address of the client and the identity that the client tried to use to authenticate." It's off until you raise a diagnostic level (Step 7).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows Server 2025 changes the default.&lt;/strong&gt; Microsoft: "Windows Server 2025 or later requires LDAP signing by default for new Active Directory deployments." (Step 8).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel binding only covers TLS plus SASL.&lt;/strong&gt; Microsoft: "LDAP channel binding applies through the Domain controller: LDAP server channel binding token requirements policy only to TLS-secured sessions that use Simple Authentication and Security Layer (SASL) authentication." (Step 9).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where in the chain did it break?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What should be true&lt;/th&gt;
&lt;th&gt;Typical symptom when it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Symptom captured&lt;/td&gt;
&lt;td&gt;Which client, which DC, which port, which bind type, since when&lt;/td&gt;
&lt;td&gt;"LDAP is broken" with no DC or port named&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Port and listener&lt;/td&gt;
&lt;td&gt;The DC listens on 636 (and 3269 on a global catalog) and the client reaches it&lt;/td&gt;
&lt;td&gt;TCP test fails; nothing listening&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. A usable certificate&lt;/td&gt;
&lt;td&gt;The DC holds a Server Authentication certificate with its FQDN and a private key&lt;/td&gt;
&lt;td&gt;Event 1220 on the DC, Schannel 36886&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. The served certificate&lt;/td&gt;
&lt;td&gt;You know which certificate the DC presents on 636&lt;/td&gt;
&lt;td&gt;Renewed certificate in the store, old one still served&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Client trust&lt;/td&gt;
&lt;td&gt;The client builds a valid chain and can check revocation&lt;/td&gt;
&lt;td&gt;Untrusted root, expired, revocation offline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Name match&lt;/td&gt;
&lt;td&gt;The name the client uses is in the certificate&lt;/td&gt;
&lt;td&gt;Works by FQDN, fails by domain name, alias, or IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Unsigned binds&lt;/td&gt;
&lt;td&gt;You know who binds unsigned or in clear text on 389&lt;/td&gt;
&lt;td&gt;Event 2887 every day, no client named&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Policy in effect&lt;/td&gt;
&lt;td&gt;You know each DC's signing setting, including the 2025 enforcement policy&lt;/td&gt;
&lt;td&gt;One DC rejects, the others allow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Channel binding&lt;/td&gt;
&lt;td&gt;You know whether TLS + SASL binds would fail CBT&lt;/td&gt;
&lt;td&gt;Events 3039, 3074, or 3075&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Change&lt;/td&gt;
&lt;td&gt;Only after Steps 1-9 agree: one link, one change&lt;/td&gt;
&lt;td&gt;Signing off everywhere, same failure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1: Capture the symptom (read-only)
&lt;/h2&gt;

&lt;p&gt;Write these on the ticket first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which client or application&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A Windows computer, an appliance, a Java or Linux app, a SaaS connector. Microsoft splits devices into appliances, non-Windows devices, and Windows devices when it plans signing and channel binding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which DC, and how the client finds it&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A single DC FQDN, the domain name (which resolves to any DC), a load-balanced or alias name, or an IP address. The certificate has to carry the name used (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which port&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;389 (LDAP), 636 (LDAPS), 3268 (global catalog), 3269 (global catalog over SSL). Microsoft: "LDAPS communication occurs over port TCP 636. LDAPS communication to a global catalog server occurs over TCP 3269."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which bind type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple bind (a DN or user name and password) or SASL (Negotiate, Kerberos, NTLM). Signing and channel binding treat them differently (Steps 7 and 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exact error text&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Cannot open connection" in ldp, "Strong Authentication Required", a TLS or certificate error in the app's log, or a timeout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Since when, and what changed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A certificate renewal, a new CA, a new DC (especially Windows Server 2025), a GPO change, a TLS hardening change, a firewall change&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then branch on what you see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it usually means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Timeout on 636, or the TCP test fails&lt;/td&gt;
&lt;td&gt;Firewall, routing, or nothing listening&lt;/td&gt;
&lt;td&gt;Step 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event 1220 on the DC, or "Cannot open connection" in ldp on 636&lt;/td&gt;
&lt;td&gt;No usable certificate. Microsoft's Event 1220 text: "LDAP over Secure Sockets Layer (SSL) will be unavailable at this time because the server was unable to obtain a certificate."&lt;/td&gt;
&lt;td&gt;Step 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LDAPS broke right after a renewal&lt;/td&gt;
&lt;td&gt;The DC still serves the old certificate, or picked a different one&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows clients work, an appliance or Java app fails on 636&lt;/td&gt;
&lt;td&gt;The app doesn't trust your CA, or uses a name not in the certificate&lt;/td&gt;
&lt;td&gt;Steps 5 and 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works by DC FQDN, fails by domain name or alias&lt;/td&gt;
&lt;td&gt;Name not in the certificate&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Strong Authentication Required" on 389&lt;/td&gt;
&lt;td&gt;The DC requires signing; the client sends a simple bind in clear text or an unsigned SASL bind&lt;/td&gt;
&lt;td&gt;Steps 7 and 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only one DC rejects binds&lt;/td&gt;
&lt;td&gt;That DC's signing policy differs, often a new Windows Server 2025 DC&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Events 3039, 3074, or 3075&lt;/td&gt;
&lt;td&gt;TLS + SASL binds without a valid channel binding token&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2: Does the DC listen on 636, and does the client reach it? (read-only)
&lt;/h2&gt;

&lt;p&gt;Start at the network, because nothing else matters if the handshake never starts. From the failing client, or a Windows box on the same network segment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. From the client side: can it open TCP 636 (and 3269 for the global catalog) on the DC it uses?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC2.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;636&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC2.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3269&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the DC itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the DC: is anything listening on 636 and 3269?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetTCPConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;636&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3269&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OwningProcess&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;TcpTestSucceeded : False&lt;/code&gt; from the client, listener present on the DC&lt;/td&gt;
&lt;td&gt;A firewall or route between them&lt;/td&gt;
&lt;td&gt;Fix the path; Microsoft's port reference lists LDAP SSL on TCP 636 and Global Catalog on TCP 3268 and 3269&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Listener present, TCP test succeeds&lt;/td&gt;
&lt;td&gt;The port is fine; the problem is in the TLS handshake or the bind&lt;/td&gt;
&lt;td&gt;Step 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No listener on 636&lt;/td&gt;
&lt;td&gt;Unusual for a DC; the LDAP service may not be running&lt;/td&gt;
&lt;td&gt;Check the AD DS service and the Directory Service log before going further&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3269 fails but 636 works&lt;/td&gt;
&lt;td&gt;The DC isn't a global catalog, or the app should use 636&lt;/td&gt;
&lt;td&gt;Point the app at a GC or at 636&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A port that answers isn't the same as LDAPS working. The TCP test only proves the socket opens; a DC with no certificate still accepts the connection and then fails the TLS handshake (our reading of Microsoft's Event 1220 text and the Schannel 36886 description).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Does the DC have a certificate it can use? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's requirements for an LDAPS certificate, in short: it sits in the Local Computer's Personal store, "A private key that matches the certificate is present in the Local Computer's store and is correctly associated with the certificate," the private key doesn't have strong protection, the EKU includes Server Authentication, the DC's Active Directory FQDN is the subject CN or a SAN DNS entry, and it chains to a CA both the DC and the clients trust.&lt;/p&gt;

&lt;p&gt;First, the DC's own log. Microsoft: "Event ID 1220 is logged on a domain controller when client computers attempt to make an LDAP-over-SSL connection to the directory when SSL connections are not enabled on the directory." Schannel logs its side in the System log; Microsoft's Schannel reference describes Event 36886 as occurring "when a server attempt to make an SSL connection but no server certificate is found."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the DC: Event 1220 (Directory Service) and Schannel 36886 (System), last 7 days&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$since&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddDays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;-7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Directory Service'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1220&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$since&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'System'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ProviderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Schannel'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;36886&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$since&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the certificates in the computer's Personal store that could serve LDAPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the DC: Server Authentication certificates in the computer's Personal (MY) store&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Cert:\LocalMachine\My&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-SSLServerAuthentication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Issuer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NotBefore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NotAfter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HasPrivateKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Thumbprint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DnsNameList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;EnhancedKeyUsageList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And Microsoft's validity check from the Directory Services team, which also reports the private key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On the DC: verify each certificate in the computer's Personal store (Microsoft's AskDS form)
certutil -verifystore MY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Per that post, a good certificate shows "Encryption test passed", the Server Authentication policy under "Verified Application Policies", and "Certificate is valid" at the end. The missing-key case reads "No key provider information" and "Missing stored keyset".&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No Server Authentication certificate at all&lt;/td&gt;
&lt;td&gt;Microsoft: "If you want to configure a domain controller or an AD LDS server to support SSL connections, you must provide a certificate for the AD DS or AD LDS directory to use."&lt;/td&gt;
&lt;td&gt;Step 10, and the autoenrollment post if enrollment fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;HasPrivateKey&lt;/code&gt; is False, or "Missing stored keyset"&lt;/td&gt;
&lt;td&gt;AskDS: "The normal cause of this problem is that the certificate request was generated on one machine and we have installed the certificate on a different machine."&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;NotAfter&lt;/code&gt; is in the past&lt;/td&gt;
&lt;td&gt;Expired. AskDS: "You cannot renew a certificate once it has expired."&lt;/td&gt;
&lt;td&gt;Step 10 (new certificate)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The FQDN isn't in &lt;code&gt;Subject&lt;/code&gt; or &lt;code&gt;DnsNameList&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Fails the name requirement&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Several valid certificates&lt;/td&gt;
&lt;td&gt;Microsoft: "If there are multiple valid certificates available in the local computer store, Schannel may not select the correct certificate."&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One good certificate, Event 1220 still logged after it was added&lt;/td&gt;
&lt;td&gt;The DC may not have reloaded it yet (our reading)&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you see no 1220 and no 36886 but LDAPS still fails, the DC probably has a certificate; the question moves to which one it serves and whether the client accepts it (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Which certificate does the DC actually serve? (read-only)
&lt;/h2&gt;

&lt;p&gt;This is where renewals go wrong. Three Microsoft statements together explain it. The NTDS store wins: "AD DS preferentially looks for certificates in this store over the Local Machine's store." In the computer store, the pick isn't predictable: "Schannel, the Microsoft SSL provider, selects the first valid certificate that it finds in the local computer store." And on newer versions: "Finally, if a Windows Server 2008 or a later version domain controller finds multiple certificates in its store, it will random chose one of these certificates." Microsoft's LDAPS troubleshooting article adds: "A conflict with a certification authority (CA) certificate may occur if the CA is installed on a domain controller that you are trying to access through LDAPS."&lt;/p&gt;

&lt;p&gt;So read what the DC presents on the wire, not what's in the store. This asks the DC for its certificate the same way an LDAPS client would and prints it, without trusting it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. From the client side: which certificate does DC2 present on 636? (our form, using .NET SslStream)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# The validation callback returns $true so you can see an untrusted or wrong certificate instead of an exception&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC2.contoso.com'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$tcp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;System.Net.Sockets.TcpClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;636&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$ssl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;System.Net.Security.SslStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$tcp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetStream&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nv"&gt;$ssl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AuthenticateAsClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nv"&gt;$served&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ssl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RemoteCertificate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nv"&gt;$served&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Issuer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NotBefore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NotAfter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Thumbprint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DnsNameList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="c"&gt;# Save it for Step 5 (public certificate only)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.IO.File&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;WriteAllBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;TEMP&lt;/span&gt;&lt;span class="s2"&gt;\dc2-ldaps.cer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$served&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Cert'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;finally&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ssl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$tcp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Dispose&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change the port to 3269 to read the global catalog side. If &lt;code&gt;AuthenticateAsClient&lt;/code&gt; throws before any certificate comes back, the DC had nothing to offer, which matches Event 1220 (our reading).&lt;/p&gt;

&lt;p&gt;Compare the served &lt;code&gt;Thumbprint&lt;/code&gt; with Step 3's list. Then look in the NTDS store, which the computer-store listing doesn't show. Microsoft's route is the Certificates snap-in: &lt;strong&gt;Service account&lt;/strong&gt; → &lt;strong&gt;Local computer&lt;/strong&gt; → &lt;strong&gt;Active Directory Domain Services&lt;/strong&gt;, then &lt;strong&gt;NTDS\Personal&lt;/strong&gt;. A command-line read (our form; the &lt;code&gt;-service&lt;/code&gt; option is documented as accessing "a machine service store"):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;:: Read-only. On the DC: certificates in the AD DS service's own Personal store (our form;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;use the MMC route &lt;span class="k"&gt;if &lt;/span&gt;it errors&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;certutil -service -store NTDS\My
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Served thumbprint = an old or expired certificate, new one in the computer store&lt;/td&gt;
&lt;td&gt;The DC hasn't reloaded. Microsoft's older guidance: "the server must be restarted for Schannel to use the new certificate." Newer DCs can reload without a restart&lt;/td&gt;
&lt;td&gt;Step 10 (renewServerCertificate)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Served certificate is in the NTDS store, not the one you renewed&lt;/td&gt;
&lt;td&gt;The NTDS store wins&lt;/td&gt;
&lt;td&gt;Replace it there (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Served certificate is the CA's own certificate, or another Server Authentication certificate&lt;/td&gt;
&lt;td&gt;Several candidates; the DC chose one you didn't intend&lt;/td&gt;
&lt;td&gt;Put the intended certificate in the NTDS store (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Served certificate is the one you expected&lt;/td&gt;
&lt;td&gt;The DC side is right&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 5: Does the client trust that certificate? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's LDAPS troubleshooting article checks the chain from the client, with the certificate exported from the server: &lt;code&gt;certutil -v -urlfetch -verify serverssl.cer &amp;gt; output.txt&lt;/code&gt;, then "Open the Output.txt file, and then search for errors." The file saved in Step 4 is the certificate the DC actually served, so use that one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On the CLIENT (or a Windows box with the same trust store): build the chain and fetch AIA and CDP URLs
&lt;/span&gt;&lt;span class="gp"&gt;certutil -v -urlfetch -verify %TEMP%\dc2-ldaps.cer &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;%TEMP%&lt;span class="se"&gt;\d&lt;/span&gt;c2-ldaps-verify.txt
&lt;span class="go"&gt;findstr /i "error expired revoked untrusted incomplete offline" %TEMP%\dc2-ldaps-verify.txt
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-urlfetch&lt;/code&gt; is documented as "Retrieve and verify AIA Certs and CDP CRLs." Microsoft's AskDS post lists what the bottom of the output usually says when it fails:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;code&gt;certutil&lt;/code&gt; says&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Expired certificate"&lt;/td&gt;
&lt;td&gt;Past its validity period. AskDS: "Now it's possible that the system clock has been changed to an invalid date."&lt;/td&gt;
&lt;td&gt;Check the clock first (&lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt;), then Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Verifies against UNTRUSTED root"&lt;/td&gt;
&lt;td&gt;Per AskDS, a certificate in the chain is missing from the client's Intermediate Certification Authorities store (for an intermediate) or Trusted Root Certification Authorities store (for a root)&lt;/td&gt;
&lt;td&gt;Step 10 (trust on the client)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Incomplete certificate chain"&lt;/td&gt;
&lt;td&gt;An intermediate certificate can't be found or fetched&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Certificate is REVOKED"&lt;/td&gt;
&lt;td&gt;AskDS: "the certificate has been revoked and therefore a new certificate needs to be issued."&lt;/td&gt;
&lt;td&gt;Step 10 (new certificate)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Revocation check skipped" or the revocation server is offline&lt;/td&gt;
&lt;td&gt;The client can't reach a CDP&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/adminpackstudio/revocation-server-was-offline-0x80092013-a-read-first-crl-cdp-cache-and-offline-root-triage-59pf"&gt;Revocation Server Was Offline&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verifies clean&lt;/td&gt;
&lt;td&gt;The chain is fine on this client&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Non-Windows clients (appliances, Java, Linux) don't use the Windows trust store. A clean &lt;code&gt;certutil&lt;/code&gt; run on a Windows box proves the chain is buildable; the appliance still needs your root and intermediate imported into its own store (our reading). Microsoft's own requirement covers both sides: "Trust is established by configuring the clients and the server to trust the root CA to which the issuing CA chains."&lt;/p&gt;

&lt;p&gt;The same server-certificate pattern (right EKU, private key present, chain the client trusts) is what breaks PEAP on NPS; &lt;a href="https://dev.to/adminpackstudio/nps-event-6273-reason-code-16-or-22-a-read-first-policy-eap-type-certificate-and-account-triage-26i6"&gt;NPS Event 6273 Reason Code 16 or 22&lt;/a&gt; walks that version.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Does the name the client used match the certificate? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's name rule: "The Active Directory fully qualified domain name of the domain controller (for example, dc01.contoso.com) must appear in one of the following places:" the subject CN or a DNS entry in the SAN. A client that connects by the domain name (&lt;code&gt;contoso.com&lt;/code&gt;), a load-balancer or alias name (&lt;code&gt;ldap.contoso.com&lt;/code&gt;), or an IP address checks that name instead, and a certificate issued only to &lt;code&gt;DC2.contoso.com&lt;/code&gt; fails that check (our reading).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On a Windows client: does the served certificate pass SSL policy for the name the app uses?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# (Microsoft's Test-Certificate example uses -Policy SSL -DNSName 'dns=contoso.com'; the file is the one saved in Step 4)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$served&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;TEMP&lt;/span&gt;&lt;span class="s2"&gt;\dc2-ldaps.cer"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$served&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DnsNameList&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-Certificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Cert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$served&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Policy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SSL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DNSName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'dns=DC2.contoso.com'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-Certificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Cert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$served&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Policy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SSL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DNSName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'dns=ldap.contoso.com'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's Test-Certificate reference: "If the DNSName parameter is used, then the DNS subject alternative name is used to verify SSL policy." Then read the application's LDAP server setting and the name it uses, and check that name in DNS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. Where does the name the app uses resolve? (names are examples)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ldap.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The app uses &lt;code&gt;contoso.com&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;It reaches whichever DC DNS returns, and that DC's certificate needs &lt;code&gt;contoso.com&lt;/code&gt; in its SAN&lt;/td&gt;
&lt;td&gt;Point the app at a DC FQDN, or reissue with the extra SAN (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The app uses an alias or load-balancer name&lt;/td&gt;
&lt;td&gt;That name isn't in any DC's certificate&lt;/td&gt;
&lt;td&gt;Same choice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The app uses an IP address&lt;/td&gt;
&lt;td&gt;A certificate issued to DNS names won't match an IP address&lt;/td&gt;
&lt;td&gt;Use a name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Test-Certificate&lt;/code&gt; passes for the name used&lt;/td&gt;
&lt;td&gt;The name isn't the problem&lt;/td&gt;
&lt;td&gt;Step 7 if the failure is on 389, or back to Step 5 for the app's own trust store&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Directory Services team's older post adds a caveat for multi-name certificates: "The first name in the SAN has to match the FQDN of the server." Keep the DC's own FQDN first when you reissue (our habit).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Who is binding unsigned or in clear text? (read-only, then one low-risk logging change)
&lt;/h2&gt;

&lt;p&gt;This is the 389 side. Microsoft's definition of what the DC counts, from the Event 2889 text: "The following client performed a SASL (Negotiate/Kerberos/NTLM/Digest) LDAP bind without requesting signing (integrity verification), or performed a simple bind over a clear text (non-SSL/TLS-encrypted) LDAP connection."&lt;/p&gt;

&lt;p&gt;The DC already logs summaries without any change:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;When it's logged (Microsoft)&lt;/th&gt;
&lt;th&gt;What it tells you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2886&lt;/td&gt;
&lt;td&gt;At startup, as a reminder when the DC doesn't require signing&lt;/td&gt;
&lt;td&gt;This DC accepts unsigned binds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2887&lt;/td&gt;
&lt;td&gt;"a summary Event ID 2887 one time every 24 hours to indicate how many such binds occurred"&lt;/td&gt;
&lt;td&gt;How many, not who&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2888&lt;/td&gt;
&lt;td&gt;"a summary Event ID 2888 one time every 24 hours when such bind attempts occur" on a DC that rejects them&lt;/td&gt;
&lt;td&gt;How many were rejected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2889&lt;/td&gt;
&lt;td&gt;One per bind, only with the diagnostic level raised&lt;/td&gt;
&lt;td&gt;Client IP, port, identity, and binding type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the summaries on every DC first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. Every DC: the latest LDAP signing summaries (2886, 2887, 2888) from the Directory Service log&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ADDomainController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HostName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Directory Service'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2886&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2887&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2888&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 2887 message ends with the two counts that matter: "Number of simple binds performed without SSL/TLS" and "Number of Negotiate/Kerberos/NTLM/Digest binds performed without signing". A DC that logs 2888 instead is already rejecting them, which is the "Strong Authentication Required" side.&lt;/p&gt;

&lt;p&gt;To get names, raise the LDAP Interface Events level. Microsoft: "You can enable this additional logging by setting the 16 LDAP Interface Events diagnostic setting to 2 (Basic)." and, for the cost, "it has a negative effect on domain controller performance, and it should be disabled when it is no longer needed." Microsoft's command (a change, but a reversible logging change; do it on one DC at a time, our habit):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Low-risk change, on ONE DC. Raise LDAP Interface Events to 2 (Basic) to log Event 2889 per bind (Microsoft's form)
reg query HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics /v "16 LDAP Interface Events"
Reg Add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics /v "16 LDAP Interface Events" /t REG_DWORD /d 2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Leave it long enough to cover the clients' schedules (a nightly sync, a weekly report), then group what it logged:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On that DC: unsigned or clear-text binds in the last 24 hours, grouped by client, identity, and binding type&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# (the property order IP:port, identity, binding type is our reading of the event text; check one event with Format-List first)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Directory Service'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2889&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pscustomobject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nx"&gt;Client&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Properties&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;':\d+$'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nx"&gt;Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Properties&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Value&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nx"&gt;BindType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Properties&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Value&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Group-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Identity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;BindType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's binding types in the 2889 text: "0 - SASL Bind that does not use signing" and "1 - Simple Bind that does not support signing".&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Type 1 from an appliance or app with a service account&lt;/td&gt;
&lt;td&gt;A simple bind with a password on 389, in clear text&lt;/td&gt;
&lt;td&gt;Move it to LDAPS on 636 (Steps 3-6 for its DC) or to a signed SASL bind (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type 0 from a Windows computer&lt;/td&gt;
&lt;td&gt;A client or app that asks for SASL without signing; Microsoft says Windows clients request signing by default, so look at the app or a local policy set to None&lt;/td&gt;
&lt;td&gt;Step 8 (client side)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type 0 or 1 from an IP you can't place&lt;/td&gt;
&lt;td&gt;Microsoft: "Identify the make, model, and type of device for each IP address cited by:" Event 2889&lt;/td&gt;
&lt;td&gt;Find the owner before anything else&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No 2889 after a full cycle, and 2887 counts are zero&lt;/td&gt;
&lt;td&gt;Nothing on this DC binds unsigned&lt;/td&gt;
&lt;td&gt;Repeat on the next DC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then turn it back down. Microsoft's revert: &lt;code&gt;Reg Add HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics /v "16 LDAP Interface Events" /t REG_DWORD /d 0&lt;/code&gt;. The diagnostic logging article: "Make sure that you reset the entries to 0 after you finish investigating the problem."&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Which signing policy is actually in effect on each DC? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft maps the &lt;strong&gt;Domain controller: LDAP server signing requirements&lt;/strong&gt; policy to one registry value, &lt;code&gt;LDAPServerIntegrity&lt;/code&gt; under &lt;code&gt;NTDS\Parameters&lt;/code&gt;, with None = 1 and Require Signing = 2. Channel binding is &lt;code&gt;LdapEnforceChannelBinding&lt;/code&gt; in the same key (Never = 0, When Supported = 1, Always = 2). Read both on every DC, plus the policy result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On each DC: the signing and channel binding values it holds (an error means the value isn't set)
reg query HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters /v LDAPServerIntegrity
reg query HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters /v LdapEnforceChannelBinding
:: Which GPO set them (open the report and search Security Options for "LDAP")
gpresult /scope computer /h %TEMP%\dc-rsop.html
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows Server 2025 adds a second policy. Microsoft: "The Domain controller: LDAP server signing requirements enforcement policy takes precedence over the Domain controller: LDAP server signing requirements policy." Its Not Configured state isn't neutral: "Default: Not Configured, which has the same effect as Enabled (default for new deployments)." And for upgrades and mixed domains: "During an upgrade, Windows Server preserves existing signing policies to prevent disruption; if no LDAP server signing policy exists, Windows Server 2025 requires signing by default."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Only the new Windows Server 2025 DC rejects binds&lt;/td&gt;
&lt;td&gt;No signing policy defined, so that DC requires signing by default; the older DCs still accept unsigned binds&lt;/td&gt;
&lt;td&gt;Fix the clients from Step 7 first, then make every DC match on purpose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;LDAPServerIntegrity&lt;/code&gt; = 2 on some DCs, 1 on others&lt;/td&gt;
&lt;td&gt;DCs in different OUs, or a GPO that didn't apply everywhere&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/adminpackstudio/group-policy-not-applying-a-read-first-scope-filtering-replication-and-client-triage-31ho"&gt;Group Policy Not Applying&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;gpresult&lt;/code&gt; shows the setting, &lt;code&gt;reg query&lt;/code&gt; doesn't match&lt;/td&gt;
&lt;td&gt;Policy not refreshed yet&lt;/td&gt;
&lt;td&gt;Microsoft: "To apply it immediately, run gpupdate /force on your domain controllers."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A Windows client fails against a DC that requires signing&lt;/td&gt;
&lt;td&gt;The client's &lt;strong&gt;Network security: LDAP client signing requirements&lt;/strong&gt; may be None&lt;/td&gt;
&lt;td&gt;Microsoft's client options are None, Negotiate signing, and Require signing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On the client side, Microsoft's default is fine for Windows: "All currently supported versions of Windows client use LDAP signing by default as LDAP clients." And its warning for the strict setting: "Not setting one of the sides will prevent client computers from communicating with the server."&lt;/p&gt;

&lt;p&gt;LDAPS doesn't care about this policy. Microsoft's policy reference: "This setting doesn't have any impact on LDAP simple bind through SSL (LDAP TCP/636)." So "Strong Authentication Required" on 389 doesn't mean LDAPS is broken, and fixing the certificate won't fix a clear-text bind on 389 (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: Is channel binding rejecting a TLS bind? (read-only)
&lt;/h2&gt;

&lt;p&gt;Channel binding is narrower than people expect. Microsoft: it doesn't apply to "Simple bind over TLS", to "Certificate bind over TLS", or to "Non-TLS SASL sessions". It only covers SASL (usually NTLM or Kerberos through Negotiate) inside LDAPS or STARTTLS. Microsoft's settings:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Behavior (Microsoft)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Never&lt;/td&gt;
&lt;td&gt;"The server doesn't perform channel binding validation."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;When supported&lt;/td&gt;
&lt;td&gt;"Clients that support CBT must provide it. Clients that don't support CBT are still allowed. The server logs auditing events."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Always&lt;/td&gt;
&lt;td&gt;"All applicable TLS and SASL clients must provide CBT. The server rejects authentication from clients that don't provide a valid token."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Defaults, per Microsoft: on Windows Server 2025 new deployments the policy "Defaults to When supported." On Windows Server 2022 or earlier it's "Set to Never" and "The 2023-03 security updates enable CBT auditing by default on domain controllers."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On each DC: channel binding events from the last 7 days (3039 fail, 3040/3041 summary or reminder, 3074/3075 audit)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Directory Service'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3039&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3040&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3041&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3074&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3075&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft: "Events 3039, 3074, and 3075 can only be generated when Channel Binding is set to When Supported or Always." Per-client events also need the same "16 LDAP Interface Events" level of 2 from Step 7.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3041 and 3040 only&lt;/td&gt;
&lt;td&gt;Policy is Never; 3040 counts "unprotected LDAPs binds"&lt;/td&gt;
&lt;td&gt;Plan When supported (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3075 from a client&lt;/td&gt;
&lt;td&gt;"The following client performed an LDAP bind over SSL/TLS and did not provide Channel Binding Information." It would be rejected under Always&lt;/td&gt;
&lt;td&gt;Update or reconfigure that client before Always&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3074 from a client&lt;/td&gt;
&lt;td&gt;It "would have failed the channel binding token validation if the directory server was configured to enforce validation of Channel Binding Tokens."&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3039&lt;/td&gt;
&lt;td&gt;A bind already failed CBT under When supported or Always&lt;/td&gt;
&lt;td&gt;That client is broken now; Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;None of these, but TLS binds fail&lt;/td&gt;
&lt;td&gt;Not channel binding; go back to Steps 3-6 (our reading)&lt;/td&gt;
&lt;td&gt;Steps 3-6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Common false starts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What people try&lt;/th&gt;
&lt;th&gt;Why it misleads (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Turning LDAP signing off in the Default Domain Controllers Policy&lt;/td&gt;
&lt;td&gt;It hides Step 7's evidence and reopens the attack Microsoft describes: "an attacker can cause a server to make decisions that are based on forged requests from the LDAP client." Fix the client, or time-box an exception on one DC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setting channel binding to Never&lt;/td&gt;
&lt;td&gt;3039, 3074, and 3075 stop appearing because Microsoft only logs them under When supported or Always, so you lose the list of clients to fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deleting every old certificate on the DC&lt;/td&gt;
&lt;td&gt;The certificate the DC serves may be in the NTDS store, or may be the one you need. Read Step 4 first and export what you remove&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restarting the DC after every certificate change&lt;/td&gt;
&lt;td&gt;Newer DCs pick up a new certificate without a restart, and &lt;code&gt;renewServerCertificate&lt;/code&gt; forces it. A restart also hides whether the old one was ever served&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"It works in ldp on the DC, so LDAPS is fine"&lt;/td&gt;
&lt;td&gt;The DC trusts its own CA. Microsoft's article checks the chain "on the client computer" (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing only &lt;code&gt;Test-NetConnection&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A TCP socket opens even with no certificate (Step 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Turning off certificate validation in the app&lt;/td&gt;
&lt;td&gt;Gets a connection, removes the server-identity check TLS gives you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pointing the app at an IP address&lt;/td&gt;
&lt;td&gt;Avoids a name mismatch by failing every name check instead (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leaving "16 LDAP Interface Events" at 2&lt;/td&gt;
&lt;td&gt;Microsoft: "it has a negative effect on domain controller performance"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 10: Change one link, then prove it
&lt;/h2&gt;

&lt;p&gt;Only after Steps 1-9 agree on which link failed. Write down the current state first: the Step 3 certificate list with thumbprints, the Step 4 served thumbprint, the NTDS store contents, and the Step 8 &lt;code&gt;reg query&lt;/code&gt; output from every DC (our habit). Export any certificate before you remove it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No usable certificate, an expired one, or a missing key (Step 3).&lt;/strong&gt; With a Microsoft Enterprise CA, Microsoft's route is &lt;code&gt;certlm.msc&lt;/code&gt; → &lt;strong&gt;Personal&lt;/strong&gt; → &lt;strong&gt;Certificates&lt;/strong&gt; → &lt;strong&gt;All Tasks&lt;/strong&gt; → &lt;strong&gt;Request New Certificate&lt;/strong&gt;, then the &lt;strong&gt;Domain Controller&lt;/strong&gt; template. Microsoft: "The Domain Controller template comes preconfigured with the correct properties for LDAPS, including:" Server Authentication, the FQDN in the SAN, and "Automatic renewal before expiration". If that enrollment fails, &lt;a href="https://dev.to/adminpackstudio/certificate-autoenrollment-not-working-a-read-first-gpo-template-permission-ca-and-dcom-triage-4h86"&gt;Certificate Autoenrollment Not Working&lt;/a&gt; is the next read. For a missing private key, the AskDS fix runs on the computer that generated the request, not the DC that received the certificate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;:: Change (low risk). On the computer where the request was generated: re-link the certificate to its private key (Microsoft's AskDS form;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;0 is the store index&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;certutil -repairstore MY 0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AskDS: "If we can't locate the private key container then we will need to request a new certificate."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A non-Microsoft CA, or a name the template doesn't cover (Steps 3 and 6).&lt;/strong&gt; Microsoft's &lt;code&gt;certreq&lt;/code&gt; request file, with a SAN section added from the &lt;code&gt;certreq&lt;/code&gt; reference (DC FQDN first, our habit; names are examples):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;;----------------- request.inf (Microsoft's LDAPS template, plus a SAN section) -----------------
&lt;/span&gt;&lt;span class="nn"&gt;[Version]&lt;/span&gt;
&lt;span class="py"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"$Windows NT$"&lt;/span&gt;

&lt;span class="nn"&gt;[NewRequest]&lt;/span&gt;
&lt;span class="py"&gt;Subject&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"CN=DC2.contoso.com"&lt;/span&gt;
&lt;span class="py"&gt;KeySpec&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="py"&gt;KeyLength&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;2048&lt;/span&gt;
&lt;span class="py"&gt;Exportable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;TRUE&lt;/span&gt;
&lt;span class="py"&gt;MachineKeySet&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;TRUE&lt;/span&gt;
&lt;span class="py"&gt;SMIME&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;
&lt;span class="py"&gt;PrivateKeyArchive&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;FALSE&lt;/span&gt;
&lt;span class="py"&gt;UserProtected&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;FALSE&lt;/span&gt;
&lt;span class="py"&gt;UseExistingKeySet&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;FALSE&lt;/span&gt;
&lt;span class="py"&gt;ProviderName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Microsoft RSA SChannel Cryptographic Provider"&lt;/span&gt;
&lt;span class="py"&gt;ProviderType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;12&lt;/span&gt;
&lt;span class="py"&gt;RequestType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;PKCS10&lt;/span&gt;
&lt;span class="py"&gt;KeyUsage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0xa0&lt;/span&gt;

&lt;span class="nn"&gt;[EnhancedKeyUsageExtension]&lt;/span&gt;
&lt;span class="py"&gt;OID&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1.3.6.1.5.5.7.3.1 ; this is for Server Authentication&lt;/span&gt;

&lt;span class="nn"&gt;[Extensions]&lt;/span&gt;
&lt;span class="py"&gt;2.5.29.17&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"{text}"&lt;/span&gt;
&lt;span class="py"&gt;_continue_&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"DNS=DC2.contoso.com&amp;amp;"&lt;/span&gt;
&lt;span class="py"&gt;_continue_&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"DNS=ldap.contoso.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Change. On the DC: create the request, submit it to the CA, then accept the issued certificate (Microsoft's commands)
certreq -new request.inf request.req
certreq -accept certnew.cer
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The DC serves the wrong certificate (Step 4).&lt;/strong&gt; Put the certificate you want into the AD DS service's store, which wins over the computer store. Microsoft's Event 1220 steps: Certificates snap-in → &lt;strong&gt;Service account&lt;/strong&gt; → &lt;strong&gt;Local computer&lt;/strong&gt; → &lt;strong&gt;Active Directory Domain Services&lt;/strong&gt; → right-click &lt;strong&gt;NTDS\Personal&lt;/strong&gt; → &lt;strong&gt;All Tasks&lt;/strong&gt; → &lt;strong&gt;Import&lt;/strong&gt;. Then make the DC reload without a restart. Microsoft: "A new rootDse operation that's named renewServerCertificate can be used to manually trigger AD DS to update its SSL certificates without having to restart AD DS or restart the domain controller." The LDIF from Microsoft's protocol spec, saved as &lt;code&gt;renew.ldf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dn:
changetype: modify
add: renewServerCertificate
renewServerCertificate: 1
-
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;:: Change (low risk). Import the rootDSE modify against the DC that should reload (-s is ours;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;the LDIF is Microsoft&lt;span class="s1"&gt;'s)
&lt;/span&gt;&lt;span class="go"&gt;ldifde -i -f renew.ldf -s DC2.contoso.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Per the protocol spec, the account running it needs the Reload-SSL-Certificate control access right on that DC's nTDSDSA object. Microsoft also notes AD DS "detects when a new certificate is dropped into its certificate store and then triggers an SSL certificate update" by itself; the LDIF just forces it now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The client doesn't trust the chain (Step 5).&lt;/strong&gt; Add your root to the client's Trusted Root store and the issuing CA to Intermediate (Group Policy for Windows clients; the vendor's certificate import for an appliance). For one Windows test box, &lt;code&gt;certutil&lt;/code&gt; can do it directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Change. On ONE Windows test client: add the root and the issuing CA (file names are examples)
certutil -addstore Root ContosoRootCA.cer
certutil -addstore CA ContosoIssuingCA.cer
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the chain is fine and only revocation fails, fix the CDP instead (&lt;a href="https://dev.to/adminpackstudio/revocation-server-was-offline-0x80092013-a-read-first-crl-cdp-cache-and-offline-root-triage-59pf"&gt;Revocation Server Was Offline&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unsigned or clear-text binds (Steps 7 and 8).&lt;/strong&gt; Fix the client from Step 7's list, not the DC. Microsoft: "It's also quite possible that a solution for both topics consists in a single change. For example, by moving from simple bind to SASL using Kerberos or TLS with simple bind." For the badge server, that's its LDAP setting moved to port 636 with your CA imported (Steps 3-6 for the DC it uses). Then require signing on purpose, on every DC: &lt;strong&gt;Domain controller: LDAP server signing requirements&lt;/strong&gt; = &lt;strong&gt;Require signing&lt;/strong&gt; in the Default Domain Controllers Policy. On Windows Server 2025, leave &lt;strong&gt;Domain controller: LDAP server signing requirements enforcement&lt;/strong&gt; at its default. If one application can't be fixed this week, a time-boxed exception is the enforcement policy set to Disabled with the older policy at None. Microsoft: "Disabled: The Domain controller: LDAP server signing requirements policy determines the LDAP signing requirement." Put an end date on the ticket (our habit).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Channel binding (Step 9).&lt;/strong&gt; Start at When supported. Microsoft: "To maximize compatibility with older operating system versions (Windows Server 2008 and earlier versions), we recommend that you enable this setting with a value of 1." Move to Always only after 3039, 3074, and 3075 stay quiet on every DC. Use the &lt;strong&gt;Domain controller: LDAP server channel binding token requirements&lt;/strong&gt; policy. If you test with the registry value on one DC first, Microsoft says the change is live without a restart: "LDAP server responds dynamically to changes to this registry entry."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then prove it.&lt;/strong&gt; For LDAPS, from the client side: re-run Step 4's served-certificate read (the new thumbprint), Step 5's &lt;code&gt;certutil -verify&lt;/code&gt;, then Microsoft's ldp test. Microsoft: "Ensure that Port is set to 636, the Connectionless check box is cleared, and the SSL check box is selected, and then click OK." Then "RootDSE information should print in the right pane, indicating a successful connection." For signing, Microsoft's ldp simple-bind test on 389 carries its own warning: "Run it only in an isolated lab, use a nonprivileged disposable test account, and never enter production credentials." In production, Microsoft's check: "For production validation, monitor Event Viewer for Event ID 2888." The pass is the application working against every DC it can reach, no new Event 2889 from its IP, and Event 1220 gone from the DC (our reading). Then set "16 LDAP Interface Events" back to 0.&lt;/p&gt;




&lt;h2&gt;
  
  
  When a change is justified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No usable certificate on the DC&lt;/td&gt;
&lt;td&gt;Domain Controller template enrollment, or a &lt;code&gt;certreq&lt;/code&gt; request with Server Authentication&lt;/td&gt;
&lt;td&gt;A self-signed certificate on a DC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong certificate served&lt;/td&gt;
&lt;td&gt;Intended certificate in NTDS\Personal, then &lt;code&gt;renewServerCertificate&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Deleting every certificate in the computer store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client doesn't trust the chain&lt;/td&gt;
&lt;td&gt;Root and intermediate on the client, by GPO or vendor import&lt;/td&gt;
&lt;td&gt;Disabling certificate validation in the app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name not in the certificate&lt;/td&gt;
&lt;td&gt;The app pointed at a DC FQDN, or a reissue with the extra SAN&lt;/td&gt;
&lt;td&gt;Connecting by IP address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Appliance sends simple binds on 389&lt;/td&gt;
&lt;td&gt;The appliance moved to LDAPS, then Require signing&lt;/td&gt;
&lt;td&gt;Signing off in the Default Domain Controllers Policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only the Windows Server 2025 DC rejects binds&lt;/td&gt;
&lt;td&gt;Fix the clients, then make every DC require signing&lt;/td&gt;
&lt;td&gt;Disabling the 2025 enforcement policy with no end date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clients logged in 3074 or 3075&lt;/td&gt;
&lt;td&gt;When supported until they're fixed, then Always&lt;/td&gt;
&lt;td&gt;Channel binding set to Never&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why is LDAPS not working on my domain controller?&lt;/strong&gt;&lt;br&gt;
Most often the DC has no certificate it can use (Event 1220), serves a different certificate than the one you renewed, or serves one the client doesn't trust or can't match to the name it used. Microsoft: "There's no user interface for configuring LDAPS." A valid certificate is what turns it on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Event ID 2889?&lt;/strong&gt;&lt;br&gt;
A per-bind record of an unsigned SASL bind or a clear-text simple bind on a DC, with the client IP, the identity, and the binding type (0 for SASL without signing, 1 for a simple bind). It only appears after "16 LDAP Interface Events" is set to 2; Event 2887 is the daily count that's logged without it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between LDAP signing and LDAPS?&lt;/strong&gt;&lt;br&gt;
Microsoft: "LDAP signing provides integrity and authenticity but not confidentiality." LDAPS (TLS on 636) encrypts the whole session, and Microsoft says signing "applies only to non-TLS SASL sessions." A simple bind needs TLS to protect the password.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to restart the domain controller after replacing the LDAPS certificate?&lt;/strong&gt;&lt;br&gt;
Usually not on current versions. Microsoft: AD DS detects a new certificate in its store, and &lt;code&gt;renewServerCertificate&lt;/code&gt; triggers the update "without having to restart AD DS or restart the domain controller." Microsoft's enrollment steps still say to restart after the first certificate, so a restart in a maintenance window is the fallback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does "Strong Authentication Required" mean?&lt;/strong&gt;&lt;br&gt;
The DC requires signing and the client sent a simple bind in clear text or an unsigned SASL bind. Microsoft's ldp test shows it as "Ldap_simple_bind_s() failed: Strong Authentication Required". Find the client in Event 2889 (Step 7) and move it to LDAPS or a signed bind.&lt;/p&gt;




&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/certificate-autoenrollment-not-working-a-read-first-gpo-template-permission-ca-and-dcom-triage-4h86"&gt;Certificate Autoenrollment Not Working&lt;/a&gt; (when the DC never gets its Domain Controller certificate)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/revocation-server-was-offline-0x80092013-a-read-first-crl-cdp-cache-and-offline-root-triage-59pf"&gt;Revocation Server Was Offline 0x80092013&lt;/a&gt; (when the client can't check the DC certificate's CRL)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/nps-event-6273-reason-code-16-or-22-a-read-first-policy-eap-type-certificate-and-account-triage-26i6"&gt;NPS Event 6273 Reason Code 16 or 22&lt;/a&gt; (the same server-certificate checks for PEAP on NPS)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/group-policy-not-applying-a-read-first-scope-filtering-replication-and-client-triage-31ho"&gt;Group Policy Not Applying&lt;/a&gt; (when the signing policy reaches some DCs and not others)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt; (a wrong clock makes a valid certificate look expired)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free checklist
&lt;/h2&gt;

&lt;p&gt;Requiring LDAP signing before anyone read Event 2889 is enforcement before audit, and so is turning it back off domain-wide when one badge server breaks. A Conditional Access policy enforced before anyone read the report-only results is the same mistake. The free &lt;strong&gt;Conditional Access pre-enforcement checklist&lt;/strong&gt; keeps break-glass accounts, pilot groups, and report-only review on one page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=ldaps-not-working-domain-controller" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=ldaps-not-working-domain-controller&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the &lt;strong&gt;Intune &amp;amp; M365 Admin Starter Pack&lt;/strong&gt; pairs with this triage: &lt;a href="https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=ldaps-not-working-domain-controller" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=ldaps-not-working-domain-controller&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Admin Pack Studio; not affiliated with Microsoft. Steps 1-9 favor read-only checks: &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;Get-NetTCPConnection&lt;/code&gt;, &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;Get-ChildItem Cert:\LocalMachine\My&lt;/code&gt;, &lt;code&gt;certutil -verifystore&lt;/code&gt;, &lt;code&gt;-store&lt;/code&gt;, and &lt;code&gt;-verify -urlfetch&lt;/code&gt;, the .NET SslStream read of the served certificate, &lt;code&gt;Test-Certificate&lt;/code&gt;, &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;Get-ADDomainController&lt;/code&gt;, &lt;code&gt;reg query&lt;/code&gt;, &lt;code&gt;gpresult&lt;/code&gt;, and &lt;code&gt;ldp.exe&lt;/code&gt; connects. Raising and lowering "16 LDAP Interface Events", requesting, accepting, importing, or repairing certificates, &lt;code&gt;renewServerCertificate&lt;/code&gt;, adding CA certificates to client stores, and changing LDAP signing, signing enforcement, or channel binding policy are deliberate changes. Change one link at a time, test from the failing client against every DC it can reach, and check current Microsoft Learn for version-specific behavior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windowsserver</category>
      <category>activedirectory</category>
      <category>security</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>The Target Principal Name Is Incorrect: A Read-First DNS, DC Password, SPN, and Kerberos Event 4 Triage</title>
      <dc:creator>AdminPackStudio</dc:creator>
      <pubDate>Mon, 19 Oct 2026 00:41:10 +0000</pubDate>
      <link>https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak</link>
      <guid>https://dev.to/adminpackstudio/the-target-principal-name-is-incorrect-a-read-first-dns-dc-password-spn-and-kerberos-event-4-2mak</guid>
      <description>&lt;p&gt;Helpdesk: "BR-DC2 came back on Friday after the branch was offline for most of a month. Now replication from it fails with 'The target principal name is incorrect', a file server we reach through an old alias says 'target account name is incorrect', and the old DC we're retiring won't demote. A forum post says to stop the KDC on every DC, force-remove the old DC, and rejoin the file server. Can we start with that?"&lt;/p&gt;

&lt;p&gt;Not yet. &lt;strong&gt;"The target principal name is incorrect" doesn't mean Active Directory is corrupt. It means a Kerberos ticket reached a computer that couldn't decrypt it: the wrong computer, the right computer holding a different password than the KDC used, or a name (SPN) registered on the wrong account.&lt;/strong&gt; Microsoft's replication article says the error "occurs when the source domain controller doesn't decrypt the service ticket provided by the destination (target) domain controller", and that the -2146893022 (0x80090322, SEC_E_WRONG_PRINCIPAL) "error code isn't an Active Directory error." Its top cause: "the KDC has an old version of the password for the source domain controller." Stopping the KDC on every DC, forcing a demotion, or rejoining a server can each hide which of those three it was, and a forced demotion leaves metadata behind that you then have to clean up by hand. Work through it as a chain: &lt;strong&gt;which computers, which name, since when&lt;/strong&gt; → &lt;strong&gt;where is the error reported (repadmin, dcdiag, Kerberos Event 4, KDC Event 11)?&lt;/strong&gt; → &lt;strong&gt;did the traffic reach the computer you meant (DNS, hosts file, NTDS Settings GUID)?&lt;/strong&gt; → &lt;strong&gt;which KDC issued the ticket, and does it have the current password for the target?&lt;/strong&gt; → &lt;strong&gt;are the target's SPNs present, and on only one account?&lt;/strong&gt; → &lt;strong&gt;what does the client's Event 4 name as the target and the server that answered?&lt;/strong&gt; → &lt;strong&gt;is an alias (CNAME) involved?&lt;/strong&gt; → &lt;strong&gt;are time and the secure channel in order?&lt;/strong&gt; → &lt;strong&gt;is this a demotion?&lt;/strong&gt; &lt;code&gt;repadmin&lt;/code&gt;, &lt;code&gt;dcdiag&lt;/code&gt;, &lt;code&gt;nltest&lt;/code&gt;, &lt;code&gt;setspn&lt;/code&gt;, &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;Resolve-DnsName&lt;/code&gt;, and &lt;code&gt;Get-ADComputer&lt;/code&gt; are the sources for that chain. Stop the KDC everywhere and you'll be finding out later which DC was handing out the stale ticket.&lt;/p&gt;

&lt;p&gt;If replication fails with 1722 (the RPC server is unavailable) instead, no connection was made yet, and &lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;AD Replication Error 1722&lt;/a&gt; starts earlier in the chain. If the message ends in "Cannot generate SSPI context" from SQL Server, &lt;a href="https://dev.to/adminpackstudio/sql-server-error-18456-login-failed-for-user-a-read-first-error-log-state-auth-mode-and-login-b3n"&gt;SQL Server Error 18456&lt;/a&gt; covers SQL SPNs in depth. This post covers &lt;strong&gt;"Active Directory replication, a domain controller, a demotion, or a file server fails with 'The target principal name is incorrect' (-2146893022, 0x80090322), 'target account name is incorrect', or Kerberos Event 4 KRB_AP_ERR_MODIFIED, and you need a read-first path before you stop KDCs, reset DC passwords, delete SPNs, force a demotion, or rejoin servers."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's a decryption failure, not a network failure.&lt;/strong&gt; Microsoft: "Kerberos errors that are mapped by Windows code to -2146893022" include KRB_AP_ERR_MODIFIED, KRB_AP_ERR_BADMATCH, and KRB_AP_ERR_NOT_US. The connection worked; the ticket didn't (Step 2).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check you reached the right computer first.&lt;/strong&gt; Microsoft's first specific cause: "A bad name-to-IP mapping in DNS, WINS, HOST, or LMHOST file." (Step 3).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then the password the KDC used.&lt;/strong&gt; Microsoft: "Replication failures can prevent domain controllers from having a current password value for domain controllers in a given domain." (Step 4).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SPNs have to be on one account.&lt;/strong&gt; Microsoft: "Unless a service uses the computer account and the HOST SPN, SPNs must be unique in the AD DS forest." (Step 5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event 4 names both sides.&lt;/strong&gt; Microsoft's Event 4 text: "Please ensure that the target SPN is registered on, and only registered on, the account used by the server." (Step 6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forced demotion is a last resort.&lt;/strong&gt; Microsoft: "Forced demotion leaves orphaned metadata in Active Directory on the remaining domain controllers in the forest." (Step 9).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where in the chain did it break?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What should be true&lt;/th&gt;
&lt;th&gt;Typical symptom when it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Symptom captured&lt;/td&gt;
&lt;td&gt;Which computers, which name was used, which direction, since when&lt;/td&gt;
&lt;td&gt;"AD is broken" with no partner named&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Where it's reported&lt;/td&gt;
&lt;td&gt;You know whether it's replication, a member's Event 4, or a KDC event&lt;/td&gt;
&lt;td&gt;Fixing replication when only one file server fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Name-to-IP&lt;/td&gt;
&lt;td&gt;The name resolves to the computer you meant, on every DNS server the caller uses&lt;/td&gt;
&lt;td&gt;A stale A record, a hosts entry, or a GUID CNAME pointing at another DC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. KDC and password&lt;/td&gt;
&lt;td&gt;The KDC that issued the ticket has the target's current password&lt;/td&gt;
&lt;td&gt;DC back from a long outage or a restore; password versions differ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. SPNs&lt;/td&gt;
&lt;td&gt;The target's SPNs exist and sit on one account&lt;/td&gt;
&lt;td&gt;KDC Event 11, &lt;code&gt;setspn -X&lt;/code&gt; finds duplicates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Event 4 read&lt;/td&gt;
&lt;td&gt;You know the SPN asked for and the server that answered&lt;/td&gt;
&lt;td&gt;Event 4 read as "Kerberos is broken"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Aliases&lt;/td&gt;
&lt;td&gt;Clients use a name the server has SPNs for&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;\\alias\share&lt;/code&gt; fails, &lt;code&gt;\\server\share&lt;/code&gt; works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Time and channel&lt;/td&gt;
&lt;td&gt;Clocks within five minutes; DC secure channels healthy&lt;/td&gt;
&lt;td&gt;KERB_AP_ERR_SKEW, Netlogon 3210 or 5722&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Demotion&lt;/td&gt;
&lt;td&gt;Graceful demotion with replication working&lt;/td&gt;
&lt;td&gt;Demotion fails, forced removal tempting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Change&lt;/td&gt;
&lt;td&gt;Only after Steps 1-9 agree: one link, one change&lt;/td&gt;
&lt;td&gt;KDC stopped on every DC, same error&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1: Capture the symptom (read-only)
&lt;/h2&gt;

&lt;p&gt;Write these on the ticket first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which two computers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;For replication: the destination (the DC pulling changes) and the source. Microsoft: "The destination domain controller is the domain controller requesting changes." For a share: the client and the server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which name was used&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NetBIOS name, FQDN, IP address, or an alias. A name the server has no SPN for behaves differently from its real name (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;One pair or many&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One source failing for every partner points at the source (its password, its DNS records); one destination failing for every source points at the destination's DNS or KDC (our reading)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Since when, and what changed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A DC back from a long outage, a DC restored from backup, a rename, a new alias, a new service account, a promotion or demotion, a DNS cleanup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exact error text and code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-2146893022 (0x80090322), "Access is denied", 1722, and 1753 lead to different steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which domains&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microsoft's Event 4 text warns about "identically named server accounts in these two domains"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then branch on what you see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it usually means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Replication from one source fails with -2146893022 for every partner&lt;/td&gt;
&lt;td&gt;The source's password differs between the KDC and the source&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One destination fails from several sources&lt;/td&gt;
&lt;td&gt;That destination's DNS servers or hosts file, or its KDC&lt;/td&gt;
&lt;td&gt;Steps 3 and 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error began right after a DC came back from a long outage or a restore&lt;/td&gt;
&lt;td&gt;Password versions out of step&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KDC Event 11 on DCs&lt;/td&gt;
&lt;td&gt;A duplicate SPN&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kerberos Event 4 on clients reaching one server&lt;/td&gt;
&lt;td&gt;SPN on another account, or that server's password&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;\\alias\share&lt;/code&gt; fails, &lt;code&gt;\\server\share&lt;/code&gt; works&lt;/td&gt;
&lt;td&gt;No SPN for the alias&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works by IP address, fails by name&lt;/td&gt;
&lt;td&gt;Microsoft notes for one scenario: "However, if you use the IP address, the command may succeed." Using an IP usually leaves Kerberos out&lt;/td&gt;
&lt;td&gt;Steps 3 and 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Demotion fails with the error&lt;/td&gt;
&lt;td&gt;Replication or the KDC on the DC being removed&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1722 or 1753 instead&lt;/td&gt;
&lt;td&gt;A connection or endpoint problem, not a decryption problem&lt;/td&gt;
&lt;td&gt;The 1722 post&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2: Find where the error is reported (read-only)
&lt;/h2&gt;

&lt;p&gt;For replication, Microsoft lists the commands that show it: &lt;code&gt;REPADMIN /REPLSUM&lt;/code&gt;, &lt;code&gt;/SHOWREPL&lt;/code&gt;, &lt;code&gt;/SHOWREPS&lt;/code&gt;, and &lt;code&gt;/SYNCALL&lt;/code&gt;, plus DCDIAG's replications test. Start forest-wide:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. From a DC or an admin box with RSAT: every DC's inbound replication, errors only (Microsoft's repadmin forms)
repadmin /showrepl * /errorsonly
&lt;/span&gt;&lt;span class="gp"&gt;repadmin /showrepl * /csv &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;showrepl.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's own shortcut for reading the CSV is &lt;code&gt;repadmin /showrepl * /csv | convertfrom-csv | out-gridview&lt;/code&gt;. To pull out only the rows with this error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. Which source and destination pairs report -2146893022 (the Select-String filter is ours)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;repadmin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/showrepl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/csv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Pattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'2146893022'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List every pair. If one source DC appears in every row, that DC is where Step 4 starts. Microsoft's event table for this error includes NTDS KCC 1925 ("The attempt to establish a replication link for the following writable directory partition failed.") and 1308 in the Directory Service log on the destination.&lt;/p&gt;

&lt;p&gt;For member servers and clients, the evidence is Kerberos Event 4. Microsoft: "The client then puts Kerberos event 4 (example below) in its System event log."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the client that can't connect: Kerberos Event 4 in the System log, last 7 days&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# (other providers also log an Id 4, so the provider filter is ours)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'System'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ProviderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Kerberos'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ProviderName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the DCs, look for duplicate names. Microsoft's archived KDC Event 11 message: "There are multiple accounts with name %1 of type %2." On Windows Server 2012 R2 and later DCs, a blocked attempt to add a duplicate is Event 2974 in the Directory Service log. Microsoft: "The event 2974 lists the value that was blocked and a list of one or more objects (up to 10) that already contain that value."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On each DC: KDC Event 11 (System log) and Event 2974 (Directory Service log), last 7 days&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# (the provider match for the KDC is ours)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$since&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddDays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;-7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'System'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$since&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ProviderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'KDC|Key-Distribution'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Directory Service'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2974&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$since&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's Kerberos guidance says to check the Security and System logs on "The authenticating client", "The target server or service", and "The domain controller". Do all three before deciding which one is at fault.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Did the traffic reach the computer you meant? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft: "The following situations can all cause a destination domain controller to submit Kerberos-encrypted traffic to the wrong Kerberos target:" stale NTDS Settings objects, bad name-to-IP mappings in DNS and WINS host records, and stale entries in HOST files. If DC1 asks for a ticket for DC2 but the packets land on DC3, DC3 can't decrypt a ticket made for DC2. Microsoft notes the realm in the error can even match: "Bad host-to-IP mappings could cause DC1 to connect to DC3 in the same domain."&lt;/p&gt;

&lt;p&gt;How a destination DC finds its source, per Microsoft: it looks up the source's NTDS Settings objectGUID, queries DNS for "a matching DC GUIDED CNAME record", and follows that to the source's host A or AAAA record. Microsoft's check without a network trace, on the source DC first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;:: Read-only. On the SOURCE DC: its IP addresses, and its own DSA object GUID (top of the output;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Microsoft&lt;span class="s1"&gt;'s article uses /showreps)
&lt;/span&gt;&lt;span class="go"&gt;ipconfig /all
repadmin /showreps
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then on the destination DC (Microsoft's sequence; DC1, the GUID, and the DNS server IP are examples):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On the DESTINATION DC: which DNS servers it asks, and the source's GUID as this DC sees it
ipconfig /all
repadmin /showreps
:: Read-only. What each of those DNS servers returns for the source's GUID CNAME and host record (repeat per DNS server IP)
nslookup -type=cname 6f3f96d3-dfbf-4daf-9236-4d6da6909dd2._msdcs.contoso.com 10.0.0.10
nslookup -type=A+AAAA DC1.contoso.com 10.0.0.10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft: "The DSA object GUID listed for the source DC in the replication status section of the report should match the object GUID listed in the /showreps header when run on the console of the source DC." For the host records: "Check for duplicate host A records on all DNS Server IPs configured on the destination DC."&lt;/p&gt;

&lt;p&gt;The same reads in PowerShell, one pass per DNS server (our form of Microsoft's nslookup steps):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the destination DC. Fill in the DNS server IPs from ipconfig /all and the source's DSA object GUID&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$dnsServers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.10'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'10.0.0.11'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$guidName&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'6f3f96d3-dfbf-4daf-9236-4d6da6909dd2._msdcs.contoso.com'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dnsServers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s2"&gt;"--- DNS server &lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$guidName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CNAME&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC1.contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# The hosts file: any line naming the source DC?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Select-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;SystemRoot&lt;/span&gt;&lt;span class="s2"&gt;\System32\drivers\etc\hosts"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Pattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC1'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The GUIDs differ between the source and the destination's view&lt;/td&gt;
&lt;td&gt;The destination holds a stale NTDS Settings object for that source (our reading of Microsoft's list)&lt;/td&gt;
&lt;td&gt;Replication of the Configuration partition, or metadata cleanup if the old DC is gone (Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One DNS server returns a different IP, or two A records&lt;/td&gt;
&lt;td&gt;Bad name-to-IP mapping; often a stale record that scavenging never removed (our reading)&lt;/td&gt;
&lt;td&gt;Step 10, and &lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A hosts entry names the source&lt;/td&gt;
&lt;td&gt;Microsoft: "Remove if present."&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The IP answers but isn't a DC&lt;/td&gt;
&lt;td&gt;Microsoft: a request sent to a non-DC "returns error 1753" rather than this error&lt;/td&gt;
&lt;td&gt;The 1722 post&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everything resolves to the right IP&lt;/td&gt;
&lt;td&gt;The traffic reached the right DC&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a member server or client, the same question applies to the server name it used: does &lt;code&gt;Resolve-DnsName&lt;/code&gt; for that name, against the client's DNS servers, return the server you meant? If the client can't find a DC at all, &lt;a href="https://dev.to/adminpackstudio/netlogon-event-id-5719-a-read-first-boot-timing-dns-dc-locator-and-site-triage-3j2a"&gt;Netlogon Event ID 5719&lt;/a&gt; covers DC location.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Which KDC issued the ticket, and does it have the current password? (read-only)
&lt;/h2&gt;

&lt;p&gt;This is Microsoft's top cause. Every DC runs a KDC, and Microsoft: "For same realm transactions, a destination domain controller favors getting Kerberos tickets from itself. However, it may get a ticket from a remote domain controller." If whichever KDC issued the ticket holds an older password for the source DC than the source itself does, the source can't decrypt it.&lt;/p&gt;

&lt;p&gt;Why the passwords drift: Microsoft's netdom article says "Each Windows-based computer maintains a machine account password history that contains the current and previous passwords that are used for the account," and "If the sequence of password changes exceeds two changes, the computers involved may not be able to communicate, and you may receive error messages." A DC that was offline, or couldn't replicate, while its partners changed passwords is the usual way to get there (our reading). Microsoft's replication article: "Replication failures can prevent domain controllers from having a current password value for domain controllers in a given domain."&lt;/p&gt;

&lt;p&gt;Find the KDC, close to the time of the failure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On the destination (or the client): which KDC does it find? /FORCE skips the cache
nltest /dsgetdc:contoso.com /kdc /force
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft: the &lt;code&gt;nltest /dsgetdc&lt;/code&gt; command "that's run at an elevated command prompt in close time proximity to a SEC_E_WRONG_PRINCIPAL error can be used to quickly identify which KDC a Kerberos client is targeting." The definitive answer is a network trace; Microsoft: "The definitive way to determine which domain controller a Kerberos client got a ticket from is to take a network trace."&lt;/p&gt;

&lt;p&gt;Then compare the source DC's password attributes as the source sees them and as that KDC sees them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. The source DC's computer account: on the source (DC1), then on the KDC the destination used (DC3). Names are examples
repadmin /showobjmeta DC1 "CN=DC1,OU=Domain Controllers,DC=contoso,DC=com"
repadmin /showobjmeta DC3 "CN=DC1,OU=Domain Controllers,DC=contoso,DC=com"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft: look "for obvious version number differences in password-related attributes (dBCSPwd, UnicodePWD, NtPwdHistory, PwdLastSet, lmPwdHistory)". The same comparison as a quick read across every DC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. PasswordLastSet for the source DC's account (DC1) as each DC currently holds it (the loop is ours)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DC1'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ADDomainController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Get-ADComputer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HostName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordLastSet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'AskedDC'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HostName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordLastSet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The KDC's copy has a lower version, or an older PasswordLastSet&lt;/td&gt;
&lt;td&gt;The KDC has the old password: Microsoft's top cause&lt;/td&gt;
&lt;td&gt;Step 10: Microsoft's KDC sequence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Several DCs hold the old value&lt;/td&gt;
&lt;td&gt;Inbound replication of the domain partition is failing to those DCs&lt;/td&gt;
&lt;td&gt;Fix replication to them first (the 1722 post if that's the code)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The source itself is the odd one out (newer locally than anywhere else)&lt;/td&gt;
&lt;td&gt;The source changed its password and couldn't replicate it out&lt;/td&gt;
&lt;td&gt;Step 10: &lt;code&gt;netdom resetpwd&lt;/code&gt; on the source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All copies match&lt;/td&gt;
&lt;td&gt;The password isn't the cause&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 5: Are the target's SPNs present, and on only one account? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft: "SPNs may be missing, invalid, or duplicated due to simple replication latency, especially following promotion, or replication failures." And: "Duplicate SPNs may cause bad SPN to name mappings." Microsoft's first resolution step for the replication error is a DCDIAG test that isn't run by default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On the console of each source DC that fails outbound replication with this error
dcdiag /test:checksecurityerror
:: Read-only. Add the partner check (DC2 is an example)
dcdiag /test:checksecurityerror /ReplSource:DC2.contoso.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft: "Run this command on the console of all source domain controllers that fail outbound replication with the SEC_E_WRONG_PRINCIPAL error." Per the dcdiag reference, the test checks that "at least one KDC is online for each domain and is reachable", that the DC's computer object has replicated to other DCs, and that the account "has the minimum required Service Principal Names (SPN) configured." With &lt;code&gt;/ReplSource&lt;/code&gt;, it also checks time skew: "The time skew calculated between the servers to verify it's less than 300 seconds (5 minutes) for Kerberos."&lt;/p&gt;

&lt;p&gt;Then read the SPNs directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. The SPNs registered on the DC's own computer account (DC1 is an example)
setspn -L DC1
:: Read-only. Which account holds a given SPN
setspn -Q HOST/DC1.contoso.com
:: Read-only. Search for duplicate SPNs, forest-wide (can take a while)
setspn -X -F
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From Microsoft's setspn reference: &lt;code&gt;-L&lt;/code&gt; "Lists the currently registered SPN for the computer.", &lt;code&gt;-Q&lt;/code&gt; "Queries for any existing SPNs.", &lt;code&gt;-X&lt;/code&gt; "Performs a search of duplicate SPNs.", and &lt;code&gt;-F&lt;/code&gt; "Performs queries at the forest, rather than domain level." (combining &lt;code&gt;-X&lt;/code&gt; with &lt;code&gt;-F&lt;/code&gt; is our form). Microsoft warns: "Searching for duplicates, especially forest-wide, can take a long time and lots of memory." Run it from one admin box, not every DC at once (our habit).&lt;/p&gt;

&lt;p&gt;The replication SPN in a DC's ticket request is the replication service UUID plus the source's NTDS Settings GUID, as in Microsoft's trace: &lt;code&gt;E3514235-4B06-11D1-AB04-00C04FC2DCD2/6f3f96d3-dfbf-4daf-9236-4d6da6909dd2/contoso.com&lt;/code&gt;. Microsoft: "If the source domain controller's SPN doesn't exist in the realm, you receive a KDC_ERR_S_PRINCIPAL_UNKNOWN error."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (Microsoft unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;checksecurityerror&lt;/code&gt; reports missing SPNs on a new DC&lt;/td&gt;
&lt;td&gt;Microsoft: replication latency "especially following promotion"&lt;/td&gt;
&lt;td&gt;Let replication finish, then re-run (our reading)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;setspn -Q&lt;/code&gt; returns two accounts for one SPN&lt;/td&gt;
&lt;td&gt;"One SPN can be associated with only one account."&lt;/td&gt;
&lt;td&gt;Step 10: remove it from the wrong one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A HOST/ or service SPN for a server sits on a user account&lt;/td&gt;
&lt;td&gt;Microsoft's Event 4 cause: "When the SPN is on the wrong account in Active Directory the secret that is used is the one of the accounts the SPN is on instead of the one of the servers."&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicates only across two forests&lt;/td&gt;
&lt;td&gt;"SPNs aren't required to be unique across forests, but duplicate SPNs can cause authentication issues during cross-forest authentication."&lt;/td&gt;
&lt;td&gt;Decide which forest should own it (our reading)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No duplicates, SPNs present&lt;/td&gt;
&lt;td&gt;SPNs aren't the cause&lt;/td&gt;
&lt;td&gt;Step 6 or Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Since Windows Server 2012 R2, Microsoft says DCs "block the creation of duplicate service principal names (SPN) and user principal names (UPN)", so new duplicates usually come from writes to older DCs or from before that (our reading). Microsoft's blocked-write error 8647 reads "The operation failed because SPN value provided for addition/modification isn't unique forest-wide."&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Read Kerberos Event 4 on the client (read-only)
&lt;/h2&gt;

&lt;p&gt;On member servers and clients, the error behind "target principal name" and "target account name" messages is usually a Kerberos Event 4 with KRB_AP_ERR_MODIFIED (our reading of Microsoft's Event 4 articles). Microsoft's Kerberos guidance: "Because more than one issue can cause this error, check for related events. For example, this string might mean that the client and target server clocks are out of sync, or that the SPN isn't unique." The current event text, from Microsoft's file-share article, names three causes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The SPN on the wrong account: "This can occur when the target server principal name (SPN) is registered on an account other than the account the target service is using."&lt;/li&gt;
&lt;li&gt;A password mismatch: "This error can also happen when the target service is using a different password for the target service account than what the Kerberos Key Distribution Center (KDC) has for the target service account."&lt;/li&gt;
&lt;li&gt;Two accounts with the same name: "If the server name is not fully qualified, and the target domain (DNS_prefix.dns_suffix) is different from the client domain (DNS_prefix.dns_suffix), check if there are identically named server accounts in these two domains, or use the fully-qualified name to identify the server."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read the two names in the message. Microsoft's example: "The kerberos client received a KRB_AP_ERR_MODIFIED error from the server host/machinename.childdomain.rootdomain.com. The target name used was cifs/machinename.domain.com." The first is the server that answered; the second is the SPN the client asked a ticket for (our reading).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only on the directory. On the client: who holds the SPN from "The target name used was", then ask for that ticket
setspn -Q cifs/FS01.contoso.com
klist get cifs/FS01.contoso.com
klist
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;klist get&lt;/code&gt; "Allows you to request a ticket to the target that is specified by the SPN." It adds a ticket to your cache; nothing changes in AD.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What the event shows&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The server that answered isn't the one in the target name&lt;/td&gt;
&lt;td&gt;The name resolved to another computer&lt;/td&gt;
&lt;td&gt;Step 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;setspn -Q&lt;/code&gt; returns an account other than the server's&lt;/td&gt;
&lt;td&gt;SPN on the wrong account (Microsoft's Event 4 cause)&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The server's own account holds the SPN, only once&lt;/td&gt;
&lt;td&gt;The server's password differs from the KDC's copy, or the clocks differ&lt;/td&gt;
&lt;td&gt;Steps 4 and 8, and for members the trust-relationship post&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Short name used, two domains in the forest&lt;/td&gt;
&lt;td&gt;Identically named accounts; Microsoft: "use the fully-qualified name"&lt;/td&gt;
&lt;td&gt;Test with the FQDN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Server 2012 R2 file server, Event 4 plus Event 1097&lt;/td&gt;
&lt;td&gt;Microsoft's 2012 R2 article: "the file server cannot decrypt the ticket that was encrypted in AES256"&lt;/td&gt;
&lt;td&gt;Microsoft's encryption-types policy fix, after reading the current setting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;None of these&lt;/td&gt;
&lt;td&gt;Microsoft: "Less commonly this is caused by network problems between client and server where the ticket is truncated."&lt;/td&gt;
&lt;td&gt;A simultaneous network trace (Microsoft's guidance)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 7: Is an alias (CNAME) involved? (read-only)
&lt;/h2&gt;

&lt;p&gt;The member-server version of this error often comes from a name the server doesn't own. Microsoft's SMB article: with a CNAME, &lt;code&gt;\\CNAME\share_name&lt;/code&gt; can fail with "Logon Failure: The target account name is incorrect." while the NetBIOS name and FQDN work. Microsoft's causes: "Configuration issue or SMB server service hardening issue." and "The service principal name (SPN) for the DNS alias (CNAME) record for the file share server is missing."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On the server (or with RSAT): which names does it own, and does each have a DNS record and an SPN? (FS01 is an example)
netdom computername FS01.contoso.com /enumerate:allnames
netdom computername FS01.contoso.com /verify
setspn -L FS01
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the client: what the alias resolves to (files.contoso.com is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'files.contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From Microsoft's netdom reference, &lt;code&gt;/verify&lt;/code&gt; "Checks if there's a DNS record and a service principal name (SPN) for each computer name." If the alias resolves through a CNAME and isn't in the &lt;code&gt;/enumerate&lt;/code&gt; list, and no SPN for it appears in &lt;code&gt;setspn -L&lt;/code&gt;, that's this case. Microsoft's fix is in Step 10. If the alias points at a cluster name or a NAS, the SPN belongs on that object's account instead (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Are time and the DC secure channel in order? (read-only)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time.&lt;/strong&gt; Microsoft's Kerberos guidance: "The difference in time between the domain controller and the client computer or the target server must be less than five minutes." A skew failure is logged as Event 4 with KERB_AP_ERR_SKEW (Microsoft's table), not MODIFIED, but check it while you're here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. Three samples of the offset from this DC to its partner (DC1 is an example)
w32tm /stripchart /computer:DC1.contoso.com /samples:3 /dataonly
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the offset is minutes, read &lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt; before you change any passwords.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The DC's secure channel.&lt;/strong&gt; Microsoft's article on this error during manual replication lists Netlogon events alongside it: 3210 ("Failed to authenticate with &lt;code&gt;\\DOMAINDC&lt;/code&gt;, a Windows NT domain controller for domain DOMAIN.") and 5722 ("The session setup from the computer 1 failed to authenticate."). On a DC, don't use &lt;code&gt;Test-ComputerSecureChannel&lt;/code&gt;. Microsoft: "This cmdlet only works on Domain Member computers. When you run it on Domain Controllers, it returns false positive errors. To verify and reset the secure channels for Domain Controllers, use netdom.exe or nltest.exe."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On the DC: state of its secure channel the last time it was used, and the PDC emulator
nltest /sc_query:contoso.com
netdom query fsmo
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/sc_query&lt;/code&gt; "Reports on the state of the secure channel the last time that you used it." Leave &lt;code&gt;nltest /sc_verify&lt;/code&gt; for later: Microsoft says if the channel doesn't work, "this parameter removes the existing channel, and then builds a new one." That's a change. For member servers and workstations, &lt;a href="https://dev.to/adminpackstudio/trust-relationship-between-this-workstation-and-the-primary-domain-failed-a-read-first-secure-ljo"&gt;Trust Relationship Between This Workstation and the Primary Domain Failed&lt;/a&gt; covers the member-side secure channel and machine password.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The machine password itself.&lt;/strong&gt; Microsoft's Directory Services blog: "Machine account passwords as such do not expire in Active Directory." And: "It is important to remember that machine account password changes are driven by the CLIENT (computer), and not the AD." So a DC that was offline for a month doesn't come back with an expired password; it comes back possibly behind on its partners' passwords, or with its own change not yet replicated (our reading, Step 4).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL Server.&lt;/strong&gt; If the message is "The target principal name is incorrect. Cannot generate SSPI context.", that's SQL Server's version. Microsoft: "In most cases, a misconfigured Service Principal Name (SPN) causes this error." The SQL side (service account, &lt;code&gt;MSSQLSvc&lt;/code&gt; SPNs, Kerberos Configuration Manager) is in &lt;a href="https://dev.to/adminpackstudio/sql-server-error-18456-login-failed-for-user-a-read-first-error-log-state-auth-mode-and-login-b3n"&gt;SQL Server Error 18456&lt;/a&gt;; Steps 3, 5, and 8 here still apply to the DCs behind it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: Is this a demotion? (read-only)
&lt;/h2&gt;

&lt;p&gt;A demotion has to replicate its last changes out and talk to a partner, so a DC that can't authenticate to its partners fails here too (our reading). Microsoft's DC deployment troubleshooting: "The built-in logs are the most important instrument for troubleshooting issues with domain controller promotion and demotion." Read them first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the DC that won't demote: the last 60 lines of each demotion log, then search them for the error (the Select-String filter is ours)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;SystemRoot&lt;/span&gt;&lt;span class="s2"&gt;\debug\dcpromoui.log"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Tail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;60&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;SystemRoot&lt;/span&gt;&lt;span class="s2"&gt;\debug\dcpromo.log"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Tail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;60&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Select-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;SystemRoot&lt;/span&gt;&lt;span class="s2"&gt;\debug\dcpromo*.log"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Pattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'target principal|2146893022|0x80090322'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft: "Examine the Dcpromoui.log and dcpromo.log for the errors shown in the output, then work backwards from them to see indications of why the failure occurred." Then run Steps 2-5 for this DC as a replication source: its outbound replication, its DNS records, its password versions, and &lt;code&gt;dcdiag /test:checksecurityerror&lt;/code&gt; on its console. If SYSVOL (DFS Replication) is what's failing during the demotion, &lt;a href="https://dev.to/adminpackstudio/dfs-replication-not-working-a-read-first-backlog-event-4012-dirty-shutdown-and-sysvol-triage-a5i"&gt;DFS Replication Not Working&lt;/a&gt; covers the DFSR side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forced removal.&lt;/strong&gt; Microsoft is direct about it: "Don't select this option unless the domain controller can't contact other domain controllers and there's no reasonable way to resolve that network issue." Also: "all unreplicated changes on that domain controller, such as passwords or new user accounts, are lost forever." And: "If you forcibly demote a domain controller, you must manually perform metadata cleanup immediately."&lt;/p&gt;

&lt;p&gt;A community answer in an archived TechNet forum thread on this exact failure: "I was able to get my DC to demote after stopping the KDC service. Then I reran the demotion with force removal and it completed successfully." That's a forced removal, with the metadata cleanup it requires (community, labeled). If the DC still replicates with anyone, fix the password or DNS link first (Step 10) and demote gracefully.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common false starts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What people try&lt;/th&gt;
&lt;th&gt;Why it misleads (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stopping the KDC on every DC&lt;/td&gt;
&lt;td&gt;Microsoft's sequence stops it on the destination, or on the DC whose password you reset. Its netdom article allows "on all domain controllers except one" only if needed; with every KDC stopped, nobody can get a ticket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forcing the demotion first&lt;/td&gt;
&lt;td&gt;Microsoft: forced removal is only for a DC that "can't contact other domain controllers"; it loses unreplicated changes and needs metadata cleanup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rejoining the file server&lt;/td&gt;
&lt;td&gt;Rejoining resets the computer's password, but doesn't move an SPN off another account or fix a CNAME. The Event 4 cause has to be read first (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;setspn -A&lt;/code&gt; to add the &lt;em&gt;missing&lt;/em&gt; SPN&lt;/td&gt;
&lt;td&gt;Microsoft: "you should use &lt;code&gt;setspn -S&lt;/code&gt; instead because it verifies that there are no duplicate SPNs." Adding a duplicate makes Event 4 worse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deleting SPNs from the DC's own account&lt;/td&gt;
&lt;td&gt;The DC needs its own SPNs; &lt;code&gt;dcdiag /test:checksecurityerror&lt;/code&gt; checks for "the minimum required Service Principal Names (SPN)"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A hosts-file entry to "pin" the partner&lt;/td&gt;
&lt;td&gt;Microsoft lists stale hosts entries as a cause and says to remove them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connecting by IP address and calling it fixed&lt;/td&gt;
&lt;td&gt;Usually works because Kerberos isn't used, which hides the broken link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;nltest /sc_verify&lt;/code&gt; or &lt;code&gt;/sc_reset&lt;/code&gt; as a check&lt;/td&gt;
&lt;td&gt;Both can rebuild the channel; &lt;code&gt;/sc_query&lt;/code&gt; is the read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;klist purge&lt;/code&gt; everywhere&lt;/td&gt;
&lt;td&gt;Microsoft: "Purging tickets destroys all tickets that you have cached, so use this attribute with caution." Purge the one logon session you're testing (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 10: Change one link, then prove it
&lt;/h2&gt;

&lt;p&gt;Only after Steps 1-9 agree on which link failed. Write down the current state first: the &lt;code&gt;repadmin /showrepl * /csv&lt;/code&gt; output from Step 2, the &lt;code&gt;setspn -L&lt;/code&gt; output for every account you're about to touch, and the &lt;code&gt;repadmin /showobjmeta&lt;/code&gt; pair from Step 4 (our habit). An SPN you delete by mistake is easy to put back only if you saved the list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong name-to-IP (Step 3).&lt;/strong&gt; Fix the record, not the client. Delete the stale or duplicate A record on the DNS server, or the hosts entry, then clear the caches on the destination. Microsoft's steps: &lt;code&gt;IPCONFIG /FLUSHDNS&lt;/code&gt; to "Clear the DNS Client cache", and "Run Nbtstat -R (upper case R) to refresh the NetBIOS name cache." If scavenging should have removed the record, &lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt; covers why it didn't.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Change (low risk). On the destination DC, after the record or hosts entry is fixed
ipconfig /flushdns
nbtstat -R
klist -li 0x3e7 purge
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft: "Kerberos tickets for the system account that are used by Active Directory replication can be purged without a restart by using KLIST -li 0x3e7 purge."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KDC holding an old password for the source (Step 4).&lt;/strong&gt; Microsoft's top resolution, on the destination DC: disable its KDC so it gets a ticket from another DC, restart, replicate from the source, then put the KDC back. Microsoft: "Domain controllers can be made to use other domain controllers by stopping the KDC service on a local or remote domain controller."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change, on the DESTINATION DC (BR-DC2). Microsoft's sequence; dry-run the startup change first&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;KDC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-StartupType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Disabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WhatIf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# ...restart the destination DC, then replicate from the source. Microsoft's form, run against the destination:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;#    repadmin /replicate BR-DC2.contoso.com DC1.contoso.com "DC=contoso,DC=com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;KDC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-StartupType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Automatic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WhatIf&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c"&gt;# Microsoft's article writes Auto; Set-Service documents Automatic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;KDC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WhatIf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remove &lt;code&gt;-WhatIf&lt;/code&gt; when the dry run shows the service you meant. Microsoft: "If it doesn't resolve the issue, see the Resolution section for an alternative solution in which you use the netdom resetpwd command to reset the computer account password of the source domain controller."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The source DC's own password (Step 4).&lt;/strong&gt; Run this on the DC whose password is wrong; Microsoft: "This command must be run on the DC whose machine account password you wish to reset." Microsoft's manual-replication article resets it against the PDC emulator, so find that first. Microsoft: "If you want to reset the password for a Windows domain controller, you must stop the Kerberos Key Distribution Center service and set its startup type to Manual."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;:: Change, on the DC whose password is wrong (DC1). PDC01 is the PDC emulator from netdom query fsmo;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;names are examples
&lt;span class="go"&gt;netdom query fsmo
sc config KDC start= demand
net stop KDC
klist -li 0x3e7 purge
netdom resetpwd /server:PDC01 /userd:contoso\admin.user /passwordd:*
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;demand&lt;/code&gt; is the &lt;code&gt;sc config&lt;/code&gt; value for a manual start, from Microsoft's sc config reference. Then Microsoft: "Restart the server whose password was changed." After the restart, start the KDC and set it back to Automatic (&lt;code&gt;sc config KDC start= auto&lt;/code&gt;, then &lt;code&gt;net start KDC&lt;/code&gt;). If you run &lt;code&gt;netdom resetpwd&lt;/code&gt; on the PDC emulator itself, point &lt;code&gt;/server:&lt;/code&gt; at another healthy DC (our reading of Microsoft's "the name of the domain controller to use for setting the machine account password").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPN on the wrong account, or duplicated (Steps 5 and 6).&lt;/strong&gt; Microsoft's three commands, in order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Change. Find, remove from the wrong account, add to the right one (SPN and account names are examples)
setspn -Q cifs/FS01.contoso.com
setspn -D cifs/FS01.contoso.com OLD-FS01
setspn -S cifs/FS01.contoso.com FS01
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's Event 4 article runs these "using Enterprise Administrator credentials". Use &lt;code&gt;-S&lt;/code&gt;, not &lt;code&gt;-A&lt;/code&gt;; Microsoft says Setspn.exe has had "duplicate SPN detection built-in to it since the Windows Server 2008 release" with the &lt;code&gt;-S&lt;/code&gt; option. If the right account is a service account rather than the computer, add it there instead; Microsoft: "If the SPN is assigned to any account other than the correct service account (custom account or computer account), remove the SPN from those accounts."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alias without an SPN (Step 7).&lt;/strong&gt; Microsoft: "avoid using the DNS CNAME to configure the file server's alternative name." Add the alias to the server's own account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;:: Change, on the file server (elevated). Then verify;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;remove the old CNAME only after clients work by the &lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;our habit&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;netdom computername FS01.contoso.com /add:files.contoso.com
netdom computername FS01.contoso.com /verify
setspn -L FS01
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Per Microsoft's Core Infrastructure blog post on aliases, the command will "register the DNS A record, register additional SPNs, and add OptionalNames registry key." If the old CNAME stays in DNS, clients may keep using it, so plan its removal (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The demotion (Step 9).&lt;/strong&gt; Fix the password or DNS link above, confirm the DC replicates outbound, then demote normally. A forced removal (&lt;code&gt;Uninstall-ADDSDomainController -ForceRemoval -DemoteOperationMasterRole&lt;/code&gt;) is only for a DC that truly can't reach a partner. Microsoft: "Metadata cleanup is a required procedure after a forced removal of Active Directory Domain Services (AD DS)." Microsoft's console route deletes the old DC's computer object in Active Directory Users and Computers with &lt;strong&gt;This Domain Controller is permanently offline and can no longer be demoted using the Active Directory Domain Services Installation Wizard (DCPROMO)&lt;/strong&gt; selected. Then delete its stale DNS records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then prove it.&lt;/strong&gt; For replication, one destination, one source, one partition. Microsoft's article on diagnosing replication lists "Time accuracy within 5 minutes to support Kerberos authentication" among its dependencies, so run the Step 8 time read again if you changed anything near the clocks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-mostly. Trigger one inbound replication, then re-read status (names and partition are examples)
repadmin /replicate BR-DC2.contoso.com DC1.contoso.com "DC=contoso,DC=com"
repadmin /showrepl BR-DC2.contoso.com
dcdiag /test:checksecurityerror /ReplSource:DC1.contoso.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a member server, purge only your own tickets, connect by the same name that failed, and look for the new service ticket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Low-risk. On the client, in the user's own session
klist purge
dir \\files.contoso.com\share
klist
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pass is a successful replication with no new -2146893022 in &lt;code&gt;/showrepl&lt;/code&gt;, or a share that opens by the alias with a &lt;code&gt;cifs/&lt;/code&gt; ticket listed by &lt;code&gt;klist&lt;/code&gt; and no new Event 4 (Step 2's read). Then the next pair, or the next client, since a destination that pulled from one source can still hold a bad ticket for another (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  When a change is justified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The source's name resolves to another computer&lt;/td&gt;
&lt;td&gt;Fix the DNS record or hosts entry, flush, purge the system tickets&lt;/td&gt;
&lt;td&gt;A hosts entry pinning a new IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KDC holds an old password for the source&lt;/td&gt;
&lt;td&gt;Microsoft's KDC sequence on the destination&lt;/td&gt;
&lt;td&gt;Stopping the KDC on every DC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The source's own password is wrong&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;netdom resetpwd&lt;/code&gt; on that DC against the PDC emulator&lt;/td&gt;
&lt;td&gt;Rebuilding the DC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SPN on the wrong account or duplicated&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;setspn -D&lt;/code&gt; from the wrong account, &lt;code&gt;setspn -S&lt;/code&gt; on the right one&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;setspn -A&lt;/code&gt;, or deleting a DC's own SPNs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alias with no SPN&lt;/td&gt;
&lt;td&gt;&lt;code&gt;netdom computername /add&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;DisableStrictNameChecking&lt;/code&gt; and manual SPN edits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Demotion fails while replication still works&lt;/td&gt;
&lt;td&gt;Fix the link, then a graceful demotion&lt;/td&gt;
&lt;td&gt;Forced removal without metadata cleanup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2012 R2 file server can't decrypt AES tickets&lt;/td&gt;
&lt;td&gt;Microsoft's encryption-types policy fix for that version&lt;/td&gt;
&lt;td&gt;Disabling AES across the domain&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does "The target principal name is incorrect" mean?&lt;/strong&gt;&lt;br&gt;
A computer received a Kerberos ticket it couldn't decrypt. Microsoft's top cause in AD replication: "the KDC has an old version of the password for the source domain controller." The other causes Microsoft lists are a bad name-to-IP mapping (the ticket went to the wrong computer), an SPN the KDC couldn't find or found on the wrong account, and frames modified in transit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is error -2146893022 (0x80090322)?&lt;/strong&gt;&lt;br&gt;
It's SEC_E_WRONG_PRINCIPAL, the code behind "The target principal name is incorrect." Microsoft: it "isn't an Active Directory error" and can come from RPC, Kerberos, SSL, LSA, or NTLM. In replication, Microsoft's article shows it remapped from the Kerberos errors KRB_AP_ERR_MODIFIED or KRB_AP_ERR_NOT_US.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I find duplicate SPNs?&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;setspn -Q &amp;lt;SPN&amp;gt;&lt;/code&gt; shows which account holds one SPN; &lt;code&gt;setspn -X&lt;/code&gt; searches for duplicates (add &lt;code&gt;-F&lt;/code&gt; for the whole forest). On DCs, KDC Event 11 reports multiple accounts with the same name, and Event 2974 reports a blocked attempt to add a duplicate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I stop the KDC on every domain controller?&lt;/strong&gt;&lt;br&gt;
No. Microsoft's top resolution disables the KDC on the destination DC only, restarts it, replicates, and turns it back on. Its netdom article allows stopping the KDC "on all domain controllers except one" only if needed. With none running, no one in the domain can get a ticket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this the same as SQL Server's "Cannot generate SSPI context"?&lt;/strong&gt;&lt;br&gt;
Same family. SQL Server shows "The target principal name is incorrect. Cannot generate SSPI context." and Microsoft says a misconfigured SPN causes it in most cases. Start with the SQL Server post for the service account side; the DNS, SPN, and time steps here still apply.&lt;/p&gt;




&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;AD Replication Error 1722&lt;/a&gt; (the sibling when no connection was made: DNS, RPC ports, firewalls, NICs)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/sql-server-error-18456-login-failed-for-user-a-read-first-error-log-state-auth-mode-and-login-b3n"&gt;SQL Server Error 18456&lt;/a&gt; (SQL SPNs, service accounts, and "Cannot generate SSPI context")&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt; (the stale A records that send a ticket to the wrong computer)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/netlogon-event-id-5719-a-read-first-boot-timing-dns-dc-locator-and-site-triage-3j2a"&gt;Netlogon Event ID 5719&lt;/a&gt; (when a computer can't find a domain controller at all)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt; (the five-minute Kerberos clock limit)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/trust-relationship-between-this-workstation-and-the-primary-domain-failed-a-read-first-secure-ljo"&gt;Trust Relationship Between This Workstation and the Primary Domain Failed&lt;/a&gt; (the member-side secure channel and machine password)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/dfs-replication-not-working-a-read-first-backlog-event-4012-dirty-shutdown-and-sysvol-triage-a5i"&gt;DFS Replication Not Working&lt;/a&gt; (SYSVOL replication, including during a demotion)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free checklist
&lt;/h2&gt;

&lt;p&gt;Stopping the KDC on every domain controller before anyone read which DC issued the bad ticket is a change made everywhere at once. So is a Conditional Access policy enforced before anyone read the report-only results. The free &lt;strong&gt;Conditional Access pre-enforcement checklist&lt;/strong&gt; keeps break-glass accounts, pilot groups, and report-only review on one page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=target-principal-name-is-incorrect" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=target-principal-name-is-incorrect&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the &lt;strong&gt;Intune &amp;amp; M365 Admin Starter Pack&lt;/strong&gt; pairs with this triage: &lt;a href="https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=target-principal-name-is-incorrect" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=target-principal-name-is-incorrect&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Admin Pack Studio; not affiliated with Microsoft. Steps 1-9 favor read-only checks: &lt;code&gt;repadmin /showrepl&lt;/code&gt;, &lt;code&gt;/showreps&lt;/code&gt;, and &lt;code&gt;/showobjmeta&lt;/code&gt;, &lt;code&gt;dcdiag /test:checksecurityerror&lt;/code&gt;, &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;ipconfig /all&lt;/code&gt;, &lt;code&gt;nslookup&lt;/code&gt;, &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;Select-String&lt;/code&gt;, &lt;code&gt;nltest /dsgetdc&lt;/code&gt; and &lt;code&gt;/sc_query&lt;/code&gt;, &lt;code&gt;Get-ADDomainController&lt;/code&gt;, &lt;code&gt;Get-ADComputer&lt;/code&gt;, &lt;code&gt;setspn -L&lt;/code&gt;, &lt;code&gt;-Q&lt;/code&gt;, and &lt;code&gt;-X&lt;/code&gt;, &lt;code&gt;klist&lt;/code&gt;, &lt;code&gt;netdom computername /enumerate&lt;/code&gt; and &lt;code&gt;/verify&lt;/code&gt;, &lt;code&gt;netdom query fsmo&lt;/code&gt;, &lt;code&gt;w32tm /stripchart&lt;/code&gt;, and &lt;code&gt;Get-Content&lt;/code&gt; on the demotion logs. &lt;code&gt;klist get&lt;/code&gt; adds a ticket to your own cache. Fixing DNS records and hosts entries, flushing caches, purging tickets, disabling or stopping the KDC, &lt;code&gt;netdom resetpwd&lt;/code&gt;, &lt;code&gt;setspn -D&lt;/code&gt; and &lt;code&gt;-S&lt;/code&gt;, &lt;code&gt;netdom computername /add&lt;/code&gt;, &lt;code&gt;nltest /sc_verify&lt;/code&gt; and &lt;code&gt;/sc_reset&lt;/code&gt;, demotion, forced removal, and metadata cleanup are deliberate changes. Change one link at a time, test from the failing pair or client, and check current Microsoft Learn for version-specific behavior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windowsserver</category>
      <category>activedirectory</category>
      <category>sysadmin</category>
      <category>security</category>
    </item>
    <item>
      <title>NPS Event 6273 Reason Code 16 or 22: A Read-First Policy, EAP Type, Certificate, and Account Triage</title>
      <dc:creator>AdminPackStudio</dc:creator>
      <pubDate>Sun, 18 Oct 2026 22:41:05 +0000</pubDate>
      <link>https://dev.to/adminpackstudio/nps-event-6273-reason-code-16-or-22-a-read-first-policy-eap-type-certificate-and-account-triage-26i6</link>
      <guid>https://dev.to/adminpackstudio/nps-event-6273-reason-code-16-or-22-a-read-first-policy-eap-type-certificate-and-account-triage-26i6</guid>
      <description>&lt;p&gt;Helpdesk: "Since the patch weekend, about a third of the laptops can't join the CORP-SECURE Wi-Fi, and some new Always On VPN users get rejected too. The NPS server's Security log is full of Event 6273. Most say reason code 16, a few say reason code 22. The users swear their passwords are right, and half of them don't even type one. A forum post says to tick Ignore user account dial-in properties, add a policy that accepts users without validating credentials until it's sorted, and reissue the NPS certificate. Can we start with that?"&lt;/p&gt;

&lt;p&gt;Not yet. &lt;strong&gt;Event 6273 doesn't mean NPS is broken. It means NPS received the request, ran it through its policies, and refused it, and the event itself records which policy, which EAP type, and which reason.&lt;/strong&gt; Microsoft's Event 6273 message is "Network Policy Server denied access to a user." Reason code 16 is "Authentication failed due to a user credentials mismatch. Either the user name provided does not match an existing user account or the password was incorrect." Reason code 22 is "Network Policy Server was unable to negotiate the use of an Extensible Authentication Protocol (EAP) type with the client computer." Neither one says the password was wrong for certain. Reason 16 also shows up when a certificate can't be mapped to an account, and reason 22 shows up when the client and the policy never agreed on a method, often because of the NPS server's own certificate (our reading, Steps 4 and 6). Ignoring dial-in properties doesn't touch either of those, and an accept-without-credentials policy opens the network to everyone. Work through it as a chain: &lt;strong&gt;which network, which users or devices, since when&lt;/strong&gt; → &lt;strong&gt;is NPS auditing on, and is it 6273 or something else?&lt;/strong&gt; → &lt;strong&gt;read one 6273 end to end (policy names, authentication type, EAP type, account, reason)&lt;/strong&gt; → &lt;strong&gt;reason 22: did the client and the policy agree on an EAP type, and is the NPS server certificate valid and bound?&lt;/strong&gt; → &lt;strong&gt;reason 16 with passwords: is the account real, unlocked, and reachable on a DC?&lt;/strong&gt; → &lt;strong&gt;reason 16 with certificates: does the certificate map to the account (strong mapping since February 2025)?&lt;/strong&gt; → &lt;strong&gt;does the request reach the policy you think it does?&lt;/strong&gt; → &lt;strong&gt;is the NPS server itself registered, logging, and healthy?&lt;/strong&gt; &lt;code&gt;auditpol&lt;/code&gt;, &lt;code&gt;Get-WinEvent&lt;/code&gt;, the NPS accounting log, &lt;code&gt;Get-ADUser&lt;/code&gt;, the certificate store, and &lt;code&gt;certutil&lt;/code&gt; are the sources for that chain. Accept everyone and you'll be finding out later which devices got on while it was open.&lt;/p&gt;

&lt;p&gt;If the Wi-Fi or VPN profile never reached the device, &lt;a href="https://dev.to/adminpackstudio/intune-wi-fi-profile-not-applying-a-read-first-assignment-and-eap-triage-d1"&gt;Intune Wi-Fi Profile Not Applying&lt;/a&gt; starts earlier in the chain. If the rejections began when a CRL expired or a CA changed, &lt;a href="https://dev.to/adminpackstudio/revocation-server-was-offline-0x80092013-a-read-first-crl-cdp-cache-and-offline-root-triage-59pf"&gt;Revocation Server Was Offline&lt;/a&gt; reads the chain first. This post covers &lt;strong&gt;"NPS (Network Policy Server) on Windows Server rejects 802.1X Wi-Fi, wired 802.1X, or VPN connections with Event 6273 and reason code 16 or 22, and you need a read-first path before you loosen policies, accept unauthenticated users, roll back security updates, or reissue every certificate."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The event names the policy that rejected the request.&lt;/strong&gt; Microsoft's 802.1X guide: "NPS event log entries contain information about the connection attempt, including the name of the connection request policy that matched the connection attempt and the network policy that accepted or rejected the connection attempt." (Step 3).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password or certificate decides which reason-16 path you take.&lt;/strong&gt; Microsoft's 6273 page: "Use the information provided in Event Viewer to determine whether the authentication method that applies to the user connection is password- or certificate-based." (Steps 5 and 6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reason 22 is often the NPS server certificate.&lt;/strong&gt; Microsoft: "In Network Policy Server (NPS) on Windows Server, the server certificate that you bind to a network policy isn't updated automatically when it expires." (Step 4).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certificate users rejected since early 2025 need a strong mapping.&lt;/strong&gt; Microsoft's KB5014754 on Full Enforcement mode: "Authentication will be denied if a certificate cannot be strongly mapped." (Step 6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policies are an ordered list.&lt;/strong&gt; Microsoft: "NPS checks each connection request against the first rule in the list, then the second, and so on, until a match is found." (Step 7).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certificates are the usual 802.1X break.&lt;/strong&gt; Microsoft: "Most 802.1X authentication issues are because of problems with the certificate that's used for client or server authentication." (Steps 4, 6, 9).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where in the chain did it break?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What should be true&lt;/th&gt;
&lt;th&gt;Typical symptom when it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Symptom captured&lt;/td&gt;
&lt;td&gt;Which network, which NAS, which users or devices, since when&lt;/td&gt;
&lt;td&gt;"The Wi-Fi is broken" with no event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Auditing and events&lt;/td&gt;
&lt;td&gt;NPS auditing on; the failure is a 6273, not 13, 18, or 6274&lt;/td&gt;
&lt;td&gt;No events at all, or the wrong event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. One 6273 read&lt;/td&gt;
&lt;td&gt;Policy names, authentication type, EAP type, account, reason known&lt;/td&gt;
&lt;td&gt;Reason code read, nothing else&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. EAP type agreed (22)&lt;/td&gt;
&lt;td&gt;Client and policy offer the same method; NPS server certificate valid and bound&lt;/td&gt;
&lt;td&gt;PEAP on clients, EAP-TLS only in the policy, or an expired NPS certificate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Password account (16)&lt;/td&gt;
&lt;td&gt;Account exists, is enabled, unlocked, and a DC can check it&lt;/td&gt;
&lt;td&gt;Locked account, stale saved password, wrong domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Certificate account (16)&lt;/td&gt;
&lt;td&gt;Client certificate valid, right EKU and SAN, strongly mapped&lt;/td&gt;
&lt;td&gt;Certificates issued before strong mapping, rejected since the DC update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Policy match&lt;/td&gt;
&lt;td&gt;The intended connection request and network policy match first&lt;/td&gt;
&lt;td&gt;An older, broader policy higher in the list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. NPS server&lt;/td&gt;
&lt;td&gt;Registered in AD, logging works, service and extensions healthy&lt;/td&gt;
&lt;td&gt;NPS not in RAS and IAS Servers, log disk full, MFA extension rejecting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Other reason codes&lt;/td&gt;
&lt;td&gt;You know what the code in front of you means&lt;/td&gt;
&lt;td&gt;16 and 22 fixes applied to a 265 or a 48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Change&lt;/td&gt;
&lt;td&gt;Only after Steps 1-9 agree: one link, one change&lt;/td&gt;
&lt;td&gt;Accept-everyone policy, same broken mapping&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1: Capture the symptom (read-only)
&lt;/h2&gt;

&lt;p&gt;Write these on the ticket first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which network&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One SSID, one wired switch, or the VPN points at one NAS and its RADIUS client entry in NPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which users or devices, and how many&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One user is an account; every user on one method is the policy, the certificate, or the server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User or computer authentication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wi-Fi often authenticates the computer first; the event's account name shows which (Step 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which method you expect&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PEAP-MS-CHAP v2 (password), PEAP-TLS or EAP-TLS (certificate)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which NPS servers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Two NPS servers behind one SSID can have different certificates and policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Since when, and what changed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Patch night on DCs or NPS, NPS certificate renewal, new CA, Windows 11 upgrade, Intune profile change, new switch or controller&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then branch on what you see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it usually means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reason 16 for everyone on certificate authentication since DC patching&lt;/td&gt;
&lt;td&gt;Certificates without a strong mapping, now enforced&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reason 16 for a few users on PEAP-MS-CHAP v2&lt;/td&gt;
&lt;td&gt;Wrong or stale password, locked or disabled account&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reason 16 for computer accounts (host/...)&lt;/td&gt;
&lt;td&gt;Machine password or account problem on those devices&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reason 22 for every client since a certain date&lt;/td&gt;
&lt;td&gt;NPS server certificate expired or replaced, or a policy method changed&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reason 22 for one device type (Macs, phones, a new image)&lt;/td&gt;
&lt;td&gt;That client offers a method or TLS version the policy doesn't&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password prompts on Windows 11 after an upgrade, then 16 or 22&lt;/td&gt;
&lt;td&gt;Credential Guard blocking saved MS-CHAP v2 sign-in&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No 6273 at all, users still fail&lt;/td&gt;
&lt;td&gt;Request never reached NPS, or auditing is off&lt;/td&gt;
&lt;td&gt;Step 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A different reason code&lt;/td&gt;
&lt;td&gt;Look it up first&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2: Confirm auditing, then find the events (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's NPS troubleshooting checklist starts with the audit policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On each NPS server: is the Network Policy Server audit subcategory on?
auditpol /get /subcategory:"Network Policy Server"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft says auditing is on when that shows Success and Failure, or Failure. If it shows No Auditing, the fix is Microsoft's &lt;code&gt;auditpol /set&lt;/code&gt; line in Step 10, and Microsoft adds: "Even if audit policy appears to be fully enabled, it sometimes helps to disable and then re-enable this setting." Microsoft's audit page notes "This subcategory generates events only if NAS or IAS role is installed on the server."&lt;/p&gt;

&lt;p&gt;The events live in the Security log on the NPS server, from Microsoft-Windows-Security-Auditing (Microsoft's 6273 event details). Microsoft's checklist: "Check for events that have Event ID 6273 or 6274. Most authentication failures produce these events." And: "Check the reason codes of the authentication failure events. The reason code indicates the cause of the failure."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the NPS server: the last 24 hours of NPS denials, grouped by reason code, policy, and EAP type&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# (field labels from Microsoft's 6273 event template; the regex parsing is ours)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$since&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddHours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;-24&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$denied&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6273&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$since&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pscustomobject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nx"&gt;Time&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nx"&gt;Account&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Account Name:\s+(.+)'&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$Matches&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;NetworkPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Network Policy Name:\s+(.+)'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$Matches&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;ProxyPolicy&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Proxy Policy Name:\s+(.+)'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$Matches&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;AuthType&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Authentication Type:\s+(.+)'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$Matches&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;EapType&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'EAP Type:\s+(.+)'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$Matches&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;RadiusClient&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Client Friendly Name:\s+(.+)'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$Matches&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;ReasonCode&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Reason Code:\s+(\d+)'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="bp"&gt;$Matches&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$denied&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Group-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ReasonCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NetworkPolicy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;EapType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NoElement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Account Name&lt;/code&gt; appears twice in the event (user and client machine); the first match is the user section (our reading of Microsoft's template). If one reason and one policy dominate, that's your chain. If the codes are spread out, take one user at a time.&lt;/p&gt;

&lt;p&gt;The neighbors of 6273, each from Microsoft's audit page or NPS troubleshooting guidance:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Microsoft's text&lt;/th&gt;
&lt;th&gt;What it tells you (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6272&lt;/td&gt;
&lt;td&gt;"Network Policy Server granted access to a user."&lt;/td&gt;
&lt;td&gt;The success to compare against (Step 10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6273&lt;/td&gt;
&lt;td&gt;"Network Policy Server denied access to a user."&lt;/td&gt;
&lt;td&gt;This post&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6274&lt;/td&gt;
&lt;td&gt;"Network Policy Server discarded the request for a user."&lt;/td&gt;
&lt;td&gt;Microsoft lists it with 6273 for most failures; read its reason code the same way&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6279&lt;/td&gt;
&lt;td&gt;"Network Policy Server locked the user account due to repeated failed authentication attempts."&lt;/td&gt;
&lt;td&gt;NPS's own remote access lockout (reason 64, Step 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;A RADIUS message from an invalid RADIUS client IP&lt;/td&gt;
&lt;td&gt;Microsoft: "The NPS event log records this event when the NPS server receives a message from a radius client that isn't on the configured list of radius clients." No 6273 is written for those&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;Message authenticator not valid&lt;/td&gt;
&lt;td&gt;Microsoft: "The NPS event log records this event when authentication fails because the shared secret key of the radius client doesn't match the shared secret key of the NPS server."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Events 13 and 18 are in the System log (Microsoft's NPS troubleshooting guidance lists them as NPS events; the log is our reading). If neither 6273 nor 13 nor 18 appears while users fail, the request may not be reaching this server. Microsoft: "By default, NPS sends and receives RADIUS traffic by using User Datagram Protocol (UDP) ports 1812, 1813, 1645, and 1646."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the NPS server: is NPS listening on the RADIUS ports, and which NPS servers does the NAS point at?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetUDPEndpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1812&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1813&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1645&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1646&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OwningProcess&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NpsRadiusClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Get-NpsRadiusClient&lt;/code&gt; "gets Remote Authentication Dial-In User Service (RADIUS) clients." Check that the access point, controller, switch, or VPN server sending the request is in the list with the address it actually uses (Microsoft's checklist item: "The RADIUS Clients and Servers list includes the radius client in question.").&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Read one 6273 end to end (read-only)
&lt;/h2&gt;

&lt;p&gt;The reason code is one field out of more than twenty. Microsoft's 802.1X guide: "In the event message, scroll to the bottom, and then check the Reason Code field and the text that's associated with it." Read the rest of the event first, for one user who is failing right now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the NPS server: the newest 6273 for one account (the name is an example), full message&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6273&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'jdoe'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fields, in the order Microsoft's event template lists them, and what each one decides:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Section and field&lt;/th&gt;
&lt;th&gt;What to read (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;User: Account Name, Account Domain&lt;/td&gt;
&lt;td&gt;A &lt;code&gt;DOMAIN\user&lt;/code&gt; or UPN is a user logon; a &lt;code&gt;host/&lt;/code&gt; name is the computer authenticating (Step 5). A blank or odd domain points at the client's identity setting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client Machine: Calling Station Identifier&lt;/td&gt;
&lt;td&gt;Microsoft: "In 802.1x authentications the MAC Address is typically populated and can be matched from the client." It ties the event to one device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAS: NAS IPv4 Address, NAS Identifier, NAS Port-Type&lt;/td&gt;
&lt;td&gt;Which access point, switch, or VPN server sent it, and the media type the policy's NAS Port Type condition compares&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RADIUS Client: Client Friendly Name, Client IP Address&lt;/td&gt;
&lt;td&gt;The RADIUS client entry that matched (Step 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication Details: Proxy Policy Name&lt;/td&gt;
&lt;td&gt;The connection request policy that matched (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication Details: Network Policy Name&lt;/td&gt;
&lt;td&gt;The network policy that rejected it. Not the one you expected means Step 7 first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication Details: Authentication Type, EAP Type&lt;/td&gt;
&lt;td&gt;What the client actually used: PEAP or EAP, and the inner type. Compare with Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication Details: Authentication Server&lt;/td&gt;
&lt;td&gt;Which server did the authentication: this NPS, or a remote RADIUS server if the request was forwarded (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reason Code, Reason&lt;/td&gt;
&lt;td&gt;Read last, with the fields above already known&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things trip people up here. The reason text in current events can differ from Microsoft's 2008-era reason-code table: a 2024 Microsoft Q&amp;amp;A post quotes the reason 22 text as "The client could not be authenticated because the Extensible Authentication Protocol (EAP) Type cannot be processed by the server." Same code, same meaning. And a 6273 that names an unexpected network policy is a policy-order problem before it's a credential problem, whatever the code says (our reading).&lt;/p&gt;

&lt;p&gt;Then the accounting log, which records every request and response, not only failures. Microsoft's Always On VPN guide: "NPS creates and stores the NPS accounting logs." Microsoft's accounting page: "The default location is the systemroot\System32\LogFiles folder." The file names start with IN (Microsoft's Always On VPN page shows the naming).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the NPS server: the newest accounting log files, then every line for one account&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$logs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;windir&lt;/span&gt;&lt;span class="s2"&gt;\System32\LogFiles"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'IN*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastWriteTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Last&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$logs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastWriteTime&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$logs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Pattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'jdoe'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Last&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Line&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's Always On VPN page lists the database-format fields, including &lt;code&gt;Packet-Type&lt;/code&gt;, &lt;code&gt;User-Name&lt;/code&gt;, &lt;code&gt;Calling-Station-ID&lt;/code&gt;, &lt;code&gt;NAS-IP-Address&lt;/code&gt;, &lt;code&gt;Client-Friendly-Name&lt;/code&gt;, &lt;code&gt;Authentication-Type&lt;/code&gt;, &lt;code&gt;Policy-Name&lt;/code&gt;, and &lt;code&gt;Reason-Code&lt;/code&gt;. If your server writes the DTS Compliant (XML) format, the same names appear as elements (our reading of Microsoft's accounting page). Microsoft on the log: "The NPS logs can help you diagnose policy-related issues." A request with no response line at all, or nothing in the log for that user, sends you back to Step 2 (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: For reason 22, did the client and the policy agree on an EAP type? (read-only)
&lt;/h2&gt;

&lt;p&gt;Reason 22 means the EAP conversation never got as far as the account. Three things decide it: which method the client offers, which methods the matching policy allows, and whether the NPS server can present a usable certificate for that method (our reading of Microsoft's reason-code and certificate pages).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The policy side.&lt;/strong&gt; Microsoft's checklist item: "The network policy constraints list the correct authentication method." In the NPS console that's the policy's &lt;strong&gt;Constraints&lt;/strong&gt; tab, &lt;strong&gt;Authentication Methods&lt;/strong&gt;, &lt;strong&gt;EAP Types&lt;/strong&gt;. A Microsoft-moderated answer on a 2018 reason 22 thread (community): "Please make sure you have selected PEAP-MSCHAPv2; not MSCHAPv2 as a supported authentication method in your NPS policy." Microsoft's Always On VPN page describes the same mismatch from the client side, for error 812: "You typically encounter this error when the NPS specified an authentication condition the client can't meet."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The client side.&lt;/strong&gt; On a failing Windows client, the WLAN or Wired AutoConfig log shows the method and the reason Windows gave up. Microsoft: "On the client side, go to Event Viewer (Local)\Applications and Services Logs\Microsoft\Windows\WLAN-AutoConfig/Operational for wireless issues."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On a failing Windows client: the newest WLAN AutoConfig events (wired: Microsoft-Windows-Wired-AutoConfig/Operational)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Microsoft-Windows-WLAN-AutoConfig/Operational'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LevelDisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the EAP method the client used and compare it with the 6273's Authentication Type and EAP Type and the policy's list. PEAP on the client with only "Smart card or other certificate" in the policy, or EAP-TLS on the client with only PEAP in the policy, is a reason 22 by design (our reading). Microsoft also warns not to offer the same inner method both tunneled and untunneled: "When you deploy both a tunneled EAP method and EAP (which isn't protected), don't use the same authentication type."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The NPS server certificate.&lt;/strong&gt; PEAP-MS-CHAP v2 needs one too. Microsoft: "With PEAP-MS-CHAP v2, PEAP-TLS, or EAP-TLS as the authentication method, the NPS must use a server certificate that meets the minimum server certificate requirements." And the part that breaks things on renewal day: "When the certificate applied to a policy expires, an administrator must manually update each policy that uses certificate-based authentication to reference a new, non-expired certificate. Until you update the policy, clients that rely on that policy can't successfully authenticate." Microsoft adds that this manual step "isn't required on NPS servers configured for certificate autoenrollment."&lt;/p&gt;

&lt;p&gt;Microsoft publishes a read-only way to see which certificate a policy is bound to: export the configuration and pull the thumbprint from the policy's EAP blob. Microsoft's snippet, with the policy name as the only change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only (writes one XML file). On the NPS server: which certificate thumbprint is bound to this network policy?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Microsoft's snippet from "Manage certificates used with NPS"; the export contains RADIUS shared secrets in clear text, so delete it after reading&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$PolicyName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CORP-SECURE Wireless"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Change this to your policy name (case-insensitive)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$NPSConfigPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;TEMP&lt;/span&gt;&lt;span class="s2"&gt;\nps-config.xml"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Export-NpsConfiguration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$NPSConfigPath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$blob&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;TEMP&lt;/span&gt;&lt;span class="s2"&gt;\nps-config.xml"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Raw&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SelectNodes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"//RadiusProfiles//*[@name]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-ieq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$PolicyName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;msEAPConfiguration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;'#text'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$found&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$blob&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'14000000([0-9a-f]{40})'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToUpper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Unique&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$found&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"No certificate thumbprint found in policy '&lt;/span&gt;&lt;span class="nv"&gt;$PolicyName&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;elseif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bound certificate thumbprint:&lt;/span&gt;&lt;span class="nv"&gt;$found&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WARNING: multiple candidate thumbprints found, manual review of &lt;/span&gt;&lt;span class="nv"&gt;$NPSConfigPath&lt;/span&gt;&lt;span class="s2"&gt; needed:&lt;/span&gt;&lt;span class="se"&gt;`n&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$found&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;`n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's caution on that file: "The exported NPS configuration file contains unencrypted shared secrets for RADIUS clients and members of remote RADIUS server groups." Then compare the thumbprint with what's actually in the machine store:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the NPS server: certificates that can do server authentication, with expiry and names&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Cert:\LocalMachine\My&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-SSLServerAuthentication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Thumbprint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NotAfter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DnsNames'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DnsNameList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;', '&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'EKU'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnhancedKeyUsageList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FriendlyName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;', '&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Anything expiring in the next 30 days&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Cert:\LocalMachine\My&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExpiringInDays&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Thumbprint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NotAfter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bound thumbprint missing from that list, or present with a past &lt;code&gt;NotAfter&lt;/code&gt;, is your reason 22. Microsoft's server certificate requirements, each checkable in that output: "The Subject name contains a value."; the certificate includes "the Server Authentication purpose in EKU extensions (the object identifier (OID) for Server Authentication is 1.3.6.1.5.5.7.3.1)"; "The Subject Alternative Name (SubjectAltName) extension, if used, must contain the DNS name of the server." And it has to be trusted by the clients: it must "Be issued by a certification authority (CA) that is trusted by client computers." A new certificate from a different CA, or a client profile that pins the old server name or root, fails here even though the certificate itself is fine (our reading of Microsoft's client-side validation rules: "The name in the Subject line of the server certificate matches the name that's configured on the client for the connection.").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLS settings.&lt;/strong&gt; In the same 2018 thread, the poster found the cause in a hardening change: "I followed a document from microsoft increasing security by turning off SSL 2.0/3.0 and TLS 1.0/1.1 and only allowing TLS 1.2." That was Windows Server 2012 (community, old). On current builds, don't re-enable old protocols on that basis; read what changed under SCHANNEL and when, and compare with a server that works (our reading):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On the NPS server: SCHANNEL protocol overrides (no output under Protocols = OS defaults)
reg query "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols" /s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clocks matter at this step too: reason 264 is "The Security Support Provider Interface (SSPI) called by EAP reports that the system clocks on the NPS server and the access client are not synchronized." See &lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt; for that read.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: For reason 16 with passwords, is the account real, usable, and reachable? (read-only)
&lt;/h2&gt;

&lt;p&gt;This step is for PEAP-MS-CHAP v2 (the event's EAP Type says so). Microsoft's NPS troubleshooting page lists three checks for 6273 reason 16: "Check that the username and password for the user are valid.", "Check to see whether the user account is locked in Active Directory.", and "Check that the request is targeted to the correct domain controller and that the user account exists."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. Any domain-joined machine with RSAT: the account NPS was asked about (the name is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;jdoe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LockedOut&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordExpired&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordLastSet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;BadLogonCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastBadPasswordAttempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AccountExpirationDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;UserPrincipalName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SamAccountName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;UserPrincipalName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LockedOut&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordExpired&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordLastSet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;BadLogonCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastBadPasswordAttempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AccountExpirationDate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;BadLogonCount&lt;/code&gt; and &lt;code&gt;LastBadPasswordAttempt&lt;/code&gt; come from the DC that answered, so read them on the DC that NPS uses (our reading). Disabled, expired, and locked accounts usually get their own codes (34, 35, 36), so a reason 16 with a healthy-looking account points at the password the client sent or the name it sent it under (our reading of Microsoft's reason-code table).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The DC's side of the same attempt.&lt;/strong&gt; MS-CHAP v2 is validated by the DC, so the DC's Security log should show the attempt as Event 4776 (our reading; Microsoft: "This event generates every time that a credential validation occurs using NTLM authentication." and "For domain accounts, the domain controller is authoritative.").&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On a DC (or remotely with -ComputerName): recent 4776 entries for the account&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4776&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddHours&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'jdoe'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Error Code field, from Microsoft's 4776 table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;4776 Error Code&lt;/th&gt;
&lt;th&gt;Microsoft's description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0xC0000064&lt;/td&gt;
&lt;td&gt;"The username you typed does not exist. Bad username."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0xC000006A&lt;/td&gt;
&lt;td&gt;"Account logon with misspelled or bad password."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0xC0000071&lt;/td&gt;
&lt;td&gt;"Account logon with expired password."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0xC0000072&lt;/td&gt;
&lt;td&gt;"Account logon to account disabled by administrator."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0xC0000234&lt;/td&gt;
&lt;td&gt;"Account logon with account locked."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x0&lt;/td&gt;
&lt;td&gt;Success: the DC accepted the password, so look at NPS policy, not the password (our reading)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No 4776 at all on any DC for that attempt means NPS didn't get as far as a DC (Step 8) or the name went somewhere else, a trusted domain or a different realm (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which name was sent.&lt;/strong&gt; The 6273's Account Name and Account Domain show what the client sent. A UPN suffix NPS can't resolve, a saved credential from before a rename, or a personal device sending only &lt;code&gt;jdoe&lt;/code&gt; with no domain all look like reason 16 (our reading; Microsoft's codes 7 and 8 are the explicit versions: the domain in the User-Name attribute doesn't exist, or the user account doesn't). Microsoft's best-practices page has one more: "Network Policy Server (NPS) does not support the use of the Extended ASCII characters within passwords." A few users with accented characters in new passwords is a pattern worth checking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Computer authentication.&lt;/strong&gt; If the Account Name is &lt;code&gt;host/LAPTOP-123&lt;/code&gt; or &lt;code&gt;CONTOSO\LAPTOP-123$&lt;/code&gt;, the computer is authenticating with its machine account (our reading). Read the computer object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. The computer account behind a host/ authentication (the name is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADComputer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'LAPTOP-123'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordLastSet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;whenCreated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PasswordLastSet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;whenCreated&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A disabled or recently re-created computer object, or one restored from an old image, can fail where users on the same laptop succeed (our reading). &lt;a href="https://dev.to/adminpackstudio/active-directory-account-keeps-getting-locked-out-a-read-first-event-4740-source-and-stale-13ii"&gt;AD Account Keeps Getting Locked Out&lt;/a&gt; covers the reverse case: NPS as the caller that keeps locking an account with a saved old password.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows 11 and Credential Guard.&lt;/strong&gt; Microsoft: "Upgrades to Windows 11, version 22H2, and Windows Server 2025 have Credential Guard enabled by default unless explicitly disabled." And for Wi-Fi and VPN: "Devices that use 802.1x wireless or wired network, RDP, or VPN connections that rely on insecure protocols with password-based authentication are unable to use SSO to sign in and are forced to manually reauthenticate in every new Windows session when Credential Guard is running." Users who used to connect silently with "Automatically use my Windows logon name and password" now get a prompt, type something, and fail (our reading). Microsoft's check on the client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On a failing Windows client: 1 in the output = Credential Guard is running&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_DeviceGuard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;root\Microsoft\Windows\DeviceGuard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SecurityServicesRunning&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's direction is clear: "Microsoft recommends moving away from MSCHAPv2-based connections (for example, PEAP-MSCHAPv2 and EAP-MSCHAPv2), to certificate-based authentication (for example, PEAP-TLS or EAP-TLS). Credential Guard doesn't block certificate-based authentication."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A pattern from the field (community).&lt;/strong&gt; On a Microsoft Q&amp;amp;A thread about intermittent 6273 reason 16 for wired and Wi-Fi users, one admin traced it to a read-only DC in the NPS server's site: "Appears the root cause of this problem is related to NPS trying to authenticate to an RODC in the same site." Their fix was moving the RODC to its own site. If reason 16 comes and goes for healthy accounts, check which DCs share the NPS server's site (our reading of that thread; not Microsoft documentation).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: For reason 16 with certificates, does the certificate map to the account? (read-only)
&lt;/h2&gt;

&lt;p&gt;This step is for EAP-TLS or PEAP-TLS. Microsoft's 6273 page: "If a certificate-based authentication method is used, examine the user or computer certificate to confirm that the user is providing the correct certificate for authentication." Reason 16's text says the user name "does not match an existing user account". With a certificate, the name comes from the certificate, so that's a mapping question (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The certificate itself.&lt;/strong&gt; Microsoft's client certificate requirements: "The client certificate is issued by an enterprise CA or mapped to a user or computer account in Active Directory Domain Services (AD DS)."; it carries "the Client Authentication purpose in EKU extensions (the OID for Client Authentication is 1.3.6.1.5.5.7.3.2)"; "For user certificates, the Subject Alternative Name (SubjectAltName) extension in the certificate contains the user principal name (UPN)."; and "For computer certificates, the Subject Alternative Name (SubjectAltName) extension in the certificate must contain the fully qualified domain name (FQDN) of the client, which is also called the DNS name."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On a failing Windows client: client-auth certificates in the user and computer stores,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# with expiry, names, and whether the AD CS SID extension (1.3.6.1.4.1.311.25.2) is present&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$store&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Cert:\CurrentUser\My'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Cert:\LocalMachine\My'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$store&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnhancedKeyUsageList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ObjectId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-contains&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'1.3.6.1.5.5.7.3.2'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Store'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$store&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Thumbprint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Issuer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NotBefore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NotAfter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'SAN'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Extensions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Oid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'2.5.29.17'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Format&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$false&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'SidExtension'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Extensions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Oid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'1.3.6.1.4.1.311.25.2'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The store filter, &lt;code&gt;Format($false)&lt;/code&gt; and the calculated properties are our forms. More than one client-auth certificate in a store is worth noting: Richard Hicks (Microsoft MVP, his Always On VPN blog, community) answers a reader that if an older certificate that isn't strongly mapped is still in the store, "Windows could be selecting the wrong one when it connects."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strong mapping (the February 2025 change).&lt;/strong&gt; Microsoft's KB5014754, on Full Enforcement mode: domain controllers "will move to Full Enforcement mode when the February 2025 Windows security update is installed. Authentication will be denied if a certificate cannot be strongly mapped." The rollback window is closed: "The option to move back to Compatibility mode will remain until the September 9, 2025 Windows security update is installed. After this date, the StrongCertificateBindingEnforcement registry key will no longer be supported." Hicks documented what that looks like for VPN: "The event log on the NPS server will also record event ID 6273 from the Microsoft Windows security auditing source with the following error message." His post shows reason code 16, and on a DC, Kdcsvc Event 39. His reading: "The above conditions indicate that a user attempted to authenticate to the VPN with a certificate that was not strongly mapped."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On each DC (or remotely with -ComputerName): KB5014754 mapping events from the KDC&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# 39 = no strong mapping, 40 = certificate predates the account, 41 = SID mismatch (Windows Server 2008 R2 / 2008 use 41, 48, 49)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'System'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ProviderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Microsoft-Windows-Kerberos-Key-Distribution-Center'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;50&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft lists the event source as Kdcsvc; the provider name in the filter is our reading (Hicks names it Kerberos-Key-Distribution-Center). If the filter returns nothing on a DC that should have events, open the System log and filter by event ID instead. Event 39's text: "The Key Distribution Center (KDC) encountered a user certificate that was valid but could not be mapped to a user in a strong way (such as via explicit mapping, key trust mapping, or a SID)." The event names the user, the certificate's subject, issuer, serial number, and thumbprint, so you can match it to the 6273.&lt;/p&gt;

&lt;p&gt;What counts as strong, per Microsoft:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mapping&lt;/th&gt;
&lt;th&gt;Where it comes from&lt;/th&gt;
&lt;th&gt;Strong?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SID extension (OID 1.3.6.1.4.1.311.25.2)&lt;/td&gt;
&lt;td&gt;AD CS online templates, after the May 2022 CA update&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SAN URL with the SID tag&lt;/td&gt;
&lt;td&gt;Intune SCEP (&lt;code&gt;OnPremisesSecurityIdentifier&lt;/code&gt; variable) or PKCS (connector setting)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;altSecurityIdentities&lt;/code&gt; X509IssuerSerialNumber, X509SKI, X509SHA1PublicKey&lt;/td&gt;
&lt;td&gt;Manual mapping on the account&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;altSecurityIdentities&lt;/code&gt; X509IssuerSubject, X509SubjectOnly, X509RFC822&lt;/td&gt;
&lt;td&gt;Manual mapping on the account&lt;/td&gt;
&lt;td&gt;No (weak)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UPN or DNS name in the SAN only&lt;/td&gt;
&lt;td&gt;Any CA&lt;/td&gt;
&lt;td&gt;No (implicit, weak)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last row is our reading of the KB's rule: "In general, mapping types are considered strong if they are based on identifiers that you cannot reuse." Microsoft on the CA side: "Enterprise Certificate Authorities (CA) will start adding a new non-critical extension with Object Identifier (OID) (1.3.6.1.4.1.311.25.2) by default in all the certificates issued against online templates after you install the May 10, 2022, Windows update." And: "Environments that have non-Microsoft CA deployments will not be protected using the new SID extension after installing the May 10, 2022, Windows update."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. The account side: explicit mappings and creation time (the user name is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;jdoe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;altSecurityIdentities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;whenCreated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SamAccountName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;whenCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'altSecurityIdentities'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;altSecurityIdentities&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'; '&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A certificate whose &lt;code&gt;NotBefore&lt;/code&gt; is older than the account's &lt;code&gt;whenCreated&lt;/code&gt;, with no strong mapping, is Microsoft's "Certificate predates account" case: "If the certificate is older than the account, reissue the certificate or add a secure altSecurityIdentities mapping to the account (see Certificate mappings)."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intune-issued certificates.&lt;/strong&gt; Microsoft's Intune support tip: the SCEP profile can add the SID as a SAN URI; "For device certificates, only Microsoft Entra hybrid joined devices will have SID information, so strong mapping changes are applicable only to Windows devices that are Microsoft Entra hybrid joined." And: "For other device types, like iOS or Android, strong mapping is not supported for device certificates, and user certificates should be used instead." Phones failing with device certificates while Windows laptops pass is that rule, not a bad profile (our reading). &lt;a href="https://dev.to/adminpackstudio/intune-scep-certificate-profile-failed-a-read-first-assignment-and-ndes-triage-4ibc"&gt;Intune SCEP Certificate Profile Failed&lt;/a&gt; covers the profile and NDES side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The chain.&lt;/strong&gt; A certificate that maps fine can still fail validation on NPS. Those usually arrive as their own codes (Step 9), but read the chain from the client's exported certificate before you assume (&lt;code&gt;certutil -verify -urlfetch&lt;/code&gt;; &lt;a href="https://dev.to/adminpackstudio/revocation-server-was-offline-0x80092013-a-read-first-crl-cdp-cache-and-offline-root-triage-59pf"&gt;Revocation Server Was Offline&lt;/a&gt; walks through that output). One community report on the same Q&amp;amp;A thread as Step 5: after KB5014754, certificates on the NPS server issued before the update were missing the SID extension, and the admin "renewed with new keys" all of them. That's one environment's finding, not Microsoft guidance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Does the request reach the policy you think it does? (read-only)
&lt;/h2&gt;

&lt;p&gt;NPS evaluates two ordered lists. First the connection request policies: "RADIUS Access-Request messages are processed or forwarded by NPS only if the settings of the incoming message match at least one of the connection request policies configured on the NPS." Then the network policies, top to bottom, first match wins (TL;DR). Three rules decide most surprises:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conditions vs constraints.&lt;/strong&gt; Microsoft: "Unlike the NPS response to unmatched conditions in the network policy, if a constraint is not matched, NPS denies the connection request without evaluating additional network policies." A broad policy higher in the list whose conditions match, but whose authentication methods don't, rejects the request before your intended policy is read (our reading of that rule).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disabled policies are skipped.&lt;/strong&gt; "When you disable a network policy, NPS does not evaluate the policy when authorizing connection requests."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dial-in properties.&lt;/strong&gt; "If the dial-in properties of the user account are set to deny access, the connection request is rejected by NPS." That's reason 65. And: "If NPS does not find a network policy that matches the connection request, the connection request is rejected unless the dial-in properties on the user account are set to grant access." That's reason 48.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare the 6273's Proxy Policy Name and Network Policy Name with the policy you meant. Then read that policy's conditions against the event's fields: NAS Port Type (Microsoft's example: "if the user is only allowed to connect through a wireless access point but is attempting to connect through a virtual private network (VPN) server, access will be denied"), Windows Groups, NAS IPv4 Address, Calling or Called Station ID. To list what's configured without touching it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only (writes one XML file with shared secrets in clear text; delete it after). On the NPS server:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# the network policy names in the exported configuration (XPath from Microsoft's certificate snippet; listing names is our form)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;TEMP&lt;/span&gt;&lt;span class="s2"&gt;\nps-config.xml"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Export-NpsConfiguration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Raw&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SelectNodes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"//RadiusProfiles//*[@name]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Remove-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The processing order itself is the order of the list in the NPS console under &lt;strong&gt;Policies&lt;/strong&gt; (read it there). For a Windows Groups condition, read the group the way NPS will:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. Is the account (user or computer) in the group the policy's Windows Groups condition names? (names are examples)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADGroupMember&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'WiFi-Users'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recursive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SamAccountName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'jdoe'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'LAPTOP-123$'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SamAccountName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;objectClass&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wi-Fi often authenticates the computer at boot and the user at sign-in; a group condition that only contains users rejects the computer pass (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forwarding.&lt;/strong&gt; If the matching connection request policy forwards to another RADIUS server, Microsoft's checklist: "The Remote Radius Server Groups list includes the radius server in question." Reason 112 says the remote server rejected it: "Check the event log on the remote RADIUS server to determine the reason that the connection request was rejected."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MAC authentication bypass policies.&lt;/strong&gt; Microsoft notes that Calling Station ID "is typically used for Mac Address Bypass scenarios when the connection request policy is configured for 'Accept users without validating credentials'." That's the setting behind the forum's accept-everyone suggestion. A policy like that belongs on a narrow, MAC-limited set of devices, and it must sit where your 802.1X requests can't match it (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Is the NPS server itself registered, logging, and healthy? (read-only)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Registered in AD.&lt;/strong&gt; Microsoft: "NPSs must be registered in Active Directory so that they have permission to read the dial-in properties of user accounts during the authorization process. Registering an NPS adds the server to the RAS and IAS Servers group in Active Directory." And across domains: "To provide an NPS with permission to read the dial-in properties of user accounts in Active Directory, the NPS must be registered in the domain where the accounts reside."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. Is each NPS server in RAS and IAS Servers in the users' domain? Is the service running?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADGroupMember&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'RAS and IAS Servers'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;objectClass&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IAS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartType&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;IAS&lt;/code&gt; is the Network Policy Server service (Microsoft's certificate page calls it "the Network Policy Server (IAS) service").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logging.&lt;/strong&gt; Microsoft's 6273 page lists unavailable log files as a cause: "If NPS is configured to record accounting information in a log file on the local computer or a remote computer, check that the hard disk is not full." And the accounting page: "To prevent the log files from filling the hard drive, it is strongly recommended that you keep them on a partition that is separate from the system partition." Reason 80 is the explicit version: NPS couldn't write accounting data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain controllers.&lt;/strong&gt; Reasons 4, 5, and 261 are NPS failing to reach the global catalog, a DC in the user's domain, or AD DS at all. Microsoft's 6273 page: "Check that the domain controller is online." and "Check that network connections between the domain controller and NPS are working." &lt;a href="https://dev.to/adminpackstudio/netlogon-event-id-5719-a-read-first-boot-timing-dns-dc-locator-and-site-triage-3j2a"&gt;Netlogon Event ID 5719&lt;/a&gt; covers a server that can't find a DC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extensions (the NPS extension for Microsoft Entra MFA).&lt;/strong&gt; Reason 21: "An IAS extension dynamic link library (DLL) that is installed on the NPS server rejected the connection request." Read what's installed before Microsoft's isolation step (Step 10):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On the NPS server: the extension DLLs NPS loads (no values = no extensions)
reg query "HKLM\SYSTEM\CurrentControlSet\Services\AuthSrv\Parameters" /v AuthorizationDLLs
reg query "HKLM\SYSTEM\CurrentControlSet\Services\AuthSrv\Parameters" /v ExtensionDLLs
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the extension is there, its own log is under &lt;strong&gt;Applications and Services Logs &amp;gt; Microsoft &amp;gt; AzureMfa &amp;gt; AuthN &amp;gt; AuthZ&lt;/strong&gt; (Microsoft's path).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More than one NPS server.&lt;/strong&gt; Access points and switches usually list two, and each NPS server writes its own Security log. Run Steps 2, 4, and 7 on each; a certificate rebound on one server and not the other gives half-the-users symptoms (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: A different reason code? Read that one instead
&lt;/h2&gt;

&lt;p&gt;Microsoft's reason-code tables (archived Windows Server 2008 R2 pages, still the published reference) cover 0 through 303. The ones that show up next to 16 and 22 most often, by our reading of the autocomplete data and forum threads:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Microsoft's meaning (shortened)&lt;/th&gt;
&lt;th&gt;Go to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;User account in User-Name doesn't exist&lt;/td&gt;
&lt;td&gt;Step 5 (name form)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;An IAS extension DLL rejected the request&lt;/td&gt;
&lt;td&gt;Step 8 (MFA extension)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;EAP error; "Check EAP log files for EAP errors."&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33, 72&lt;/td&gt;
&lt;td&gt;User must change password; policy doesn't allow change&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;34, 35, 36&lt;/td&gt;
&lt;td&gt;Account disabled, expired, or locked out&lt;/td&gt;
&lt;td&gt;Step 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48, 49&lt;/td&gt;
&lt;td&gt;No matching network policy / connection request policy&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;NPS Remote Access Account Lockout tripped&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;Dial-in Network Access Permission is Deny&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;Method not enabled on the matching policy&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;73, 267, 283, 293, 296&lt;/td&gt;
&lt;td&gt;Certificate missing the Client Authentication EKU&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;112&lt;/td&gt;
&lt;td&gt;Remote RADIUS server rejected a forwarded request&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;256, 289&lt;/td&gt;
&lt;td&gt;Certificate revoked&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;258, 259, 291&lt;/td&gt;
&lt;td&gt;CRL unreachable or CA unavailable&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/adminpackstudio/revocation-server-was-offline-0x80092013-a-read-first-crl-cdp-cache-and-offline-root-triage-59pf"&gt;Revocation Server Was Offline&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;264&lt;/td&gt;
&lt;td&gt;Clocks not synchronized&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;265, 286, 287, 295&lt;/td&gt;
&lt;td&gt;Certificate chains to a CA that NPS doesn't trust&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;268, 278&lt;/td&gt;
&lt;td&gt;Certificate expired&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;272&lt;/td&gt;
&lt;td&gt;Certificate maps to more than one account&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;292, 298&lt;/td&gt;
&lt;td&gt;User-Name doesn't match the certificate's CN or UPN&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft: "There are intentional gaps in the numeric sequence of reason codes." A code that isn't in the tables is worth searching as its own question rather than guessing from the neighbors.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common false starts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What people try&lt;/th&gt;
&lt;th&gt;Why it misleads (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tick Ignore user account dial-in properties&lt;/td&gt;
&lt;td&gt;Microsoft: with it set, "only the settings in the network policy are used by NPS to determine whether the connection is authorized." Fixes reason 65, not 16 or 22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An accept-without-credentials policy "until it's sorted"&lt;/td&gt;
&lt;td&gt;Lets any device that reaches the policy onto the network; Microsoft documents that setting for MAC bypass, not for broken 802.1X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reissuing every certificate first&lt;/td&gt;
&lt;td&gt;Reissuing without the SID extension or a strong mapping fails the same way; a new NPS certificate also has to be bound to each policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A new self-signed NPS certificate pushed into clients' Trusted Root&lt;/td&gt;
&lt;td&gt;A community answer's fix ("Problem is most likely that the self signed cert broke."); it skips the CA, and every client has to trust it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Re-enabling TLS 1.0 and SSL 3.0 on NPS&lt;/td&gt;
&lt;td&gt;Based on a 2018 thread about Windows Server 2012; read what changed under SCHANNEL first (Step 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;StrongCertificateBindingEnforcement&lt;/code&gt; = 1 on DCs&lt;/td&gt;
&lt;td&gt;Microsoft: no longer supported after the September 9, 2025 update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Turning off Credential Guard&lt;/td&gt;
&lt;td&gt;Microsoft calls it the "more immediate, but less secure fix"; moving off MS-CHAP v2 is the recommendation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rebooting NPS until it works&lt;/td&gt;
&lt;td&gt;Clears TLS handle caches and symptoms, not the cause; the Q&amp;amp;A thread's reboot bought "about 8-10 hours"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 10: Change one link, then prove it
&lt;/h2&gt;

&lt;p&gt;Only after Steps 1-9 agree on which link failed. Save the configuration first; Microsoft's best-practices page: "Save the NPS configuration with this command each time you reconfigure the NPS."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Low-risk (writes files). On each NPS server: configuration and extension settings before any change&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# The XML contains RADIUS shared secrets in clear text: keep it somewhere access-controlled&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ItemType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'D:\NPS-Backup'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-Null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Export-NpsConfiguration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"D:\NPS-Backup\nps-config-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;yyyyMMdd-HHmm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;.xml"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKLM\SYSTEM\CurrentControlSet\Services\AuthSrv\Parameters"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"D:\NPS-Backup\authsrv-parameters.reg"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/y&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Auditing off (Step 2).&lt;/strong&gt; Microsoft's command, on the NPS server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Change. Turn on success and failure auditing for NPS
auditpol /set /subcategory:"Network Policy Server" /success:enable /failure:enable
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NPS server certificate expired or replaced (Step 4).&lt;/strong&gt; Microsoft's procedure, per policy that uses certificate-based authentication: &lt;strong&gt;Constraints&lt;/strong&gt; &amp;gt; &lt;strong&gt;Authentication Methods&lt;/strong&gt; &amp;gt; select the EAP type &amp;gt; &lt;strong&gt;Edit&lt;/strong&gt; &amp;gt; pick the new certificate in &lt;strong&gt;Certificate issued to&lt;/strong&gt; &amp;gt; &lt;strong&gt;OK&lt;/strong&gt; &amp;gt; &lt;strong&gt;Apply&lt;/strong&gt;. Repeat for every such policy, then Microsoft: "Restart the Network Policy Server (IAS) service for the change to take effect."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Change. On the NPS server, after rebinding every affected policy (Microsoft's command)
net stop ias &amp;amp;&amp;amp; net start ias
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then re-run Microsoft's thumbprint snippet from Step 4 and confirm it returns the new thumbprint. For the next renewal, Microsoft's fix for this whole class of outage: "By using autoenrollment, the server certificate is renewed automatically before it expires, and NPS continues to use the renewed certificate without administrator intervention." &lt;a href="https://dev.to/adminpackstudio/certificate-autoenrollment-not-working-a-read-first-gpo-template-permission-ca-and-dcom-triage-4h86"&gt;Certificate Autoenrollment Not Working&lt;/a&gt; covers getting that working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EAP types don't match (Step 4).&lt;/strong&gt; Change one side, on purpose: either the policy's EAP Types list or the client profile. For domain-joined Windows, Microsoft's best practice: "Automatically configure all of your domain member 802.1X client computers by using Group Policy." For Intune-managed devices, &lt;a href="https://dev.to/adminpackstudio/intune-wi-fi-profile-not-applying-a-read-first-assignment-and-eap-triage-d1"&gt;Intune Wi-Fi Profile Not Applying&lt;/a&gt; covers the profile side. Add a method to the policy only if you mean to support it; don't remove the method the working devices use (our habit).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Password users (Step 5).&lt;/strong&gt; Reset or unlock the one account, have the user forget the saved network and reconnect, and test. For a fleet moving to Windows 11 with Credential Guard, the durable fix is Microsoft's recommendation, certificate-based authentication, not disabling Credential Guard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NPS remote access lockout (reason 64).&lt;/strong&gt; Microsoft: "To manually reset a user account that has been locked out before the failed attempts counter is automatically reset, delete the following registry subkey that corresponds to the user's account name: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess\Parameters\AccountLockout\domain name:user name"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Certificates without a strong mapping (Step 6).&lt;/strong&gt; The fix is new certificates that carry the SID, or an explicit strong mapping. Hicks: "Administrators must issue new certificates that are strongly mapped to resolve this issue." For AD CS, a re-enrollment against an online template on an updated CA picks up the SID extension (Microsoft's KB). For Intune SCEP, add the &lt;code&gt;OnPremisesSecurityIdentifier&lt;/code&gt; variable as a SAN URI in a new profile; Microsoft: "Renew certificates in phases by creating a new SCEP profile and gradually targeting it to groups of users or devices." For Intune PKCS, Microsoft's order is connector update, the &lt;code&gt;EnableSidSecurityExtension&lt;/code&gt; registry value set to 1, then a connector service restart, then reissue.&lt;/p&gt;

&lt;p&gt;Where a certificate can't be reissued, Microsoft's manual strong mapping is X509IssuerSerialNumber in &lt;code&gt;altSecurityIdentities&lt;/code&gt;. Issuer and serial are reversed from the forward format the certificate shows, and Microsoft warns: "Note that when you reverse the SerialNumber, you must keep the byte order." Microsoft's example, with a dry run added:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change (dry run first). Microsoft's KB5014754 example values; build your own string from the certificate's issuer and serial&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-ADUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'DomainUser'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-Replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;altSecurityIdentities&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'X509:&amp;lt;I&amp;gt;DC=com,DC=contoso,CN=CONTOSO-DC-CA&amp;lt;SR&amp;gt;1200000000AC11000000002B'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WhatIf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-Replace&lt;/code&gt; overwrites any existing mappings on that attribute; read them first (Step 6) and include the ones you keep (our habit).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong policy matched (Step 7).&lt;/strong&gt; Move the intended policy up, or narrow the broader policy's conditions, in the NPS console. One policy change, then a test from the same NAS and the same device type. Disable rather than delete a policy you think is unused, so it can come back (our habit).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NPS not registered (Step 8).&lt;/strong&gt; NPS console: &lt;strong&gt;NPS (Local)&lt;/strong&gt; &amp;gt; &lt;strong&gt;Register Server in Active Directory&lt;/strong&gt;. For another domain, Microsoft's command form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Change. Register an NPS server in another domain (domain and server names are examples)
netsh nps add registeredserver contoso.com NPS01
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;MFA extension suspected (Step 8, reason 21).&lt;/strong&gt; Microsoft's isolation step is to back up the &lt;code&gt;AuthSrv\Parameters&lt;/code&gt; key (done above), delete the &lt;code&gt;AuthorizationDLLs&lt;/code&gt; and &lt;code&gt;ExtensionDLLs&lt;/code&gt; values, and test. Microsoft: "If NPS authentication succeeds, then the issue might be specific to Microsoft Entra multifactor authentication." While those values are gone, the server isn't asking for MFA: do it in a window, with an owner, and import the &lt;code&gt;.reg&lt;/code&gt; export when the test is done (our habit).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then prove it.&lt;/strong&gt; Microsoft's verification: "On a computer that is configured according to network access policy, log on to the network with a valid user account and valid credentials." Then read the success event and the policy it names:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the NPS server: the newest grants and denials for the test account, side by side&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6272&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6273&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddMinutes&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'jdoe'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Policy'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Network Policy Name:\s+(.+)'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$Matches&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nx"&gt;Format&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 6272 naming the policy you intended is the pass. Then the next device type (another laptop model, a phone, a VPN client), because NPS caches TLS sessions: Microsoft notes "the default TLS handle expiry is 10 hours", so a device that reconnected may not have gone through the full check you just fixed (our reading).&lt;/p&gt;




&lt;h2&gt;
  
  
  When a change is justified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NPS certificate expired or replaced&lt;/td&gt;
&lt;td&gt;Rebind it in every policy, restart IAS, then autoenrollment&lt;/td&gt;
&lt;td&gt;A self-signed certificate pushed to clients&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client and policy offer different EAP types&lt;/td&gt;
&lt;td&gt;Change the one side that's wrong&lt;/td&gt;
&lt;td&gt;Enabling every method on the policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password users on Windows 11 prompted and failing&lt;/td&gt;
&lt;td&gt;Certificate-based authentication&lt;/td&gt;
&lt;td&gt;Disabling Credential Guard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificates without a strong mapping&lt;/td&gt;
&lt;td&gt;Reissue with the SID, or an explicit strong mapping&lt;/td&gt;
&lt;td&gt;Weak mappings, waiting for a rollback key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An older, broader policy matches first&lt;/td&gt;
&lt;td&gt;Reorder or narrow it&lt;/td&gt;
&lt;td&gt;An accept-without-credentials policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NPS not in RAS and IAS Servers&lt;/td&gt;
&lt;td&gt;Register it in each user domain&lt;/td&gt;
&lt;td&gt;Adding NPS to Domain Admins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA extension rejecting&lt;/td&gt;
&lt;td&gt;The extension's own logs, a timed isolation test&lt;/td&gt;
&lt;td&gt;Leaving the DLL values deleted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does NPS Event 6273 mean?&lt;/strong&gt;&lt;br&gt;
"Network Policy Server denied access to a user." NPS received the RADIUS request, ran it through its connection request and network policies, and rejected it. The event names the policy, the authentication and EAP types, the NAS, the account, and a reason code. Read all of them, not only the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is NPS reason code 16?&lt;/strong&gt;&lt;br&gt;
"Authentication failed due to a user credentials mismatch." With passwords (PEAP-MS-CHAP v2), check the account, the password the device saved, and the DC's Event 4776. With certificates (EAP-TLS, PEAP-TLS), check the certificate's UPN or DNS name and whether it's strongly mapped; since the February 2025 domain controller update, a weak mapping is denied.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is NPS reason code 22?&lt;/strong&gt;&lt;br&gt;
NPS couldn't agree on an EAP type with the client. Compare the client's method with the policy's EAP Types list, and check the NPS server certificate bound to that policy. Microsoft: it "isn't updated automatically when it expires."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where are the NPS logs?&lt;/strong&gt;&lt;br&gt;
The events are in the Security log on each NPS server (6272 granted, 6273 denied, 6274 discarded), also under Custom views &amp;gt; Server roles &amp;gt; Network Policy and Access Services. The accounting log defaults to &lt;code&gt;%windir%\System32\LogFiles&lt;/code&gt;, in files whose names start with IN. Auditing must be on: &lt;code&gt;auditpol /get /subcategory:"Network Policy Server"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I select Ignore user account dial-in properties to fix 6273?&lt;/strong&gt;&lt;br&gt;
Only if the event shows reason 65 and you mean to let the network policy alone decide access. It doesn't change how NPS checks a password or a certificate, so it doesn't fix 16 or 22.&lt;/p&gt;




&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/intune-wi-fi-profile-not-applying-a-read-first-assignment-and-eap-triage-d1"&gt;Intune Wi-Fi Profile Not Applying&lt;/a&gt; (the client profile side: assignment, EAP settings, and the certificate the profile needs)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/revocation-server-was-offline-0x80092013-a-read-first-crl-cdp-cache-and-offline-root-triage-59pf"&gt;Revocation Server Was Offline (0x80092013)&lt;/a&gt; (when the 6273 is a revocation code, or the chain fails before mapping)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/certificate-autoenrollment-not-working-a-read-first-gpo-template-permission-ca-and-dcom-triage-4h86"&gt;Certificate Autoenrollment Not Working&lt;/a&gt; (so the NPS server certificate and client certificates renew on their own)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/intune-scep-certificate-profile-failed-a-read-first-assignment-and-ndes-triage-4ibc"&gt;Intune SCEP Certificate Profile Failed&lt;/a&gt; (where Intune-issued client certificates, and their SID, come from)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/active-directory-account-keeps-getting-locked-out-a-read-first-event-4740-source-and-stale-13ii"&gt;AD Account Keeps Getting Locked Out&lt;/a&gt; (NPS as the caller behind repeated bad passwords)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt; (the clock behind reason 264)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/netlogon-event-id-5719-a-read-first-boot-timing-dns-dc-locator-and-site-triage-3j2a"&gt;Netlogon Event ID 5719&lt;/a&gt; (when NPS, or any server, can't find a domain controller)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free checklist
&lt;/h2&gt;

&lt;p&gt;An accept-without-credentials policy added to every SSID before one laptop was tested against the fixed certificate binding is a change nobody tested where the connections happen. So is a Conditional Access policy enforced before anyone read the report-only results. The free &lt;strong&gt;Conditional Access pre-enforcement checklist&lt;/strong&gt; keeps break-glass accounts, pilot groups, and report-only review on one page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=nps-event-6273-reason-code-16-22" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=nps-event-6273-reason-code-16-22&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the &lt;strong&gt;Intune &amp;amp; M365 Admin Starter Pack&lt;/strong&gt; pairs with this triage: &lt;a href="https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=nps-event-6273-reason-code-16-22" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=nps-event-6273-reason-code-16-22&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Admin Pack Studio; not affiliated with Microsoft. Steps 1-9 favor read-only checks: &lt;code&gt;auditpol /get&lt;/code&gt;, &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;Get-NetUDPEndpoint&lt;/code&gt;, &lt;code&gt;Get-NpsRadiusClient&lt;/code&gt;, &lt;code&gt;Get-ChildItem&lt;/code&gt; on the accounting logs and certificate stores, &lt;code&gt;Select-String&lt;/code&gt;, &lt;code&gt;Get-ADUser&lt;/code&gt;, &lt;code&gt;Get-ADComputer&lt;/code&gt;, &lt;code&gt;Get-ADGroupMember&lt;/code&gt;, &lt;code&gt;Get-CimInstance&lt;/code&gt;, &lt;code&gt;Get-Service&lt;/code&gt;, and &lt;code&gt;reg query&lt;/code&gt;. &lt;code&gt;Export-NpsConfiguration&lt;/code&gt; writes a file that contains shared secrets in clear text; delete or secure it. Turning on auditing, rebinding the NPS certificate, restarting IAS, changing EAP types or policy order, account resets, &lt;code&gt;altSecurityIdentities&lt;/code&gt; mappings, certificate reissue, NPS registration, removing extension DLL values, and the lockout registry key are deliberate changes. Change one link at a time, test from the failing network and device type, and check current Microsoft Learn for version-specific behavior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windowsserver</category>
      <category>networking</category>
      <category>security</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>KMS Activation Error 0xC004F074: A Read-First SRV Record, Port 1688, Host, Count, and Clock Triage</title>
      <dc:creator>AdminPackStudio</dc:creator>
      <pubDate>Sun, 18 Oct 2026 20:41:17 +0000</pubDate>
      <link>https://dev.to/adminpackstudio/kms-activation-error-0xc004f074-a-read-first-srv-record-port-1688-host-count-and-clock-triage-1377</link>
      <guid>https://dev.to/adminpackstudio/kms-activation-error-0xc004f074-a-read-first-srv-record-port-1688-host-count-and-clock-triage-1377</guid>
      <description>&lt;p&gt;Helpdesk: "Since Monday, every new laptop from the latest image says Windows isn't activated, and two Windows Server 2025 VMs we built last week show error 0xC004F074. slmgr /ato says no Key Management Service (KMS) could be contacted. The old KMS server was retired over the summer and someone stood up a new one. A forum post says to point every machine at the new server with slmgr /skms, rearm them all, and if that fails, switch everything to a MAK key. Can we start with that?"&lt;/p&gt;

&lt;p&gt;Not yet. &lt;strong&gt;0xC004F074 doesn't mean the KMS host is broken. It means every KMS host the client tried, found, or was pointed at returned an error, and the client log records each attempt.&lt;/strong&gt; Microsoft's 0xC004F074 article lists three causes for the "No Key Management Service (KMS) could be contacted" form: "The Software Protection Platform Service (sppsvc service) on the KMS host has stopped running.", "There are networking issues between the KMS client and the KMS host server.", and "There's an incorrect or old KMS host server record in the Domain Name System (DNS)." Its other form adds "A time difference between the KMS client and the KMS host machine" and "A support version mismatch between the KMS client and the KMS host machine". A retired KMS host is the textbook case: its &lt;code&gt;_vlmcs._tcp&lt;/code&gt; SRV record is still in DNS, the clients keep asking it, and the new host never published a record, or it can't activate the newer OS. Pinning every machine to one server with &lt;code&gt;/skms&lt;/code&gt; turns off the discovery that would have found the next host, and rearming resets timers without fixing anything the client can't reach. Work through it as a chain: &lt;strong&gt;which machine, which product, which code, since when&lt;/strong&gt; → &lt;strong&gt;what the client thinks it is (&lt;code&gt;slmgr /dlv&lt;/code&gt;)&lt;/strong&gt; → &lt;strong&gt;what the client tried (Event 12288 and 12289)&lt;/strong&gt; → &lt;strong&gt;what DNS hands it (&lt;code&gt;_vlmcs._tcp&lt;/code&gt;)&lt;/strong&gt; → &lt;strong&gt;can it reach TCP 1688 on that host?&lt;/strong&gt; → &lt;strong&gt;is the host licensed, listening, publishing, and new enough for this client?&lt;/strong&gt; → &lt;strong&gt;is the count high enough?&lt;/strong&gt; → &lt;strong&gt;are the clocks within four hours?&lt;/strong&gt; → &lt;strong&gt;Office, AD-based activation, Azure, and other paths&lt;/strong&gt;. &lt;code&gt;slmgr.vbs&lt;/code&gt;, &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;nslookup&lt;/code&gt;, &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;Get-CimInstance&lt;/code&gt;, and &lt;code&gt;w32tm&lt;/code&gt; are the sources for that chain. Pin everything with &lt;code&gt;/skms&lt;/code&gt; and rearm, and you'll be undoing it one machine at a time when the next KMS host moves.&lt;/p&gt;

&lt;p&gt;If domain controllers show the same DNS and port symptoms, &lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt; covers the DC side of the same name-and-port reads. If the stale record is one of many, &lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt; covers why old records outlive their hosts. This post covers &lt;strong&gt;"Windows clients or servers with a KMS client setup key (GVLK) fail to activate with 0xC004F074, 'No Key Management Service (KMS) could be contacted', or a related KMS code, and you need a read-first path before you pin hosts, rearm, change keys, or rebuild the KMS host."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read the client before you touch the host.&lt;/strong&gt; &lt;code&gt;slmgr /dlv&lt;/code&gt; shows whether this is even a KMS client: Microsoft says "VOLUME_KMSCLIENT indicates that the system installed the KMS Client Setup Key, or GVLK, which is the default configuration for volume license media." (Step 2).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Application log names the host it tried.&lt;/strong&gt; Microsoft's 0xC004F074 fix: "Identify each event associated with the activation attempt that has an Event ID of 12288." Its Info field carries the result code and the host and port (Step 3).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS finding a record isn't the client finding it.&lt;/strong&gt; Microsoft: "If the nslookup command finds the KMS host, it does not mean that the DNS client can find the KMS host." Read the suffix search list and the record's target (Step 4).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test TCP 1688 from the failing client.&lt;/strong&gt; Microsoft: "Review the TcpTestSucceeded output parameter. If it's False, it means that port 1688 is blocked between the KMS client and the KMS server." (Step 5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A new host has to be licensed, published, and new enough.&lt;/strong&gt; Microsoft: "Windows Updates might be required on the KMS server to support activation of newer clients." (Step 6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clocks matter.&lt;/strong&gt; Microsoft: the related 0xC004F06C error "may occur if the difference between system time on the client computer and the system time on the KMS host is more than 4 hours." (Step 8).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where in the chain did it break?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What should be true&lt;/th&gt;
&lt;th&gt;Typical symptom when it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Symptom captured&lt;/td&gt;
&lt;td&gt;Which machine, product, code, network, since when&lt;/td&gt;
&lt;td&gt;"Activation is broken" with no code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Client is a KMS client&lt;/td&gt;
&lt;td&gt;GVLK installed (&lt;code&gt;VOLUME_KMSCLIENT&lt;/code&gt;), right edition&lt;/td&gt;
&lt;td&gt;MAK, retail, or the wrong edition's key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Client events read&lt;/td&gt;
&lt;td&gt;Event 12288 names the host and the result&lt;/td&gt;
&lt;td&gt;Nobody opened the Application log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. DNS answers&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;_vlmcs._tcp&lt;/code&gt; in the client's zone points at a live, current host&lt;/td&gt;
&lt;td&gt;SRV record for the retired server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Port open&lt;/td&gt;
&lt;td&gt;The client reaches TCP 1688 on that host&lt;/td&gt;
&lt;td&gt;Works on the LAN, fails from the server VLAN or VPN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Host healthy&lt;/td&gt;
&lt;td&gt;Licensed, sppsvc running, listening, publishing, supports this OS&lt;/td&gt;
&lt;td&gt;New host never activated, or too old for Server 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Count met&lt;/td&gt;
&lt;td&gt;25 for Windows clients, 5 for servers and Office&lt;/td&gt;
&lt;td&gt;Count stuck at 1 after a new image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Time&lt;/td&gt;
&lt;td&gt;Client and host within four hours (UTC)&lt;/td&gt;
&lt;td&gt;VM restored from an old checkpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Office&lt;/td&gt;
&lt;td&gt;Office VL pack on the host, Office client set up&lt;/td&gt;
&lt;td&gt;Windows activates, Office doesn't&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Other paths&lt;/td&gt;
&lt;td&gt;AD-based activation, Azure KMS, activation type known&lt;/td&gt;
&lt;td&gt;Domain clients use AD; Azure VMs can't reach Azure's KMS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11. Change&lt;/td&gt;
&lt;td&gt;Only after Steps 1-10 agree: one link, one change&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/skms&lt;/code&gt; on every machine, same stale record&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1: Capture the symptom (read-only)
&lt;/h2&gt;

&lt;p&gt;Write these on the ticket first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which machines, and how many&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One machine is a client problem; a whole OU, VLAN, or image is DNS, the host, the count, or the image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which product&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Windows (&lt;code&gt;slmgr.vbs&lt;/code&gt;) and volume Office (&lt;code&gt;ospp.vbs&lt;/code&gt;) activate separately against the same host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The exact code and text from &lt;code&gt;slmgr /ato&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Settings page wording varies; the code doesn't (table below)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OS edition and build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A new OS needs a host that supports it (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which network&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LAN, VPN, a server VLAN, Azure. Microsoft: "The KMS host must reside on your local network."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Since when, and what changed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;KMS host retired or rebuilt, DNS zone change, new image, firewall change, VM restore&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Run activation once, from an elevated prompt, and copy the full message. Microsoft on &lt;code&gt;/ato&lt;/code&gt;: "For systems that have a Generic Volume License Key (GVLK) installed, /ato prompts a KMS activation attempt." It also says "KMS activation doesn't require elevated privileges." Elevate anyway so the rest of this post's commands work (our habit).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Low-risk (one activation attempt, which also logs Events 12288 and 12289). Copy the full result
cscript %windir%\system32\slmgr.vbs /ato
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The codes, each from Microsoft's error-code table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Microsoft's text&lt;/th&gt;
&lt;th&gt;Usually points at (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0xC004F074&lt;/td&gt;
&lt;td&gt;"No Key Management Service (KMS) could be contacted."&lt;/td&gt;
&lt;td&gt;Every host it tried failed; Event 12288 says why (Step 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8007232B&lt;/td&gt;
&lt;td&gt;"DNS name does not exist."&lt;/td&gt;
&lt;td&gt;No &lt;code&gt;_vlmcs&lt;/code&gt; SRV record in the zones the client searches (Step 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x8007007B&lt;/td&gt;
&lt;td&gt;"0x8007007b DNS name does not exist."&lt;/td&gt;
&lt;td&gt;Microsoft: "This issue can occur if the KMS client can't find the KMS SRV resource records in DNS." (Step 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x800706BA&lt;/td&gt;
&lt;td&gt;"The RPC server is unavailable."&lt;/td&gt;
&lt;td&gt;Microsoft's causes: the host's firewall and "DNS SRV records are stale." (Steps 4, 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0xC004F038&lt;/td&gt;
&lt;td&gt;"The count reported by your Key Management Service (KMS) is insufficient."&lt;/td&gt;
&lt;td&gt;Below 25 clients or 5 servers (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0xC004F06C&lt;/td&gt;
&lt;td&gt;"The Key Management Service (KMS) determined that the request timestamp is invalid."&lt;/td&gt;
&lt;td&gt;Clock skew (Step 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0xC004F039&lt;/td&gt;
&lt;td&gt;"The Key Management Service (KMS) is not enabled."&lt;/td&gt;
&lt;td&gt;Microsoft: "This issue occurs when KMS doesn't respond to a KMS request." (Step 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0xC004F041&lt;/td&gt;
&lt;td&gt;"The Software Protection Service determined that the Key Management Server (KMS) is not activated."&lt;/td&gt;
&lt;td&gt;Microsoft: "This issue occurs when the KMS host hasn't been activated." (Step 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0xC004F042&lt;/td&gt;
&lt;td&gt;"The Software Protection Service determined that the specified Key Management Service (KMS) cannot be used."&lt;/td&gt;
&lt;td&gt;Wrong host for this product: "This scenario is common in mixed environments with application-specific and operating system-specific KMS hosts." (Steps 6, 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then branch on what you see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it usually means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Start at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Every machine fails since the old host was retired&lt;/td&gt;
&lt;td&gt;Stale &lt;code&gt;_vlmcs&lt;/code&gt; record, new host not published&lt;/td&gt;
&lt;td&gt;Steps 3, 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only the newest OS fails (Server 2025, latest Windows 11)&lt;/td&gt;
&lt;td&gt;Host OS or CSVLK too old, or missing the required update&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only one VLAN, site, or the VPN fails&lt;/td&gt;
&lt;td&gt;TCP 1688 blocked, or a different DNS zone&lt;/td&gt;
&lt;td&gt;Steps 4, 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clients fail with 0xC004F038, host count stuck low&lt;/td&gt;
&lt;td&gt;Threshold not met, or duplicate CMIDs from the image&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One VM fails after a restore&lt;/td&gt;
&lt;td&gt;Clock more than four hours off&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows activates, Office doesn't&lt;/td&gt;
&lt;td&gt;Office VL pack missing on the host&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An Azure VM fails&lt;/td&gt;
&lt;td&gt;Azure's KMS endpoint or a forced-tunnel route&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A home or personal PC shows 0xC004F074&lt;/td&gt;
&lt;td&gt;Not a KMS problem in your network: a volume key on a device that never belonged to one (Step 10)&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2: Read what the client thinks it is (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's KMS guidelines start here: "To see verbose output from the Software Licensing service, open an elevated Command Prompt window, or PowerShell window, and run slmgr.vbs /dlv." &lt;code&gt;/dlv&lt;/code&gt; will "Display detailed license information." and "This operation doesn't require elevated privileges."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only (writes local files). Detailed and short license info, plus the expiration date
&lt;/span&gt;&lt;span class="gp"&gt;cscript %windir%\system32\slmgr.vbs /dlv &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;C:&lt;span class="se"&gt;\T&lt;/span&gt;emp&lt;span class="se"&gt;\d&lt;/span&gt;lv-client.txt
&lt;span class="go"&gt;cscript %windir%\system32\slmgr.vbs /dli
cscript %windir%\system32\slmgr.vbs /xpr
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/xpr&lt;/code&gt; will "Display the activation expiration date for the product." and Microsoft adds that it's "primarily useful for KMS clients, because MAK and retail activation is perpetual." What to read in &lt;code&gt;/dlv&lt;/code&gt; (field names from Microsoft's guidelines):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What it tells you (Microsoft's text unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;"The Name tells you which edition of Windows the system is using."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;VOLUME_KMSCLIENT&lt;/code&gt; is a KMS client. "If you see a different value here, such as MAK, you must reinstall the GVLK to configure this system as a KMS client."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Partial Product Key&lt;/td&gt;
&lt;td&gt;"The Partial Product Key determines whether the KMS Client Setup Key matches the OS the KMS client is using."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License Status&lt;/td&gt;
&lt;td&gt;"For a system activated by KMS, this value should be Licensed." Grace means it hasn't reached a host yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KMS Machine Name from DNS&lt;/td&gt;
&lt;td&gt;"The KMS Machine Name from DNS shows both the FQDN of the KMS host that the client successfully used for activation and which TCP port it used to communicate."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KMS Host Caching&lt;/td&gt;
&lt;td&gt;"If the client can't contact the cached KMS host, it queries DNS to discover a new KMS host."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client Machine ID (CMID)&lt;/td&gt;
&lt;td&gt;"The CMID should be unique in every KMS client that the KMS host is able to activate." (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The same data from WMI, which is easier to compare across machines (class and property names from Microsoft's SoftwareLicensingProduct and SoftwareLicensingService pages; the filter is ours):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. The Windows license that has a key installed, then the client-side KMS settings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SoftwareLicensingProduct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PartialProductKey IS NOT NULL"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Windows*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LicenseStatus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;GracePeriodRemaining&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PartialProductKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;KeyManagementServiceMachine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;KeyManagementServicePort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;DiscoveredKeyManagementServiceMachineName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DiscoveredKeyManagementServiceMachinePort&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SoftwareLicensingService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ClientMachineID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;KeyManagementServiceHostCaching&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;LicenseStatus&lt;/code&gt; values, from Microsoft's SoftwareLicensingProduct page: 0 Unlicensed, 1 Licensed, 2 OOBGrace, 3 OOTGrace, 4 NonGenuineGrace, 5 Notification, 6 ExtendedGrace. &lt;code&gt;DiscoveredKeyManagementServiceMachineName&lt;/code&gt; "Specifies the last discovered KMS host name through DNS." &lt;code&gt;KeyManagementServiceMachine&lt;/code&gt; is the host set by hand; empty means auto-discovery (our reading of "Returns null if SetKeyManagementServiceMachine has not been called.").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where the client looks, in order.&lt;/strong&gt; Microsoft's timing and discovery reference lists it: the SKU-specific &lt;code&gt;KeyManagementServiceName&lt;/code&gt; registry value, the AppID-specific value, the global value, the "SKU-specific cached KMS host", then "DNS auto-discovery (weight and priority honored)". And: "If a cached KMS does not respond, discovery is performed." A forgotten &lt;code&gt;/skms&lt;/code&gt; from years ago sits at the top of that list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;:: Read-only. A hand-set KMS host or port on this client (no value = auto-discovery;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;error &lt;span class="k"&gt;if &lt;/span&gt;absent is expected&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform" /v KeyManagementServiceName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform" /v KeyManagementServicePort
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's registry reference on that value: "Set this value to force the use of a specific KMS host by the KMS client." The SKU- and AppID-specific copies live in subkeys under the same path (Microsoft's reference); &lt;code&gt;reg query&lt;/code&gt; with &lt;code&gt;/s&lt;/code&gt; reads them too (our form).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Description says MAK or RETAIL&lt;/td&gt;
&lt;td&gt;Not a KMS client; KMS isn't involved&lt;/td&gt;
&lt;td&gt;Step 10, or install the right GVLK (Step 11)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name shows a Home edition&lt;/td&gt;
&lt;td&gt;Microsoft's KMS client setup key tables list no Home edition, so KMS can't activate it (our reading)&lt;/td&gt;
&lt;td&gt;Step 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;KeyManagementServiceName&lt;/code&gt; set to an old host&lt;/td&gt;
&lt;td&gt;Pinned to the retired server; DNS never consulted&lt;/td&gt;
&lt;td&gt;Step 11: &lt;code&gt;/ckms&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;DiscoveredKeyManagementServiceMachineName&lt;/code&gt; is the retired host&lt;/td&gt;
&lt;td&gt;The last host it found; DNS may still hand it out&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LicenseStatus 1, ticket says not activated&lt;/td&gt;
&lt;td&gt;Look at the right product: Office or another edition&lt;/td&gt;
&lt;td&gt;Step 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same CMID on two machines&lt;/td&gt;
&lt;td&gt;Image not generalized&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 3: Read Events 12288 and 12289 on the client (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's fix for 0xC004F074 starts in this log: "Open the Application Event Log." and "Identify each event associated with the activation attempt that has an Event ID of 12288." Microsoft's known-issues page names the source: "Except for KMS events that have event ID 12290, Windows logs all activation events to the Application event log under the event provider name Microsoft-Windows-Security-SPP."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. Activation requests (12288) and host responses (12289) on this client, newest first&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Application'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ProviderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Microsoft-Windows-Security-SPP'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12288&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12289&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How to read them (Microsoft's text; the field order is our reading of Microsoft's sample event):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;What it says&lt;/th&gt;
&lt;th&gt;What to read&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;12288&lt;/td&gt;
&lt;td&gt;"The client has sent an activation request to the key management service machine."&lt;/td&gt;
&lt;td&gt;The Info line: the first value is the result code, then the host FQDN and port it tried (Microsoft's sample shows &lt;code&gt;0xC004F06C, 0x00000000, &amp;lt;KMS Host FQDN&amp;gt;:1688, ...&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12288 with no 12289&lt;/td&gt;
&lt;td&gt;"If you see only event ID 12288 without a corresponding event ID 12289, either the KMS client couldn't reach the KMS host, the KMS host didn't respond, or the client didn't receive the host's response."&lt;/td&gt;
&lt;td&gt;Steps 4-6: name, port, host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12288 and 12289&lt;/td&gt;
&lt;td&gt;"A failed activation or reactivation might also have both events."&lt;/td&gt;
&lt;td&gt;12289's result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12289&lt;/td&gt;
&lt;td&gt;"Activation Flag, which indicates whether the activation succeeded (1) or failed (0)." It also shows the "Current Count on the KMS Host"&lt;/td&gt;
&lt;td&gt;Step 7 if the count is low&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft's known-issues checklist for 12289: "Is the result code 0? Anything else is an error." Then "Is the KMS host name in the event correct?" and "Is the KMS port correct?" To turn a result code into words, Microsoft: "IT pros can run Slui.exe to display a description of most activation-related error codes."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. Describe a result code taken from the 12288 or 12289 Info line (code is an example)
slui.exe 0x2a 0xC004F06C
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;12288 names the retired host&lt;/td&gt;
&lt;td&gt;DNS or the cache still hands it out&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12288 names the right host, no 12289&lt;/td&gt;
&lt;td&gt;Port, firewall, or the host itself&lt;/td&gt;
&lt;td&gt;Steps 5, 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Result 0xC004F06C&lt;/td&gt;
&lt;td&gt;Timestamp invalid: clock skew&lt;/td&gt;
&lt;td&gt;Step 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Result 0xC004F038 in 12289, low count shown&lt;/td&gt;
&lt;td&gt;Threshold not met&lt;/td&gt;
&lt;td&gt;Step 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Result 0xC004F042&lt;/td&gt;
&lt;td&gt;That host can't activate this product&lt;/td&gt;
&lt;td&gt;Steps 6, 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No 12288 at all after &lt;code&gt;/ato&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The client found no host to ask: DNS (0x8007232B)&lt;/td&gt;
&lt;td&gt;Step 4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 4: What does DNS hand this client? (read-only)
&lt;/h2&gt;

&lt;p&gt;KMS clients find hosts through SRV records. Microsoft's guidelines: "The KMS clients use Domain Name System (DNS) SRV records ( _vlmcs._tcp) to identify the KMS host." And, from the DNS troubleshooting guide: "If the wizard queries DNS and does not find the DNS entry for the KMS host computer, the wizard reports an error." Microsoft's own read is &lt;code&gt;nslookup -type=all _vlmcs._tcp&amp;gt;kms.txt&lt;/code&gt;; asking for SRV only is the same lookup with less output (our form, &lt;code&gt;-type=&lt;/code&gt; per Microsoft's nslookup page):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. SRV records the client's resolver returns for its own suffix, then for a named zone (zone is an example)
nslookup -type=srv _vlmcs._tcp
nslookup -type=srv _vlmcs._tcp.contoso.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's expected answer looks like &lt;code&gt;_vlmcs._tcp.contoso.com SRV service location:&lt;/code&gt; followed by priority, weight, &lt;code&gt;port = 1688&lt;/code&gt; and &lt;code&gt;svr hostname = kms-server.contoso.com&lt;/code&gt;. Then check that each target is a live host on the current address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. Every KMS SRV record for the zone, then each target's address (zone is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$srv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'_vlmcs._tcp.contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SRV&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'SRV'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$srv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NameTarget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Priority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Weight&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$srv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NameTarget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DnsOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The suffix the client searches.&lt;/strong&gt; Microsoft: "If the nslookup command finds the KMS host, it does not mean that the DNS client can find the KMS host." Its next check: "Verify that the search list of the primary DNS suffix contains the DNS domain suffix that is associated with the KMS host." The zone a client searches is its primary DNS suffix or, for domain members, "the computer's domain as assigned by the DNS system (such as Active Directory Domain Services (AD DS) DNS)"; for workgroup machines it's the DHCP-assigned domain (Microsoft's guide).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. Primary DNS suffix, suffix search list, and DNS servers this client uses
ipconfig /all
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. The suffix search list as PowerShell sees it&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsClientGlobalSetting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SuffixSearchList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;UseSuffixSearchList&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;On the DNS server, read the records themselves.&lt;/strong&gt; A retired host's record stays until someone removes it. Microsoft's known-issues page on a failed host: "If the new host has a different computer name, you can manually remove the DNS SRV RR of the failed host or (if scavenging is enabled in DNS) let DNS automatically remove it." If scavenging is on and the record is still there, &lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt; covers why.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On a DNS server: the _vlmcs SRV records in the zone, with their timestamps (zone is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerResourceRecord&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ZoneName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'_vlmcs._tcp'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RRType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Srv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HostName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeToLive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Target'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RecordData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DomainName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Port'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RecordData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;RecordData&lt;/code&gt; field names are our reading (read them with &lt;code&gt;Format-List *&lt;/code&gt; first). A &lt;code&gt;Timestamp&lt;/code&gt; means the record was registered dynamically; an empty one means static (our reading, from DNS aging). Microsoft on registration: "By default, a KMS host server dynamically registers a DNS SRV record one time every 24 hours." A dynamic record that stopped refreshing a day after the host died is the retired-host fingerprint (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More hosts than you think.&lt;/strong&gt; Microsoft: "DNS returns the list of KMS hosts in a random order." and "If the session setup fails, the client randomly picks another KMS host." 0xC004F074 means all of them failed. Extra hosts also split the count: Microsoft warns "if there are too many KMS hosts available to the clients (either legitimate or unsupported systems), then the count might be distributed over all of them."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No SRV record (0x8007232B)&lt;/td&gt;
&lt;td&gt;The host never published, or publishes to another zone&lt;/td&gt;
&lt;td&gt;Step 6: DNS publishing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SRV record targets the retired host&lt;/td&gt;
&lt;td&gt;Stale record (Microsoft's "incorrect or old" cause)&lt;/td&gt;
&lt;td&gt;Step 11: remove it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SRV record right, A record old&lt;/td&gt;
&lt;td&gt;Host moved; its A record didn't&lt;/td&gt;
&lt;td&gt;Step 11: fix the A record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Record in &lt;code&gt;corp.contoso.com&lt;/code&gt;, clients search &lt;code&gt;contoso.com&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Different zones&lt;/td&gt;
&lt;td&gt;Step 11: multi-domain publishing or &lt;code&gt;/skms-domain&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An unknown host in the list&lt;/td&gt;
&lt;td&gt;Someone's lab host or an unsupported system&lt;/td&gt;
&lt;td&gt;Find its owner before deleting anything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;nslookup&lt;/code&gt; finds it, &lt;code&gt;/ato&lt;/code&gt; still says DNS&lt;/td&gt;
&lt;td&gt;Suffix search list&lt;/td&gt;
&lt;td&gt;Step 11: suffix list or &lt;code&gt;/skms-domain&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 5: Can the client reach TCP 1688 on that host? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's 0xC004F074 article gives the test: "use the Test-NetConnection PowerShell cmdlet to check if the port is open between the client and server." Use the host name from Event 12288 or the SRV target:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. From the failing client: TCP 1688 on the KMS host (host name is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;kms01.contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1688&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ComputerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RemoteAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RemotePort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TcpTestSucceeded&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft: "Review the TcpTestSucceeded output parameter. If it's False, it means that port 1688 is blocked between the KMS client and the KMS server." And from the DNS guide: "The firewalls on both the KMS client and the KMS host must allow communication over port 1688." Microsoft's known-issues page adds the network in between: "Make sure that routers do not block traffic using TCP port 1688 (if the default port is used) and that stateful traffic to the KMS client is allowed."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On the host, read the listener and its firewall rule.&lt;/strong&gt; Microsoft: "By default, the KMS host has a firewall exception for KMS, but this exception isn't automatically enabled." Microsoft's host setup page uses the rule name &lt;code&gt;SPPSVC-In-TCP&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the KMS host: is anything listening on 1688, and is the KMS firewall rule enabled and for which profiles?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetTCPConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1688&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OwningProcess&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SPPSVC-In-TCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Direction&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SPPSVC-In-TCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallPortFilter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LocalPort&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetConnectionProfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InterfaceAlias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NetworkCategory&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A rule enabled only for Domain while the host's NIC is on Public blocks the clients (our reading; &lt;code&gt;Get-NetConnectionProfile&lt;/code&gt; shows the category). Microsoft's guidelines also say "Communication with KMS uses anonymous RPC." and include an inbound TCP 135 rule next to the 1688 one in their firewall example; treat 135 as Microsoft's example, not a documented requirement for every client (our reading). Microsoft's VAMT KMS page: "Clients require RPC over TCP/IP connectivity to the KMS host to successfully activate."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A port other than 1688.&lt;/strong&gt; &lt;code&gt;/sprt&lt;/code&gt; "sets the port on which the KMS host listens for client activation requests. The default TCP port is 1688." Microsoft: "If you change the default port number in the KMS host configuration, also adjust the port number that you use for the resource records."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name vs SRV, without changing anything permanent yet.&lt;/strong&gt; Microsoft's DNS guide isolates the two by pointing one client at the host by name, then by IP, and running &lt;code&gt;/ato&lt;/code&gt; each time: "If these commands resolve the problem, this is an SRV record issue." and, for the IP form, "If these commands resolve the problem, this is most likely a name resolution issue." That sets a registry value on the client, so it's in Step 11 with its undo (&lt;code&gt;/ckms&lt;/code&gt;).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;TcpTestSucceeded&lt;/code&gt; False from one VLAN or the VPN&lt;/td&gt;
&lt;td&gt;Network ACL or firewall between them&lt;/td&gt;
&lt;td&gt;Network change for that one port&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;False from everywhere, host listening&lt;/td&gt;
&lt;td&gt;Host firewall rule disabled or wrong profile&lt;/td&gt;
&lt;td&gt;Step 11: enable the rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nothing listening on 1688&lt;/td&gt;
&lt;td&gt;sppsvc stopped, KMS not enabled, or a different port&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;True, &lt;code&gt;/ato&lt;/code&gt; still 0xC004F074&lt;/td&gt;
&lt;td&gt;The host answers but refuses: licensing, version, count, time&lt;/td&gt;
&lt;td&gt;Steps 6-8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 6: Is the host licensed, publishing, and new enough? (read-only)
&lt;/h2&gt;

&lt;p&gt;Run the same &lt;code&gt;/dlv&lt;/code&gt; on the host. Microsoft's guidelines: "The License Status shows the status of the KMS host system. The value should be Licensed. Any other value means you should reactivate the host." Microsoft's Office host page shows the KMS section of that output: &lt;code&gt;Key Management Service is enabled on this machine&lt;/code&gt;, &lt;code&gt;Current count&lt;/code&gt;, &lt;code&gt;Listening on Port: 1688&lt;/code&gt;, &lt;code&gt;DNS publishing enabled&lt;/code&gt;, &lt;code&gt;KMS priority: Normal&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only (writes one local file). On the KMS host: detailed license info for every installed product (Windows and any Office host keys)
&lt;/span&gt;&lt;span class="gp"&gt;cscript %windir%\system32\slmgr.vbs /dlv all &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;C:&lt;span class="se"&gt;\T&lt;/span&gt;emp&lt;span class="se"&gt;\d&lt;/span&gt;lv-host.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the KMS host: the Software Protection service, KMS settings from WMI, and the KMS registry values&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sppsvc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartType&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SoftwareLicensingService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;KeyManagementServiceListeningPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;KeyManagementServiceDnsPublishing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;KeyManagementServiceLowPriority&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisableDnsPublishing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DnsDomainPublishList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;KeyManagementServiceListeningPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;EnableKmsLowPriority&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's first 0xC004F074 cause is the service: "Check if the sppsvc service is running on the KMS server. If the service is stopped, start it." The registry values, from Microsoft's registry reference: &lt;code&gt;DisableDnsPublishing&lt;/code&gt; "Set this to a non-zero value to block auto-publishing to DNS by the KMS host."; &lt;code&gt;DnsDomainPublishList&lt;/code&gt; lists extra zones and "The KMS home domain is always used, so it is not necessary to include it here."; &lt;code&gt;EnableKmsLowPriority&lt;/code&gt; carries a warning: "Note that on a busy system, this can prevent the KMS host from maintaining a sufficient count."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The host's own log.&lt;/strong&gt; Microsoft: "If you're troubleshooting a client and can't find a corresponding event ID 12290 on the KMS host, then the client isn't connecting to the KMS host." The reasons it lists include "The firewall is blocking TCP 1688." and "The event log is full." And Event 12293: "This event indicates that the host didn't publish the required records in DNS."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the KMS host: recent activation requests (12290) and DNS publishing failures (12293)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Key Management Service'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12290&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12293&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;50&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ListLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Key Management Service'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RecordCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MaximumSizeInBytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogMode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a 12290 from the failing client, Microsoft lists what to read: "The Minimum count needed to activate", "The CMID, which is a unique value on each system.", and "The License State and Time to State Expiration". For 12293, Microsoft's known-issues page: "Domain Name System (DNS) may restrict Write access or may not support dynamic DNS (DDNS)." It also says a second host may not be able to update the existing SRV record unless the SRV default permissions are changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can this host activate this client?&lt;/strong&gt; The CSVLK installed on the host decides which editions it can activate, and the host's OS decides which CSVLKs it can hold (Microsoft's activation versions table). Microsoft: "Updates are required when you want to activate a version of Windows that is newer than the version your KMS host is running." From Microsoft's required-updates table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;KMS host OS&lt;/th&gt;
&lt;th&gt;To activate&lt;/th&gt;
&lt;th&gt;Required update (Microsoft's table)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Windows Server 2022&lt;/td&gt;
&lt;td&gt;Windows Server 2025&lt;/td&gt;
&lt;td&gt;February 13, 2024 - KB5034765 or later cumulative update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Server 2019&lt;/td&gt;
&lt;td&gt;Windows Server 2025&lt;/td&gt;
&lt;td&gt;February 13, 2024 - KB5034768 or later cumulative update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Server 2019&lt;/td&gt;
&lt;td&gt;Windows Server 2022&lt;/td&gt;
&lt;td&gt;June 8, 2021 - KB5003646 or later cumulative update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Server 2016&lt;/td&gt;
&lt;td&gt;Windows Server 2022, Windows Server 2019&lt;/td&gt;
&lt;td&gt;June 8, 2021 - KB5003638 or later cumulative update&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The update is half of it. The host also needs a CSVLK from a group that covers the client: Microsoft's table lists "Volume License for Windows Server 2025" as hostable on Windows Server 2025, 2022 and 2019, and it activates Windows Server 2025 down to 2008 plus current Windows clients. Microsoft's planning page also limits client-OS hosts: "a KMS host running on a Windows client operating system can only activate computers also running client operating systems". The &lt;code&gt;/dlv&lt;/code&gt; Description and Name lines show which CSVLK the host carries (Microsoft's guidelines: "The Description shows you which key is currently installed.").&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;License Status not Licensed&lt;/td&gt;
&lt;td&gt;Host never activated (0xC004F041 on clients)&lt;/td&gt;
&lt;td&gt;Step 11: activate the host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sppsvc stopped&lt;/td&gt;
&lt;td&gt;Microsoft's first cause&lt;/td&gt;
&lt;td&gt;Step 11: start it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No "Key Management Service is enabled" section&lt;/td&gt;
&lt;td&gt;No CSVLK installed; it's just another client&lt;/td&gt;
&lt;td&gt;Step 11: install and activate the CSVLK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No 12290 for the failing client&lt;/td&gt;
&lt;td&gt;Request never arrived: DNS, port, or the log is full&lt;/td&gt;
&lt;td&gt;Steps 4, 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12293 present&lt;/td&gt;
&lt;td&gt;Publishing failed: DNS permissions or no dynamic updates&lt;/td&gt;
&lt;td&gt;Step 11: DNS permissions or manual record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;DisableDnsPublishing&lt;/code&gt; = 1&lt;/td&gt;
&lt;td&gt;Publishing off by design; someone owns a manual record&lt;/td&gt;
&lt;td&gt;Step 4: is that record current?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host is Server 2019 with a 2019 CSVLK, client is Server 2025&lt;/td&gt;
&lt;td&gt;CSVLK group too old&lt;/td&gt;
&lt;td&gt;Step 11: a newer CSVLK on a supported host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host is missing the update in the table&lt;/td&gt;
&lt;td&gt;Can't activate the newer OS&lt;/td&gt;
&lt;td&gt;Step 11: patch the host&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 7: Is the count high enough? (read-only)
&lt;/h2&gt;

&lt;p&gt;A host that answers can still refuse to activate. Microsoft's planning page: "Clients activate if the count is 25 or higher. Servers and volume editions of Microsoft Office products activate if the count is five or greater." And: "The KMS only counts unique connections from the past 30 days, and only stores the 50 most recent contacts." Below the threshold, clients get 0xC004F038, and Microsoft's fix is "Add computers to the KMS pool." Microsoft's guidelines on the counter: "If the count is 0, either the service was recently activated or no valid clients are connected to the KMS host."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the KMS host: current count and the minimum this host requires (Windows host license only; filter is ours)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SoftwareLicensingProduct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PartialProductKey IS NOT NULL"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Windows*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsKeyManagementServiceMachine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;KeyManagementServiceCurrentCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RequiredClientCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;KeyManagementServiceTotalRequests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;KeyManagementServiceFailedRequests&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;KeyManagementServiceCurrentCount&lt;/code&gt;: "A value of -1 indicates the host is not enabled as a KMS or that it has not received any client-licensing requests." &lt;code&gt;RequiredClientCount&lt;/code&gt; "Specifies the minimum number of clients that are required to connect to a KMS host to enable volume licensing." The &lt;code&gt;/dlv&lt;/code&gt; cumulative-request section is usually noise; Microsoft: "Generally, this data isn't helpful for troubleshooting." The exception it names: if the count isn't rising, "you should see the number of failed requests increasing."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Count stuck at 1.&lt;/strong&gt; Microsoft's guidelines: "A common issue related to the count happens when the environment has an activated KMS host and enough clients, but the count doesn't increase beyond one." The cause is the image: "If this value isn't unique, it's because the image wasn't correctly configured for distribution using sysprep." Compare CMIDs across two machines from the same image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. CMID on several clients from the same image (computer names are examples; needs WinRM/WMI access)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="s1"&gt;'PC001'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'PC002'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'PC003'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SoftwareLicensingService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PSComputerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ClientMachineID&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's other count cause: "Another reason why the count might not be increasing is that there are too many KMS hosts in the environment and the count is distributed over all of them." Step 4's SRV list shows how many hosts the clients see.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Count under 25, Windows clients failing&lt;/td&gt;
&lt;td&gt;Not enough unique clients in 30 days&lt;/td&gt;
&lt;td&gt;Step 11: wait for the pool, or use AD-based activation or MAK for small sites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Count under 5, servers failing&lt;/td&gt;
&lt;td&gt;Same, for servers&lt;/td&gt;
&lt;td&gt;Step 11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Count stuck at 1 or 2&lt;/td&gt;
&lt;td&gt;Duplicate CMIDs&lt;/td&gt;
&lt;td&gt;Step 11: fix the image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two hosts each with half the count&lt;/td&gt;
&lt;td&gt;Count split across hosts&lt;/td&gt;
&lt;td&gt;Step 11: retire the extra host and its record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Count -1&lt;/td&gt;
&lt;td&gt;KMS not enabled, or no requests yet&lt;/td&gt;
&lt;td&gt;Step 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 8: Are the clocks within four hours? (read-only)
&lt;/h2&gt;

&lt;p&gt;Microsoft's 0xC004F074 article ties the time case to the code in the 12288 Info line: "The error 0xC004F06C listed in the info section may occur if the difference between system time on the client computer and the system time on the KMS host is more than 4 hours." And: "The time zone set on the client computer doesn't affect the activation since it's based on UTC." A VM restored from an old checkpoint, or a host with a dead CMOS battery, is the usual setup (our reading).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. This machine's time source and state, then its offset from the KMS host (host name is an example)
w32tm /query /status
w32tm /stripchart /computer:kms01.contoso.com /dataonly /samples:3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/stripchart&lt;/code&gt; with &lt;code&gt;/dataonly&lt;/code&gt; "Displays the data only, without graphics." Microsoft's fix: "We recommend that you use a Network Time Protocol (NTP) time source or the Active Directory service to synchronize the time between computers." If a domain member's time is wrong, &lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt; is the read-first path for the cause; resync only after you know why it drifted (our habit).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: Office volume activation (read-only)
&lt;/h2&gt;

&lt;p&gt;Volume Office uses the same KMS host but its own client tool. Microsoft: "Any changes you make affect only Office client products. Configure the Windows client separately by using the slmgr.vbs script." The &lt;code&gt;ospp.vbs&lt;/code&gt; script is in &lt;code&gt;Program Files\Microsoft Office\root\Office16&lt;/code&gt; (or &lt;code&gt;Program Files (x86)&lt;/code&gt; for 32-bit Office on 64-bit Windows). Microsoft also notes "The ospp.vbs script doesn't work for Microsoft 365 Apps or subscription versions of Project and Visio." Those aren't KMS-activated, so they're out of this post's scope.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. On the Office client (64-bit Office path shown): license status, KMS activation history, CMID, and an error code's description
cd /d "%ProgramFiles%\Microsoft Office\root\Office16"
cscript ospp.vbs /dstatus
cscript ospp.vbs /dhistorykms
cscript ospp.vbs /dcmid
cscript ospp.vbs /ddescr:0xC004F074
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/dstatus&lt;/code&gt; "Displays license information for installed product keys." and &lt;code&gt;/dhistorykms&lt;/code&gt; "Displays KMS client activation history." On the host, Office needs its own pack and key: "To enable the KMS host computer to activate Office, you must install the Office Volume License Pack and enter your KMS key on the KMS host computer." Microsoft's Office host page also lists the minimum host OS per Office version (for example, Office LTSC 2024 needs "At least Windows Server 2019 or at least Windows 10 (volume editions)"). Step 6's &lt;code&gt;/dlv all&lt;/code&gt; output on the host shows an Office KMS host entry when the pack and key are in place (Microsoft's sample: &lt;code&gt;Name: Office 16, OfficeKMSHostVL_KMS_Host edition&lt;/code&gt;).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;What it means (our reading unless noted)&lt;/th&gt;
&lt;th&gt;Next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No Office entry in the host's &lt;code&gt;/dlv all&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;VL pack or Office CSVLK not installed&lt;/td&gt;
&lt;td&gt;Step 11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Office 0xC004F042&lt;/td&gt;
&lt;td&gt;The host Office reached can't activate this Office version&lt;/td&gt;
&lt;td&gt;Step 11: the right pack on the right host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/dhistorykms&lt;/code&gt; shows an old host name&lt;/td&gt;
&lt;td&gt;Office pinned with &lt;code&gt;/sethst&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Step 11: &lt;code&gt;/remhst&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product is Microsoft 365 Apps&lt;/td&gt;
&lt;td&gt;Not KMS&lt;/td&gt;
&lt;td&gt;Microsoft 365 licensing, not this post&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 10: Other activation paths (read-only)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Active Directory-based activation.&lt;/strong&gt; If the forest has an activation object, domain members with a GVLK activate from AD, not KMS. Microsoft: "If the ADDS object can't be retrieved, client computers use KMS activation." and "The slmgr.vbs /dlv command also indicates if KMS was used." &lt;code&gt;slmgr /ao-list&lt;/code&gt; "Displays all of the activation objects that are available to the local computer." Microsoft calls it "the best option for activating client computers and servers" where every machine is domain joined and supported, but a KMS host is still needed for "Workgroup computers outside the domain".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only. AD activation objects this machine can see
cscript %windir%\system32\slmgr.vbs /ao-list
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;An activation type set by policy.&lt;/strong&gt; &lt;code&gt;/act-type&lt;/code&gt; "sets a value in the registry that limits volume activation to a single type. Activation type 1 limits activation to Active Directory only." A machine limited to type 1 never tries KMS (our reading). The value is &lt;code&gt;VLActivationType&lt;/code&gt; under the product's AppID and SKU subkeys (Microsoft's registry reference); &lt;code&gt;reg query&lt;/code&gt; with &lt;code&gt;/s /f VLActivationType&lt;/code&gt; on the SoftwareProtectionPlatform key finds it (our form).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disjoint namespaces.&lt;/strong&gt; &lt;code&gt;/skms-domain&lt;/code&gt; exists for exactly this: "Use this option, especially in disjoint namespace environments, to force KMS to ignore the DNS suffix search list and look for KMS host records in the specified DNS domain instead."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure VMs.&lt;/strong&gt; Azure VMs activate against Azure's KMS (&lt;code&gt;azkms.core.windows.net:1688&lt;/code&gt; in the public cloud, per Microsoft's table), not yours. Microsoft's forced-tunneling article: "The activation requires that the activation request come from an Azure public IP address." Test that endpoint with Step 5's &lt;code&gt;Test-NetConnection&lt;/code&gt;, from the VM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A device that isn't on the work network, or isn't a work device.&lt;/strong&gt; Microsoft's consumer help lists 0xC004F074 with two causes: "You might see this error if you entered a product key for the Enterprise edition of Windows to activate Windows 11 Home or Windows 11 Pro." and "you're trying to activate your work device but aren't connected to your workplace's network". For an off-network work laptop, connect it (or the VPN) and rerun Steps 4-5. For a personal device, the fix is a key for that edition; Microsoft's KMS guide says "If this is incorrect, obtain a Retail key from the Microsoft Store." Third-party KMS activator tools and public KMS servers aren't a fix: they activate against a host you don't control and outside your licence (our view).&lt;/p&gt;




&lt;h2&gt;
  
  
  Common false starts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What people try&lt;/th&gt;
&lt;th&gt;Why it misleads (our reading unless noted)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;slmgr /skms&lt;/code&gt; on every machine&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/skms&lt;/code&gt; "disables auto-detection of the KMS host." Every pinned machine breaks again when that host moves (Microsoft's failed-host note)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;slmgr /rearm&lt;/code&gt; across the fleet&lt;/td&gt;
&lt;td&gt;"This option resets the activation timers." It doesn't find a host; rearms are limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Installing the KMS host key on clients&lt;/td&gt;
&lt;td&gt;Microsoft: "KMS keys should be installed only on KMS hosts, not on KMS clients."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switching everything to MAK&lt;/td&gt;
&lt;td&gt;Uses up MAK activations to work around a DNS record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rebuilding the KMS host first&lt;/td&gt;
&lt;td&gt;A new host with the old record still in DNS fails the same way&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opening 1688 to the internet&lt;/td&gt;
&lt;td&gt;Microsoft's planning page: "The KMS host must reside on your local network."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deleting every &lt;code&gt;_vlmcs&lt;/code&gt; record&lt;/td&gt;
&lt;td&gt;Removes the working host along with the stale one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A public KMS server or activator script&lt;/td&gt;
&lt;td&gt;Activates against a host you don't control (our view)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 11: Change one link, then prove it
&lt;/h2&gt;

&lt;p&gt;Save what you'll change first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Read-only (writes local files). On the client and on the KMS host: license output and the SoftwareProtectionPlatform key
&lt;/span&gt;&lt;span class="gp"&gt;cscript %windir%\system32\slmgr.vbs /dlv all &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;C:&lt;span class="se"&gt;\T&lt;/span&gt;emp&lt;span class="se"&gt;\d&lt;/span&gt;lv-before.txt
&lt;span class="go"&gt;reg export "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform" C:\Temp\spp-before.reg /y
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only (writes a local file). On a DNS server: the current _vlmcs records (zone is an example)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-DnsServerResourceRecord&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ZoneName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'_vlmcs._tcp'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RRType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Srv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Temp\vlmcs-before.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Host service stopped (Step 6).&lt;/strong&gt; Microsoft's step: "If the service is stopped, start it."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change, on the KMS host. Start the Software Protection service (dry run first)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sppsvc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WhatIf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Host firewall rule disabled (Step 5).&lt;/strong&gt; Microsoft's host setup form, scoped to the profiles your clients use, dry-run first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change, on the KMS host. Enable the built-in KMS rule for Domain and Private (Microsoft's form plus -WhatIf)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SPPSVC-In-TCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Profile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;Private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;True&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WhatIf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Host too old for the client (Step 6).&lt;/strong&gt; Install the update from Microsoft's table, or move the CSVLK to a supported host OS with a CSVLK group that covers the client. Then rerun Step 6's &lt;code&gt;/dlv&lt;/code&gt; on the host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Host not activated (Step 6).&lt;/strong&gt; Microsoft's VAMT KMS page activates the host key with &lt;code&gt;cscript.exe slmgr.vbs /ato&lt;/code&gt; on the host (or by phone with &lt;code&gt;/dti&lt;/code&gt; and &lt;code&gt;/atp&lt;/code&gt;). That's the one place &lt;code&gt;/ato&lt;/code&gt; is a host step (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stale SRV record (Step 4).&lt;/strong&gt; Remove only the record for the retired host. Microsoft's warning on &lt;code&gt;Remove-DnsServerResourceRecord&lt;/code&gt;: "If you do not specify RecordData, the cmdlet deletes all records that match RRtype and Name for the specified zone." For SRV, Microsoft's example passes priority, weight, port, and target in that order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change, on a DNS server. Remove the one SRV record that targets the retired host (zone and target are examples; dry run)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Remove-DnsServerResourceRecord&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ZoneName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RRType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Srv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'_vlmcs._tcp'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RecordData&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'1688'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'kms-old.contoso.com.'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WhatIf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's known-issues page also says to "delete any unnecessary SRV RRs from DNS, and then restart the computers." Clients that cached the old host fall back to discovery when it doesn't answer, per the timing reference; restarting the test client speeds that up (our reading).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No SRV record, DNS without dynamic updates (Steps 4, 6).&lt;/strong&gt; Microsoft's manual record is &lt;code&gt;_vlmcs&lt;/code&gt;, &lt;code&gt;_tcp&lt;/code&gt;, priority 0, weight 0, port 1688, the host's FQDN. Microsoft's PowerShell example for an SRV record uses &lt;code&gt;-Srv -Name -ZoneName -DomainName -Priority -Weight -Port&lt;/code&gt;; with KMS values (our form):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change, on a DNS server. Create the KMS SRV record by hand (zone and host are examples; dry run)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Add-DnsServerResourceRecord&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Srv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'_vlmcs._tcp'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ZoneName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DomainName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'kms01.contoso.com'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Priority&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Weight&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1688&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WhatIf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you create records by hand, Microsoft says to turn off publishing on the hosts: "By disabling publishing, you prevent event logs from collecting failed DNS publishing events." &lt;code&gt;/cdns&lt;/code&gt; will "Disable DNS publishing by the KMS host."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clients in another zone (Step 4).&lt;/strong&gt; Either publish there or point the clients there. Microsoft: "If the KMS host and KMS clients use different DNS zones, you must configure the KMS host to automatically publish its SRV records in multiple DNS domains." That's &lt;code&gt;DnsDomainPublishList&lt;/code&gt; (REG_MULTI_SZ) on the host, then a restart of the Software Protection service: Microsoft: "This operation creates the SRV records." Or, per client or by policy, &lt;code&gt;/skms-domain&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Change, on a client. Look for KMS SRV records in one named zone instead of the suffix list (zone is an example)
cscript %windir%\system32\slmgr.vbs /skms-domain contoso.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Isolate name vs SRV, or bridge while DNS is fixed (Steps 4, 5).&lt;/strong&gt; Microsoft's test, on one client, followed by its undo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;:: Change, on one client (temporary). Point at the host by name, try activation;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then &lt;/span&gt;restore auto-discovery
&lt;span class="go"&gt;cscript %windir%\system32\slmgr.vbs /skms kms01.contoso.com:1688
cscript %windir%\system32\slmgr.vbs /ato
cscript %windir%\system32\slmgr.vbs /ckms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/ckms&lt;/code&gt; "removes the specified KMS host name, address, and port information from the registry and restores KMS autodiscovery behavior." Microsoft on discovery: "We highly recommend that you use the automatic discovery process." If &lt;code&gt;/skms&lt;/code&gt; by name fails, repeat with the host's IPv4 address to split name resolution from the SRV record (Microsoft's sequence).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Count too low (Step 7).&lt;/strong&gt; Wait for more unique clients inside 30 days, or use AD-based activation for domain members. For a small site that will never reach 25 Windows clients, MAK is Microsoft's alternative: "If you cannot install a KMS host or if you cannot use KMS activation, try the Change the product key to an MAK procedure."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duplicate CMIDs (Step 7).&lt;/strong&gt; Fix the image, then the machines already deployed from it. Microsoft: "To reset the client computer ID (CMID) and other product-activation information, run sysprep /generalize or slmgr /rearm." Generalize the reference image before capture, not production machines (our habit). Microsoft's Sysprep page: "Generalizing the image removes computer-specific information such as installed drivers and the computer security identifier (SID)." For machines already deployed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Change, on one deployed client with a duplicate CMID. Reset activation info, restart, then try KMS again
cscript %windir%\system32\slmgr.vbs /rearm
:: restart the machine, then:
cscript %windir%\system32\slmgr.vbs /ato
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Clock skew (Step 8).&lt;/strong&gt; Fix the time source first; then Microsoft's command on the client: "Run the w32tm /resync command to resync the time on the client."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong key type (Step 2).&lt;/strong&gt; For a machine that should be a KMS client, install the GVLK for its edition from Microsoft's KMS client setup keys page with &lt;code&gt;slmgr /ipk&lt;/code&gt;, then &lt;code&gt;/ato&lt;/code&gt;. Microsoft on &lt;code&gt;/ipk&lt;/code&gt;: "If a key is already installed, it's silently replaced." Note the current key type in the ticket before you replace it (our habit).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Office (Step 9).&lt;/strong&gt; On the host, the Office Volume License Pack and the Office KMS key. On a client pinned to an old host, Microsoft's &lt;code&gt;/remhst&lt;/code&gt; "Removes the KMS host name and resets the port to the default (1688)." Then &lt;code&gt;cscript ospp.vbs /act&lt;/code&gt; and &lt;code&gt;/dhistorykms&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then prove it.&lt;/strong&gt; On the client, one activation and the two events; on the host, the matching 12290 and a count that moved:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;:: Low-risk. On the client: one activation, then the license state (expect License Status: Licensed)
cscript %windir%\system32\slmgr.vbs /ato
cscript %windir%\system32\slmgr.vbs /dli
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Read-only. On the client: the newest 12288/12289 pair. On the host: the newest 12290 entries&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Application'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ProviderName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Microsoft-Windows-Security-SPP'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12288&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12289&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Key Management Service'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12290&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 12289 should show Activation Flag 1 (Microsoft: "whether the activation succeeded (1) or failed (0)"), and &lt;code&gt;/dlv&lt;/code&gt; should show the expected host under KMS Machine Name from DNS. Then the next machine from the same VLAN, image, or site, because one machine passing doesn't clear the others (our habit).&lt;/p&gt;




&lt;h2&gt;
  
  
  When a change is justified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SRV record for a retired host&lt;/td&gt;
&lt;td&gt;Remove that one record (&lt;code&gt;-RecordData&lt;/code&gt;, &lt;code&gt;-WhatIf&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Deleting every &lt;code&gt;_vlmcs&lt;/code&gt; record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No record, DNS has no dynamic updates&lt;/td&gt;
&lt;td&gt;A manual SRV record and &lt;code&gt;/cdns&lt;/code&gt; on hosts&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/skms&lt;/code&gt; on every machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clients in another zone&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;DnsDomainPublishList&lt;/code&gt; or &lt;code&gt;/skms-domain&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Hand-pinning each client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TCP 1688 blocked&lt;/td&gt;
&lt;td&gt;One rule for 1688 from the client networks&lt;/td&gt;
&lt;td&gt;Opening the host to every network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host too old for the client&lt;/td&gt;
&lt;td&gt;The update from Microsoft's table, or a newer host and CSVLK&lt;/td&gt;
&lt;td&gt;Converting the new servers to MAK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Count stuck at 1&lt;/td&gt;
&lt;td&gt;Fix the image, then reset the deployed machines&lt;/td&gt;
&lt;td&gt;Adding more hosts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clock off by hours&lt;/td&gt;
&lt;td&gt;Fix the time source, then resync&lt;/td&gt;
&lt;td&gt;Rearming&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does error 0xC004F074 mean?&lt;/strong&gt;&lt;br&gt;
"No Key Management Service (KMS) could be contacted." The client tried every KMS host it found or was pointed at, and none activated it. Microsoft's causes: the host's Software Protection service stopped, a network block on TCP 1688, an incorrect or old SRV record in DNS, a clock difference of more than four hours, or a host that doesn't support the client's version. Event 12288 in the client's Application log names the host it tried and the result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I find the KMS server from a client?&lt;/strong&gt;&lt;br&gt;
Run &lt;code&gt;slmgr /dlv&lt;/code&gt; and read KMS Machine Name from DNS, or query DNS with &lt;code&gt;nslookup -type=srv _vlmcs._tcp&lt;/code&gt;. &lt;code&gt;Resolve-DnsName -Name _vlmcs._tcp.&amp;lt;your domain&amp;gt; -Type SRV&lt;/code&gt; shows every published host with its port.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does KMS use TCP or UDP on port 1688?&lt;/strong&gt;&lt;br&gt;
TCP. Microsoft: "Any activation communications that occur between KMS clients and the KMS host use the 1688 TCP port." Test it from the client with &lt;code&gt;Test-NetConnection -ComputerName &amp;lt;host&amp;gt; -Port 1688&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many clients does KMS need before it activates?&lt;/strong&gt;&lt;br&gt;
25 for Windows client editions, 5 for Windows Server and volume Office, counted as unique machines over the past 30 days. Below that, clients get 0xC004F038. A count stuck at 1 usually means duplicate CMIDs from an image that wasn't generalized.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I use slmgr /skms to fix 0xC004F074?&lt;/strong&gt;&lt;br&gt;
As a test on one machine, yes: it splits SRV problems from name and port problems, and &lt;code&gt;/ckms&lt;/code&gt; undoes it. As the fix, no: it turns off auto-discovery, so every pinned machine breaks again when that host changes. Fix the SRV record or the publishing zone instead.&lt;/p&gt;




&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/dns-scavenging-not-working-a-read-first-server-zone-aging-record-timestamp-and-replication-11c6"&gt;DNS Scavenging Not Working&lt;/a&gt; (why a retired KMS host's SRV record can outlive the host)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/active-directory-replication-error-1722-a-read-first-dns-rpc-port-firewall-and-nic-triage-1j65"&gt;Active Directory Replication Error 1722&lt;/a&gt; (the same DNS record and port reads, between domain controllers)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/windows-time-not-syncing-with-domain-controller-a-read-first-w32tm-pdc-emulator-and-vm-time-sync-536d"&gt;Windows Time Not Syncing With Domain Controller&lt;/a&gt; (the clock behind 0xC004F06C and the four-hour rule)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/netlogon-event-id-5719-a-read-first-boot-timing-dns-dc-locator-and-site-triage-3j2a"&gt;Netlogon Event ID 5719&lt;/a&gt; (DNS and the DC locator, when a domain member can't find anything at all)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/adminpackstudio/windows-server-dhcp-not-assigning-ip-addresses-a-read-first-scope-authorization-relay-and-d13"&gt;Windows Server DHCP Not Assigning IP Addresses&lt;/a&gt; (DHCP hands workgroup clients the domain they search for SRV records)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free checklist
&lt;/h2&gt;

&lt;p&gt;Pointing every machine at one KMS host with &lt;code&gt;slmgr /skms&lt;/code&gt; before one client was tested against the fixed SRV record is a change nobody tested where the activations happen. So is a Conditional Access policy enforced before anyone read the report-only results. The free &lt;strong&gt;Conditional Access pre-enforcement checklist&lt;/strong&gt; keeps break-glass accounts, pilot groups, and report-only review on one page:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=kms-activation-error-0xc004f074" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=kms-activation-error-0xc004f074&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the &lt;strong&gt;Intune &amp;amp; M365 Admin Starter Pack&lt;/strong&gt; pairs with this triage: &lt;a href="https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=kms-activation-error-0xc004f074" rel="noopener noreferrer"&gt;https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=aps_first_sale&amp;amp;utm_content=kms-activation-error-0xc004f074&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Admin Pack Studio; not affiliated with Microsoft. Steps 1-10 favor read-only checks: &lt;code&gt;slmgr /dlv&lt;/code&gt;, &lt;code&gt;/dli&lt;/code&gt;, &lt;code&gt;/xpr&lt;/code&gt;, &lt;code&gt;/ao-list&lt;/code&gt;, &lt;code&gt;ospp.vbs /dstatus&lt;/code&gt;, &lt;code&gt;/dhistorykms&lt;/code&gt;, &lt;code&gt;/dcmid&lt;/code&gt;, &lt;code&gt;/ddescr&lt;/code&gt;, &lt;code&gt;slui 0x2a&lt;/code&gt;, &lt;code&gt;Get-CimInstance&lt;/code&gt;, &lt;code&gt;Get-WinEvent&lt;/code&gt;, &lt;code&gt;reg query&lt;/code&gt;, &lt;code&gt;nslookup&lt;/code&gt;, &lt;code&gt;Resolve-DnsName&lt;/code&gt;, &lt;code&gt;ipconfig /all&lt;/code&gt;, &lt;code&gt;Get-DnsClientGlobalSetting&lt;/code&gt;, &lt;code&gt;Get-DnsServerResourceRecord&lt;/code&gt;, &lt;code&gt;Test-NetConnection&lt;/code&gt;, &lt;code&gt;Get-NetTCPConnection&lt;/code&gt;, &lt;code&gt;Get-NetFirewallRule&lt;/code&gt;, &lt;code&gt;Get-NetFirewallPortFilter&lt;/code&gt;, &lt;code&gt;Get-NetConnectionProfile&lt;/code&gt;, &lt;code&gt;Get-Service&lt;/code&gt;, &lt;code&gt;Get-ItemProperty&lt;/code&gt;, and &lt;code&gt;w32tm /query&lt;/code&gt; and &lt;code&gt;/stripchart&lt;/code&gt;. &lt;code&gt;slmgr /ato&lt;/code&gt; makes one activation attempt; output redirection and &lt;code&gt;reg export&lt;/code&gt; write local files. Starting sppsvc, firewall rules, host updates and keys, SRV record changes, &lt;code&gt;/cdns&lt;/code&gt;, &lt;code&gt;DnsDomainPublishList&lt;/code&gt;, &lt;code&gt;/skms&lt;/code&gt;, &lt;code&gt;/skms-domain&lt;/code&gt;, &lt;code&gt;/ckms&lt;/code&gt;, &lt;code&gt;/rearm&lt;/code&gt;, &lt;code&gt;/ipk&lt;/code&gt;, &lt;code&gt;w32tm /resync&lt;/code&gt;, Office packs and &lt;code&gt;ospp.vbs /remhst&lt;/code&gt; are deliberate changes. Change one link at a time, test from the failing network, and check current Microsoft Learn for version-specific behavior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windowsserver</category>
      <category>windows</category>
      <category>sysadmin</category>
      <category>dns</category>
    </item>
  </channel>
</rss>
