#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : DFSR event 4012 -- replication stopped after exceeding MaxOfflineTimeInDays Fix : Resume replication on a data folder Source: https://jbtecwiz.com/support/srv-dfsr-4012 Run as : Elevated PowerShell on the affected member Expect : 30 minutes plus sync time Risk : medium Reversible : yes WHEN THIS IS THE RIGHT FIX A normal replicated folder. Be aware that resuming will re-replicate deletions that happened while this member was offline. HOW TO UNDO IT Restore from the backup taken in step 2 if convergence removed something needed. This script walks the fix one step at a time and asks before each one. Steps with no command are things you do yourself -- it prints those and waits. Run with -DryRun to print without executing. -------------------------------------------------------------------- NO WARRANTY - USE AT YOUR OWN RISK This script is provided by JbTecWiz as-is and with no warranty of any kind, express or implied. You run it entirely at your own risk. JbTecWiz accepts no liability for any loss or damage arising from its use, including but not limited to data loss, downtime, or configuration changes that turn out to be wrong for your system. You are responsible for reading this script before running it, for satisfying yourself that it suits the machine in front of you, and for having a working backup first. Some steps cannot be undone. -------------------------------------------------------------------- #> [CmdletBinding()] param( # Print every step and command without running anything. [switch]$DryRun, # Do not ask before each step. Read the script first if you use this. [switch]$Unattended ) $ErrorActionPreference = 'Stop' $script:Failed = 0 function Write-Rule { param([string]$Text) Write-Host '' Write-Host ('-' * 70) -ForegroundColor DarkGray if ($Text) { Write-Host $Text -ForegroundColor Cyan } } function Show-Prose { param([string]$Text, [string]$Colour = "Gray") if (-not $Text) { return } $words = $Text -split "\s+"; $line = " " foreach ($w in $words) { if (($line.Length + $w.Length) -gt 74) { Write-Host $line -ForegroundColor $Colour; $line = " " } $line += "$w " } if ($line.Trim()) { Write-Host $line -ForegroundColor $Colour } } function Invoke-Step { param( [int]$Number, [string]$Do, [string]$Why, [scriptblock]$Command, [switch]$Manual, [string]$Shell = "powershell" ) Write-Rule " Step $Number of 4" Show-Prose $Do "White" if ($Why) { Write-Host ""; Show-Prose $Why "DarkGray" } if ($Manual) { Write-Host '' Write-Host ' -> Do this yourself, then press Enter to carry on.' -ForegroundColor Yellow if (-not $Unattended -and -not $DryRun) { [void](Read-Host) } return } Write-Host '' foreach ($l in ($Command.ToString().Trim() -split "`n")) { Write-Host (" " + $l.Trim()) -ForegroundColor Green } Write-Host '' if ($DryRun) { Write-Host " (dry run -- not executed)" -ForegroundColor DarkGray; return } if (-not $Unattended) { $a = Read-Host " Run this step? [Y]es / [S]kip / [Q]uit" if ($a -match "^[Qq]") { Write-Host " Stopped at your request."; exit 0 } if ($a -match "^[Ss]") { Write-Host " Skipped." -ForegroundColor DarkGray; return } } try { & $Command } catch { $script:Failed++ Write-Host (" Step $Number failed: " + $_.Exception.Message) -ForegroundColor Red Show-Prose "The rest of the fix may depend on this. Read the write-up before carrying on." "Red" if (-not $Unattended) { $c = Read-Host " Carry on anyway? [y/N]" if ($c -notmatch "^[Yy]") { exit 1 } } } } Write-Rule Write-Host ' DFSR event 4012 -- replication stopped after exceeding MaxOfflineTimeInDays' -ForegroundColor White Write-Host ' Resume replication on a data folder' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: medium Reversible 30 minutes plus sync time' Write-Host '' Show-Prose 'No warranty. Use at your own risk - JbTecWiz accepts no liability. Read it before you run it, and have a backup.' 'DarkYellow' Write-Rule if (-not $Unattended -and -not $DryRun) { $go = Read-Host ' Ready? [y/N]' if ($go -notmatch "^[Yy]") { Write-Host " Nothing was changed."; exit 0 } } Invoke-Step -Number 1 -Do 'Confirm the state and read which folder is stopped.' -Command { Get-WinEvent -LogName 'DFS Replication' -MaxEvents 30 | Where-Object Id -in 4012,2213,5002 | Format-List TimeCreated, Id, Message } Invoke-Step -Number 2 -Do 'Understand what resuming means: any file deleted on the other members while this one was offline will be deleted here too. If this server has the only copy of something, take a backup of the folder first.' -Why 'DFSR does not merge -- it converges. That is the whole reason it stopped rather than resuming automatically.' -Manual Invoke-Step -Number 3 -Do 'Resume the replicated folder using the volume GUID from the event.' -Command { $d = Get-WmiObject -Namespace root\microsoftdfs -Class DfsrVolumeConfig -Filter "VolumePath='\\\\.\\C:'" $d.ResumeReplication() } Invoke-Step -Number 4 -Do 'Watch the backlog drain.' -Command { dfsrdiag backlog /rgname:"Group" /rfname:"Folder" /smem:SRV01 /rmem:SRV02 } Write-Rule " Confirm it worked" Show-Prose 'The backlog reaches zero and event 4012 stops recurring.' 'White' Write-Host '' if (-not $DryRun) { dfsrdiag replicationstate /all } Write-Rule if ($script:Failed -gt 0) { Write-Host (" Finished with " + $script:Failed + " failed step(s).") -ForegroundColor Yellow Show-Prose 'Read the full write-up at https://jbtecwiz.com/support/srv-dfsr-4012' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: Restore from the backup taken in step 2 if convergence removed something needed.' 'DarkGray' Write-Rule