1 min read

Hyper-V Snapshot Check

Um lokale Snapshots eines Hyper-V-Hosts zu überwachen, gibt es derzeit nur ein Plugin seitens CheckMK, das die offenen Snapshots über den Piggiback-Mechanismus zurückgibt. Dies funktioniert jedoch nur, solange der VM-Name auch mit dem Hostnamen in CheckMK übereinstimmt. Ist dies nicht der Fall, werden auch keine offenen Snapshots angezeigt.

Dieses Script zeigt alle offenen Snapshots auf einem Host an.

Das Skript muss auf dem Host im folgenden Pfad abgelegt werden: "C:\ProgramData\checkmk\agent\local"

Nach einer erneuten Serviceerkennung taucht der Check auf und kann folgende Ausgaben liefern:

Ab wann eine Warnung ausgegeben wird, kann im Script mit der Variable $warningSeconds angepasst werden.

# 22.04.2024
# Sven Stromann - mail@sven-stromann.de
#
# Hyper-V Snapshot Check
#          
# Dieser Check prueft einen Hyper-V Host auf offene Snapshots
# Das Script muss als local Check unter "C:\ProgramData\checkmk\agent\local" abgelegt werden und wird bei der Service-Erkennung automatisch erkannt. 
# 
# Version 0.1
#
# Hyper-V Snapshot Check

$warningSeconds = 86400 #Warnung ab einem Tag
#$warningSeconds = 172800 #Warnung ab zwei Tage

#################################################################################################

# Get all VMs
$vms = Get-VM
$now = Get-Date

# Array to store VM names with open snapshots
$vmNamesWithSnapshots = @()

# Iterate through each VM
foreach ($vm in $vms) {
    # Get open snapshots for the current VM
    $snapshots = Get-VMSnapshot -VMName $vm.Name

    # Check if the VM has open snapshots
    if ($snapshots) {
        $SnapshotAge = [System.Math]::Round(($now.Subtract($snapshots.CreationTime).TotalSeconds), 0) 

        if($SnapshotAge -gt $warningSeconds){

                # Add the VM name to the array
                $vmNamesWithSnapshots += $vm.Name
        }
    }
}

# Convert the array to a comma-separated string
$vmNamesString = $vmNamesWithSnapshots -join ", "

# Output the results
if ($vmNamesWithSnapshots) {
    $status = "1"
    $statusText = "Warning - " + "There are open Snapshots! [$vmNamesString]"
} else {
    $status = "0"
    $statusText = "OK - " + "No open snapshots found."

}

$stringToPost = $status + " " + "Snapshot" + " " + "-" + " " + $statusText
Write-Host $stringToPost