#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : Backups fail -- VSS writer is in a failed state Fix : Identify the failed writer and give the snapshot room to work Source: https://jbtecwiz.com/support/srv-vss-backup Run as : Elevated PowerShell Expect : 45 minutes Risk : medium Reversible : yes WHEN THIS IS THE RIGHT FIX Any VSS backup failure. Work through in order -- restarting services blindly is the usual mistake and it takes the applications with it. HOW TO UNDO IT vssadmin resize shadowstorage back to the previous maxsize if the larger allocation is a problem for capacity. 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 7" 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 ' Backups fail -- VSS writer is in a failed state' -ForegroundColor White Write-Host ' Identify the failed writer and give the snapshot room to work' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: medium Reversible 45 minutes' 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 'List the writers and their state. Note every one that is not Stable with No error.' -Command { cmd.exe /c 'vssadmin list writers' } Invoke-Step -Number 2 -Do 'Check the shadow storage limits. A writer that cannot allocate space fails with a timeout that looks like an application problem.' -Why 'The default association is often a small percentage of the volume. On a busy file server the snapshot fills it and is deleted mid-backup.' -Command { cmd.exe /c 'vssadmin list shadowstorage' } Invoke-Step -Number 3 -Do 'Increase the allocation for the volume being backed up.' -Command { cmd.exe /c 'vssadmin resize shadowstorage /for=D: /on=D: /maxsize=15%' } Invoke-Step -Number 4 -Do 'Clear any stale shadow copies left behind by a previous failure.' -Command { cmd.exe /c 'vssadmin list shadows & vssadmin delete shadows /for=D: /oldest' } Invoke-Step -Number 5 -Do 'Restart only the service that owns the failed writer -- not every VSS service. Map the writer to its service first.' -Why 'The System Writer belongs to Cryptographic Services, the Registry Writer to VSS itself, the SQL writer to SQL VSS Writer. Restarting the wrong one interrupts production for nothing.' -Command { Get-Service | Where-Object { $_.Name -in 'VSS','SWPRV','MSDTC','EventSystem','COMSysApp' } | Format-Table Name, DisplayName, Status -AutoSize } Invoke-Step -Number 6 -Do 'Restart the specific owning service, then re-check the writers.' -Command { cmd.exe /c 'Restart-Service CryptSvc & vssadmin list writers' } Invoke-Step -Number 7 -Do 'If writers stay failed, a restart of the server clears every writer state -- schedule it rather than doing it blind.' -Manual Write-Rule " Confirm it worked" Show-Prose 'All writers report Stable with no error, and a test backup completes.' 'White' Write-Host '' if (-not $DryRun) { cmd.exe /c 'vssadmin list writers | findstr /i "writer name state error"' } 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-vss-backup' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: vssadmin resize shadowstorage back to the previous maxsize if the larger allocation is a problem for capacity.' 'DarkGray' Write-Rule