Troubleshoot SYSVOL and DFSR Replication Across Domain Controllers
A GPO has directory data in Active Directory and files in SYSVOL. AD replication can be healthy while the files remain different on two DCs. This runbook investigates DFS Replication (DFSR) on Windows Server 2019, 2022, and 2025, beginning with topology and state before any recovery action.
Confirm the Domain Uses DFSR and Map Its DCs
ScopeRecord the failing GPO or logon script, affected clients, first failure time, and which DC each client used. Check SYSVOL migration state and the directory replication baseline. The migration commands below report state; they do not change it. An Eliminated migration state indicates SYSVOL has completed the move from FRS to DFSR. If migration is incomplete, use the migration troubleshooting procedure instead of treating the environment as a completed DFSR deployment.
Import-Module ActiveDirectoryGet-ADDomainController -Filter * | Select-Object HostName, Site, IPv4Address, IsReadOnlydfsrmig /getglobalstatedfsrmig /getmigrationstaterepadmin /replsummaryrepadmin /showrepl DC01repadmin /showrepl DC02❯ What to Verify
Migration state: Eliminated, with all DCs at the consistent state.DC names, sites, and recent AD replication failures are identified.A clean AD replication result does not prove SYSVOL files have converged.Check DFSR Folder State and Share Advertisement
Local DC HealthOn each affected DC, inspect the DFSR service and replicated-folder state. State 4 means Normal; 2 means Initial Sync, 3 Auto Recovery, and 5 In Error. Absence of a SYSVOL instance needs investigation rather than being interpreted as zero backlog. Check the SYSVOL and NETLOGON shares and run the targeted DC tests; these tests cover advertisement and share readiness, rather than comparing every replicated file.
# Run locally on each DC.Get-Service DFSR, NetlogonGet-CimInstance -Namespace root\microsoftdfs ` -ClassName DfsrReplicatedFolderInfo | Where-Object ReplicatedFolderName -eq 'SYSVOL Share' | Select-Object ReplicationGroupName, ReplicatedFolderName, StateGet-SmbShare -Name SYSVOL, NETLOGON -ErrorAction Continuedcdiag /s:DC01 /test:Advertising /test:SysVolCheck /test:NetLogons /v❯ What to Verify
ReplicationGroupName ReplicatedFolderName State-------------------- -------------------- -----Domain System Volume SYSVOL Share 4
Both required shares exist and the targeted tests pass.Read DFSR Events Around the Failure
TimelineRead the full event message and its volume, partner, and folder identifiers. Event 2213 can describe a dirty-shutdown recovery that requires an explicit resume action; follow the instructions in that event after protecting the data. Event 4012 indicates content-freshness protection. Event 4614 indicates waiting for initial synchronization, while 4604 records successful SYSVOL initialization. Preserve the ordering: a historical warning followed by successful recovery is different from a current stalled state.
$since = (Get-Date).AddHours(-6)foreach ($dc in 'DC01', 'DC02') { Get-WinEvent -ComputerName $dc -FilterHashtable @{ LogName = 'DFS Replication' StartTime = $since } -MaxEvents 150 | Select-Object MachineName, TimeCreated, Id, LevelDisplayName, Message}❯ What to Verify
Record the earliest relevant error, the folder state at that time,and whether later events confirm recovery or continued waiting.Measure the Backlog in Both Directions
ConvergenceFor partners that actually replicate with each other, query both directions and repeat over a known interval. A backlog can be normal during policy changes or after a network outage. A stable or growing backlog during an available replication schedule is more useful evidence than one count. A query error means the check failed; it does not mean the backlog is empty. Keep the test interval long enough to include the site’s configured replication availability.
dfsrdiag backlog /rgname:"Domain System Volume" ` /rfname:"SYSVOL Share" /smem:DC01 /rmem:DC02dfsrdiag backlog /rgname:"Domain System Volume" ` /rfname:"SYSVOL Share" /smem:DC02 /rmem:DC01# Repeat later and record counts, errors, and the interval.❯ What to Verify
Both directional queries complete successfully.Pending changes drain during the observation window, or a direction remains stalled.An empty backlog is evidence for this pair and time, not every DC in the domain.Compare One Affected GPO Against Explicit DC Paths
Policy EvidenceUse an affected GPO GUID obtained from Group Policy Management. Read that GPO through each DC and compare its GPT.INI and a specific changed policy or script file through the DC’s explicit SYSVOL path. A domain-based UNC path can use referrals and hide which DC supplied the file. Matching GPT.INI hashes alone do not prove that every file is equal, so include the file that the incident concerns. Never edit either copy as part of this comparison.
Import-Module GroupPolicy$gpoId = '11111111-2222-3333-4444-555555555555' # Real GPO GUIDforeach ($dc in 'DC01', 'DC02') { Get-GPO -Guid $gpoId -Domain contoso.com -Server $dc | Format-List DisplayName, Id, UserVersion, ComputerVersion $gpt = "\\$dc\SYSVOL\contoso.com\Policies\{$gpoId}\GPT.INI" Get-Content -LiteralPath $gpt Get-FileHash -LiteralPath $gpt -Algorithm SHA256}❯ What to Verify
The directory and SYSVOL versions are compared on the named DCs.Hashes and contents of the incident's specific files match or expose a difference.Check the Partner Network and Storage Dependencies
Root CauseCheck partner DNS, RPC endpoint mapper connectivity, available disk space, and time synchronization. A successful TCP 135 probe reaches the endpoint mapper; it does not validate the negotiated dynamic RPC port. Correlate DFSR events with firewall logs, DNS answers, and storage errors. Fix the identified network or storage problem before requesting DFSR recovery. For site-related failures, compare schedules and topology with the AD team.
# Run on DC01; repeat from DC02 toward DC01.Resolve-DnsName DC02.contoso.comTest-NetConnection DC02.contoso.com -Port 135Get-Volume | Select-Object DriveLetter, FileSystem, HealthStatus, SizeRemaining, Sizew32tm /query /statusGet-WinEvent -FilterHashtable @{ LogName = 'System'; StartTime = (Get-Date).AddHours(-6)} -MaxEvents 100 | Select-Object TimeCreated, ProviderName, Id, Message❯ What to Verify
The partners resolve to current addresses and the required RPC path is verified.Storage and time errors are tied to the same incident interval, if present.Apply the Repair That Matches the Observed State
Controlled RecoveryAfter correcting DNS, storage, permissions, or an approved AD configuration change, request an AD configuration poll on the affected DC. This refreshes DFSR’s view of configuration; it does not force file convergence or bypass content freshness. For a current 2213 recovery, use the event’s volume-specific resume instructions. For 4012 or a verified corrupt/inconsistent SYSVOL, stop and use Microsoft’s dedicated recovery procedure with a selected healthy source, backups, and a domain-wide recovery plan.
# On the affected DC, after the approved prerequisite repair:dfsrdiag pollad
Get-CimInstance -Namespace root\microsoftdfs ` -ClassName DfsrReplicatedFolderInfo | Where-Object ReplicatedFolderName -eq 'SYSVOL Share' | Select-Object ReplicatedFolderName, State❯ What to Verify
The chosen repair addresses the identified cause.DFSR returns to Normal and new events show progress rather than repeated failures.Validate Every Affected Site and the Original Client
CloseoutRepeat state, share, backlog, and file comparisons on all affected DCs, not just the repaired member. Test the original client operation after confirming which DC it uses. Refresh Group Policy only on a selected pilot client because the refresh can apply settings immediately. Retain the before/after evidence and add monitoring for stalled initialization, content freshness, persistent backlog, and low free space.
# On the affected pilot client:nltest /dsgetdc:contoso.com /forcegpupdate /target:computergpresult /r /scope computer# Recheck the specific policy/script and its explicit DC file path.❯ What to Verify
Shares are advertised, affected partners converge, policy files agree,and the original client receives the intended policy or logon script.