SYSVOL not shared, or Group Policy files missing on one controller
A controller is not sharing SYSVOL, so clients that authenticate against it get no Group Policy at all.
What you see
Group Policy applies for some users and not others, depending on which controller they reach. dcdiag fails the sysvolcheck and netlogon tests.
What is actually wrong
DFS Replication for SYSVOL is in a journal wrap or an error state, replication has not completed on a newly promoted controller, or the migration from FRS was never finished.
Codes and articles
Fixes (2)
Resynchronise the affected controller from a healthy one
One controller is affected and at least one is healthy.
Confirm the state.
dcdiag /test:sysvolcheck /test:netlogons /v | Select-String 'passed|failed'net shareGet-WinEvent -LogName 'DFS Replication' -MaxEvents 40 | Format-Table TimeCreated,Id,Message -Wrap
Check the replication state of the SYSVOL group.
Get-CimInstance -Namespace root\microsoftdfs -ClassName DfsrReplicatedFolderInfo | Format-Table ReplicatedFolderName,StateState 4 is normal. State 5 means it is in an error state, and state 2 means initial synchronisation. Anything other than 4 explains the missing share without further investigation.
Set this controller to non-authoritative, so it pulls a fresh copy from a healthy partner.
$dn = (Get-ADDomainController -Identity $env:COMPUTERNAME).ComputerObjectDNSet-ADObject -Identity "CN=SYSVOL Subscription,CN=Domain System Volume,CN=DFSR-LocalSettings,$dn" -Replace @{ 'msDFSR-Enabled' = $false }repadmin /syncall /AdePRestart-Service DFSR
Wait for event 4114, then re-enable.
Get-WinEvent -LogName 'DFS Replication' -MaxEvents 10 | Where-Object Id -eq 4114 | Format-List TimeCreated,MessageRe-enable replication and let it pull.
$dn = (Get-ADDomainController -Identity $env:COMPUTERNAME).ComputerObjectDNSet-ADObject -Identity "CN=SYSVOL Subscription,CN=Domain System Volume,CN=DFSR-LocalSettings,$dn" -Replace @{ 'msDFSR-Enabled' = $true }repadmin /syncall /AdePRestart-Service DFSR
Wait for event 4614 followed by 4604, which is the confirmation that SYSVOL is now shared.
net share | findstr /i "sysvol netlogon"dcdiag /test:sysvolcheck /test:netlogons | Select-String 'passed|failed'
Rebuild SYSVOL authoritatively
Every controller is affected. One copy has to be nominated as correct.
Back up the SYSVOL contents from the controller with the most complete copy, before anything else.
Copy-Item C:\Windows\SYSVOL\domain -Destination D:\sysvol-backup -Recurse -ForceAn authoritative restore discards every other copy. If the one you nominate turns out to be missing policies, this backup is the only route back.
Check every controller's copy before choosing which is authoritative.
Get-ADDomainController -Filter * | ForEach-Object { $n = $_.HostName [PSCustomObject]@{ DC = $n; Policies = (Get-ChildItem "\\$n\SYSVOL\$env:USERDNSDOMAIN\Policies" -ErrorAction SilentlyContinue).Count }}
Stop the DFSR service on every controller.
Get-ADDomainController -Filter * | ForEach-Object { Invoke-Command -ComputerName $_.HostName { Stop-Service DFSR -Force } }On the chosen controller, set msDFSR-options to 1 and Enabled to false, then start DFSR, wait for event 4114, set Enabled true and restart.
$dn = (Get-ADDomainController -Identity $env:COMPUTERNAME).ComputerObjectDNSet-ADObject -Identity "CN=SYSVOL Subscription,CN=Domain System Volume,CN=DFSR-LocalSettings,$dn" -Replace @{ 'msDFSR-Enabled'=$false; 'msDFSR-options'=1 }
Set every other controller non-authoritative and start them, one at a time, confirming each completes before the next.
Wait for event 4602 on the authoritative controller, which confirms the initial sync completed.
Get-ADDomainController -Filter * | ForEach-Object { "$($_.Name): " + (Get-ChildItem "\\$($_.HostName)\SYSVOL\$env:USERDNSDOMAIN\Policies").Count }Related faults
Where this stops. This write-up was written and checked by hand. It says what each step changes, how to confirm it worked and how to reverse it, and anything destructive is flagged before you reach it. If it does not match what your machine is doing, search the Support Centre for the exact code or message — and when something needs a person, get in touch.