Powershell Skript: VSS Writer Check

Hinweis: Wir haben in diesem Artikel möglicherweise Provisions-Links verwendet und sie durch (*) gekennzeichnet. Erfolgt über diese Links eine Bestellung, erhält maffert.net eine Provision. Es entstehen für Sie keine Nachteile beim Kauf oder Preis.

Da bei einigen Kunden immer mal wieder die Backups aufgrund fehlender oder fehlerhaften VSS Writer fehlgeschlagen sind, habe ich ein Skript erstellt was die VSS Writer abgleicht und den Status abfragt. Das Skript arbeitet wie folgt:

  1. Prüfung auf fehlerhafte VSS Writer
  2. Erstellt eine Ausgabe von „vssadmin list writers“ in einer Log-Datei (zur manuellen späteren Überprüfung)
  3. Alle aktuellen Writer anzeigen und eine Vergleichsdatei erstellen
  4. Writer anzeigen und mit der Vergleichsdatei vergleichen (ob einer fehlt)
########################################################
# von Tobias Maffert - www.maffert.net - 12.2019
########################################################
# Was macht dieser Check:
# Ueberprueft die VSS Writer auf Fehler
# Ueberprueft ob VSS Writer Fehlen
########################################################

Write-Host "VSSWriter Check 1.7"
Write-Host "____________________________"
Write-Host ""

[int]$errorcount = 0

# Pruefe auf Fehlerhafte Writer
if ((Get-UICulture).Name -like "de-*") {
    #$vssadminerror = vssadmin list writers | Select-String -Context 0,4 'Verfassername:'  | Where-Object { $_.Context.PostContext[2].Trim() -ne "Status: [1] Stabil"}
    $vssadminerror = vssadmin list writers | Select-String -Context 0, 4 'Verfassername:' | Where-Object { ($_.Context.PostContext[2].Trim() -ne "Status: [1] Stabil") -and ($_.Context.PostContext[2].Trim() -ne "Status: [5] Warten auf Fertigstellen") }
}
else {
    #$vssadminerror = vssadmin list writers | Select-String -Context 0,4 'Writer name:'  | Where-Object { $_.Context.PostContext[2].Trim() -ne "State: [1] Stable"}
    $vssadminerror = vssadmin list writers | Select-String -Context 0, 4 'Writer name:' | Where-Object { ($_.Context.PostContext[2].Trim() -ne "State: [1] Stable") -and ($_.Context.PostContext[2].Trim() -ne "State: [5] Waiting for completion") } 
} 

if (! $vssadminerror) {
    Write-Host "OK: Keine Fehlerhaften VSS Writer gefunden."
}
else {
    Write-Host "FEHLER: Folgende Fehlerhaften VSS Writer gefunden:"
    $vssadminerror
    $errorcount++
}

# Ausgabe von vssadmin zur manuellen Ueberpruefung
$vssadminlogging = "$Env:WinDir\Temp\vsswriter.log"
Get-ChildItem $vssadminlogging | where-object { $_.Length -gt 104857600 } | Remove-Item -force -ErrorAction SilentlyContinue
Get-Date -Format g | Out-File $vssadminlogging -Append
vssadmin list writers | Out-File $vssadminlogging -Append

# Pruefe auf Fehlende Writer
$file = "$Env:WinDir\Logs\vsswriter_s.txt"
$file2 = "$Env:WinDir\Logs\vsswriter_i.txt"
$file3 = "$Env:WinDir\Logs\vsswriter_i_ex.txt"
Clear-Content "$file2" -ErrorAction SilentlyContinue
if ((Get-UICulture).Name -like "de-*") {
    $vssadminwriter = vssadmin list writers | Select-String -Context 0, 4 'Verfassername:' | Where-Object { $_.Context.PostContext[2].Trim() }
}
else {
    $vssadminwriter = vssadmin list writers | Select-String -Context 0, 4 'Writer name:' | Where-Object { $_.Context.PostContext[2].Trim() }
} 

foreach ($i in $vssadminwriter) {
    $I = $i.tostring()
    $servicestring = $i.split("`r`n") | select -first 1
    $servicename = $servicestring.split('"') | select -first 2 | select -last 1
    $servicename | Out-File $file2 -Append
}

Get-Content $file2 | Where-Object { $_ -notmatch "BITS Writer|VeeamFreezeWriter" } | Set-Content $file3

if (!(Test-Path -path $file)) {
    Write-Host "VSS Vergleichsdatei fehlt, kopiere. Bitte Pruefung wiederholen!"
    Copy-Item $file3 $file
}

$vssna = compare (Get-Content "$file") (Get-Content "$file3") | ForEach-Object { $_.InputObject }
$anzahlvsswriter = (Get-Content -path $file).length

if (! $vssna) {
    Write-Host "OK: Keine Fehlenden VSS Writer gefunden - Anzahl: $anzahlvsswriter."
}
else {
    Write-Host "FEHLER: Folgende VSS Writer Fehlen:"
    $vssna
    $errorcount++
}

# Fehlerbehandlung
if ($errorcount -ge 1) {
    exit 2
}
else {
    exit 0 	
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*