A time synchronization GPO, pushed to all my servers back in the Windows Server 2012 days to work around issues/quirks with w32time at the time, forced each machine to query an NTP Chrony server directly, bypassing Active Directory’s native time hierarchy. This workaround survived two migrations (2012 → 2016 → 2022) without ever causing any problems. But it was never really sound. The Kerberos hardening in July 2026 (RC4 deprecation, CVE‑2026‑20833) removed this safety net, and ten years of technical debt came to a head in a matter of hours: failed cross-domain authentication, AD replication returning “Access Denied,” and inaccessible shares.

Infrastructure Context

My personal infrastructure is based on a single Active Directory forest with two trees—an architectural detail that’s important for what follows, and one that I myself had mislabeled for a long time:

  • alpha.lan: forest root domain. Two domain controllers, DC-A1 (root PDC Emulator) and DC-A2.
  • beta.lan: second tree in the same forest. Two controllers, DC-B1 (domain PDC) and DC-B2.

This is not a multi-forest environment with manual approval: it is an automatic, transitive intra-forest tree-root trust (withinforest attribute). This distinction makes all the difference when you need to repair a trust or consider SID filtering.

All DCs are Hyper-V VMs. Two internal time sources serve as upstream NTP references: NTP-1 (10.0.10.10) and NTP-2 (10.0.10.5).

A Word About NTP, the Poor Relative

Before diving into the incident, a detour that isn’t really a detour: NTP is one of the most neglected services in our infrastructure—and one of the most fundamental. You configure it once, it “works,” and you forget about it—until the day it reminds you of itself in the worst possible way.

Yet time is the silent foundation upon which so many things rest:

  • Log correlation. Without a consistent time stamp on all devices—switches, Wi-Fi access points, NAS, hypervisors, firewalls, data centers—it’s impossible to reconstruct an incident. When a switch goes down and a Wi-Fi access point loses connectivity shortly thereafter, it’s the simultaneity of events in the logs that allows us to link cause to effect. If the switch is timestamped at 14:03:12 and the access point at 14:07:40, even though they went down together, the investigation is dead before it even begins.
  • Security. Kerberos, the validity of TLS certificates, MFA tokens, anti-replay windows: everything depends on a reliable, shared time.
  • Consistency of distributed systems — AD replication, clusters, incremental backups.

In short, NTP deserves the same care we give to a core network switch. We think to configure it on network devices, terminals, and NAS devices—and we’re right to do so. But be careful: Windows has its own logic. On a Linux or network device, you specify a source in ntp.conf/chrony.conf and that’s it. In an Active Directory domain, this approach is a trap: forcing an external source on every machine breaks the forest’s native time hierarchy. That’s exactly the mistake I’m about to describe.

The Original Sin: The 2012 “Date and Time” GPO

Back in the days of Windows Server 2012, w32time had a well-deserved reputation for being finicky. To put an end to clock drift, I created a GPO that pushed the following configuration to all server and workstation OUs:

Configure the Windows NTP client:
  NtpServer          = 10.0.10.10
  Type               = NTP        <-- the problem
  CrossSiteSyncFlags = 0
  SpecialPollInterval= 3600

At the time, this “fixed” the problem: each machine would retrieve the time directly from the appliance, period. Except that Type = NTP simply ignores the Active Directory time hierarchy (NT5DS). Every workstation, every member server, and every DC synchronized its clock independently, outside the AD hierarchy.

This GPO survived the migration to 2016, then to 2022. No one ever questioned it—it “worked.” But it wasn’t working: it masked a structural flaw.

Why It Lasted Ten Years

The golden rule: Kerberos tolerates a clock discrepancy of 5 minutes between the client and the KDC. As long as the NTP appliance was responding and the machines remained within that window, the small residual discrepancy between a workstation and its domain controller was absorbed by this tolerance. We were living on a tight margin.

