Windows Server  ·  critical  ·  Active Directory deep faults

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

SYSVOL not sharedEvent 4614Event 2213netlogon share missingDFSR sysvoldcdiag sysvolcheck failed

Fixes (2)

Resynchronise the affected controller from a healthy one
Elevated PowerShell on the broken controller60 minutesmedium riskreversible

One controller is affected and at least one is healthy.

  1. Confirm the state.

    PowerShell
    dcdiag /test:sysvolcheck /test:netlogons /v | Select-String 'passed|failed'net shareGet-WinEvent -LogName 'DFS Replication' -MaxEvents 40 | Format-Table TimeCreated,Id,Message -Wrap
  2. Check the replication state of the SYSVOL group.

    PowerShell
    Get-CimInstance -Namespace root\microsoftdfs -ClassName DfsrReplicatedFolderInfo | Format-Table ReplicatedFolderName,State

    State 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.

  3. Set this controller to non-authoritative, so it pulls a fresh copy from a healthy partner.

    PowerShell
    $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
  4. Wait for event 4114, then re-enable.

    PowerShell
    Get-WinEvent -LogName 'DFS Replication' -MaxEvents 10 | Where-Object Id -eq 4114 | Format-List TimeCreated,Message
  5. Re-enable replication and let it pull.

    PowerShell
    $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
  6. Wait for event 4614 followed by 4604, which is the confirmation that SYSVOL is now shared.

Confirm it workedSYSVOL and NETLOGON are shared and dcdiag passes both tests.
PowerShell
net share | findstr /i "sysvol netlogon"dcdiag /test:sysvolcheck /test:netlogons | Select-String 'passed|failed'
If you need to undo itThe controller pulls from its partners; nothing local is authoritative during this.
Rebuild SYSVOL authoritatively
Elevated PowerShell2 hourshigh risknot reversible

Every controller is affected. One copy has to be nominated as correct.

  1. Back up the SYSVOL contents from the controller with the most complete copy, before anything else.

    PowerShell
    Copy-Item C:\Windows\SYSVOL\domain -Destination D:\sysvol-backup -Recurse -Force

    An authoritative restore discards every other copy. If the one you nominate turns out to be missing policies, this backup is the only route back.

  2. Check every controller's copy before choosing which is authoritative.

    PowerShell
    Get-ADDomainController -Filter * | ForEach-Object {  $n = $_.HostName  [PSCustomObject]@{ DC = $n; Policies = (Get-ChildItem "\\$n\SYSVOL\$env:USERDNSDOMAIN\Policies" -ErrorAction SilentlyContinue).Count }}
  3. Stop the DFSR service on every controller.

    PowerShell
    Get-ADDomainController -Filter * | ForEach-Object { Invoke-Command -ComputerName $_.HostName { Stop-Service DFSR -Force } }
  4. 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.

    PowerShell
    $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 }
  5. Set every other controller non-authoritative and start them, one at a time, confirming each completes before the next.

  6. Wait for event 4602 on the authoritative controller, which confirms the initial sync completed.

Confirm it workedEvery controller shares SYSVOL and the policy count matches across all of them.
PowerShell
Get-ADDomainController -Filter * | ForEach-Object { "$($_.Name): " + (Get-ChildItem "\\$($_.HostName)\SYSVOL\$env:USERDNSDOMAIN\Policies").Count }
If you need to undo itRestore the backup taken in step one into the authoritative controller's SYSVOL and repeat.

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.