A shaky setup can last for years as long as nothing eats into that margin. A good architecture, on the other hand, is self-correcting:

        External source (NTP-1 / NTP-2)
                 │
        DC-A1  (PDCe forest root)   <-- only “manual” source
                 │
        ┌────────┴─────────┐
     DC-A2              DC-B1  (PDCe beta.lan)   <-- NT5DS, derives from the root PDCe
                            │
                        DC-B2  +  member servers  +  workstations   <-- NT5DS

A single authority at the top, with everything else in NT5DS following the hierarchy. This is exactly what my 2012 GPO prevented.

The trigger: Microsoft steps in in July 2026

What I couldn’t anticipate was the 2026 Kerberos hardening related to CVE‑2026‑20833. Microsoft is phasing out RC4 as the default fallback algorithm in stages:

  • April 2026: The default switches to AES-SHA1 for accounts with encryption types set to null. The default RC4 fallback is disabled. Audit mode is still available via rollback.
  • July 2026: final phase. Audit mode is removed, the RC4DefaultDisablementPhase registry key is ignored, and AES enforcement becomes the only supported behavior.

In practice, this hardening makes Kerberos stricter and less tolerant. What used to “slip through” before—a fallback ticket in RC4, a lenient negotiation on a misconfigured account, a slightly out-of-sync workstation—is now flatly rejected. The 5-minute margin that used to save me has vanished, and the clocks—each disciplined in their own corner by the Type = NTP GPO—have, in some cases, ended up on the wrong side of the tolerance threshold.

The symptoms, in the order they occurred

  1. Loss of access to cross-domain shares: a user on beta.lan could no longer access a resource on alpha.lan. Intra-domain access, however, was working.
  2. klist get krbtgt/ALPHA.LANSTATUS_NO_TRUST_SAM_ACCOUNT (0xc000018b) from a workstation.
  3. AD replication showing “Access Denied” (error 5): DC-B1 could no longer replicate the forest-wide partitions (Configuration, Schema, ForestDnsZones) from the DCs on alpha.lan, although intra-domain replication was successful.
  4. dcdiag /test:CheckSecurityError indicated a “time difference between the client and the domain controllers.”

The Red Herring Trails (the honest part)

This is where the diagnosis gets revealing, because several clues led me—and would have led anyone—down the wrong path.

Red herring #1—RC4. The date fit so perfectly with RC4 enforcement that I initially suspected an enctype issue with the approval. But the error wasn’t KDC_ERR_ETYPE_NOTSUPP: it was a trust account issue. The error code is definitive; intuition isn’t.

Red flag #2 — the trust secret. The STATUS_NO_TRUST_SAM_ACCOUNT error screamed “broken trust key.” Except that nltest /sc_verify returned NERR_Success. Classic pitfall: sc_verify only tests the secure Netlogon channel, not the trust’s inter-realm Kerberos key. The two can differ.

Red flag #3 — the clock offset, DC version. dcdiag reported a “time difference.” But when comparing the actual UTC ([DateTime]::UtcNow) between the DCs in both forests, the difference was… a few milliseconds. dcdiag, when it sees an “Access Denied ,” assumes a skew based on heuristics—it’s not an actual measurement. The DCs were on time.

The real breakthrough came from patiently analyzing the replication metadata and Kerberos tickets, not from a tempting hypothesis.

The Root Cause

Putting the pieces back together:

  • The infrastructure secrets (krbtgt, machine accounts, trust key) were fundamentally sound. Nothing had been corrupted.
  • What set everything off was a clock discrepancy between the two trees—invisible as long as Kerberos tolerated a 5-minute difference, but fatal once the hardening was in place. The clocks, each managed separately by the Type = NTP GPO, no longer had the self-correcting hierarchy that would have kept everyone in sync.
  • And since cross-forest authentication relied on these clocks, its failure blocked AD replication itself—which, as a result, could no longer automatically realign what had drifted. A vicious cycle: replication was down because Kerberos was failing, and Kerberos was failing because the time had drifted without anything to correct it.

The real common thread wasn’t a broken component. It was an invisible technical debt (the 2012 NTP GPO) + a platform change that removed the safety net (the July 2026 Kerberos hardening). The workaround wasn’t a ticking time bomb as long as Kerberos remained permissive; the hardening triggered it, along with two or three other workarounds of the same age.

This is the real lesson: “it suddenly goes haywire” is almost always a symptom of latent technical debt triggered by an external change—not an isolated event.

Remediation

1. Resolve the emergency

Realign trust keys within the intra-forest trust (using the netdom trust … /resetOneSide method with the same /passwordT on both sides—it even works for on-premises replication, since it enforces the value on both sides), followed by a clean cycle of the KDCs and a purge of the SYSTEM account’s tickets:

klist -li 0x3e7 purge
net stop kdc & net start kdc
repadmin /syncall /AdeP

Once the keys were realigned, replication resumed and access to the shares was restored.

2. Fix the Real Culprit: the Time GPO

The fix involves just one setting. In the “Date and Time” GPO, change the member servers and workstations from Type = NTP to Type = NT5DS:

Configure the Windows NTP client:
  Type               = NT5DS
  CrossSiteSyncFlags = 2      (useful for a future DC/GC on a remote site)

Then, the external source must reside only on the forest root PDCe. Best practice is to deploy it via a dedicated GPO, filtered by WMI to target only the PDC, so that it follows the role if it is moved:

WMI filter: SELECT * FROM Win32_ComputerSystem WHERE DomainRole = 5

On the forest root DC only:
  Type      = NTP
  NtpServer = 10.0.10.10,0x8 10.0.10.5,0x8
  reliable  = yes

On test DCs / members / workstations: Type = NT5DS, reliable = no.

3. Verify the hierarchy

w32tm /query /source

Expected healthy state:

  • DC-A1 (root PDC) → 10.0.10.10
  • DC-A2, DC-B1, DC-B2, servers, workstations → the name of their DC, never the appliance’s IP address.

4. Two Virtualization-Specific Safeguards

  • Disable Hyper-V integration time synchronization on domain controller VMs. Otherwise, the host will override the time and bypass the entire hierarchy—which is even more dangerous after a motherboard replacement or a worn-out CMOS battery.
  • Ensure the reliability of upstream sources (NTP-1 / NTP-2): since the entire forest depends on them via the PDCe, ideally at least one should be connected to a stratum-1 source (GPS or equivalent). That’s where true robustness lies, not in multiplying the number of authorities.

To do before final enforcement: the hunt for RC4

Since the July 2026 hardening is what brought everything to light, we might as well use it as an opportunity to take the right fundamental action. The new KDC events (introduced in early 2026) flag residual RC4 usage in the DCs’ System log:

Get-WinEvent -FilterHashtable @{LogName='System';Id=201,202,203,204,205} -MaxEvents 100 |
  Select TimeCreated, Id
  • Empty log → you can safely switch the affected accounts to AES only (msDS-SupportedEncryptionTypes = 0x18).
  • Events present → there are still RC4 dependencies (service accounts, applications, machine accounts restored to null) that must be fixed before Enforcement does it for you, which would result in a service outage.

Key Takeaways

  • A workaround is not a fix. The 2012 workaround “worked” for ten years by masking a structural flaw. The day the platform was hardened, that technical debt came due—all at once.
  • Migrations carry over old settings without questioning them. 2012 → 2016 → 2022: the GPO followed along, invisible, never audited.
  • Error codes take precedence over intuition. RC4, trust, skew: three appealing hypotheses, three red herrings. It was the metadata and the tickets that settled the matter.
  • In AD time, there’s only one rule: a single top level, everything else in NT5DS. Forcing Type = NTP everywhere creates a split-brain clock scenario that’s just waiting for a system crash to fail.
  • NTP isn’t a detail—it’s a foundation. We implement it everywhere—switches, terminals, NAS devices, hypervisors—if only to enable cross-device log correlation. But we don’t apply a chrony.conf recipe to a Windows domain: AD has its own hierarchy, and adhering to it is not optional.

If your infrastructure is still dragging around a “legacy” GPO that pushes a manual time source to anything other than the root domain controller: take advantage of the Kerberos 2026 hardening push to clean it up. It’s five minutes of GPO work today, or an evening of troubleshooting the day Microsoft pulls the next safety net.