Mehrere VMs als Datensicherung mit der Powershell exportieren

Manchmal möchte man automatische Backups von VMs in einem Cluster anlegen um zum Beispiel eine schnelle Wiederherstellung zu gewährleisten. Der HyperV Host bietet dafür Befehle, welche diese Arbeiten erledigen.

Schön wäre es, wenn in einem Script nicht nur eine VM exportier würde, sondern viele nacheinander. Außerdem soll noch eine E-Mail Benachrichtigung erfolgen, wenn der Export schief geht.

Das alles erledigt das folgende Script

Abhilfe schafft hier wie so oft die Exchange PowerShell. Der Befehl:

# VMs, die exportiert werden sollen
$VMs = @("VM1", "VM2", "VM3")   # Liste der VM-Namen

# Zielordner für den Export
$ExportPath = "C:\VM_Exports"    # Zielpfad für den Export (sollte ein vorhandener Ordner sein)

# E-Mail-Konfiguration
$SMTPServer = "smtp.deinserver.de"  # SMTP-Server (z.B. Exchange, Google, etc.)
$SMTPPort = 25                      # SMTP-Port 25 ohne SSL
$Sender = "admin@deinedomain.de"    # E-Mail-Adresse des Absenders
$Recipient = "admin@deinedomain.de" # E-Mail-Adresse des Empfängers
$Subject = "Fehler beim Exportieren der VM"
$BodyTemplate = "Es gab einen Fehler beim Exportieren der VM '$VMName'."
$Username = "admin@deinedomain.de"  # Optional, falls SMTP-Authentifizierung benötigt wird
$Password = "deinPasswort"          # Optional, falls SMTP-Authentifizierung benötigt wird

# Funktion zum Senden einer E-Mail
function SendErrorEmail {
    param (
        [string]$VMName
    )
    
    $Body = $BodyTemplate.Replace('$VMName', $VMName)
    
    try {
        # Senden der E-Mail über SMTP auf Port 25 ohne SSL
        Send-MailMessage -From $Sender -To $Recipient -Subject $Subject -Body $Body -SmtpServer $SMTPServer -Port $SMTPPort -UseSsl $false -Credential (New-Object System.Management.Automation.PSCredential($Username, (ConvertTo-SecureString $Password -AsPlainText -Force))) -ErrorAction Stop
        Write-Host "E-Mail wurde gesendet."
    } catch {
        Write-Host "Fehler beim Senden der E-Mail: $_"
    }
}

# Fehlerbehandlung und Export der VMs
foreach ($VMName in $VMs) {
    try {
        # Zielordner für den Export (überprüfen und löschen, falls bereits vorhanden)
        $VMExportPath = Join-Path -Path $ExportPath -ChildPath $VMName

        # Wenn der Exportordner bereits existiert, löschen
        if (Test-Path -Path $VMExportPath) {
            Write-Host "Der Ordner '$VMExportPath' existiert bereits. Lösche den alten Export..."
            Remove-Item -Path $VMExportPath -Recurse -Force
            Write-Host "Der Ordner '$VMExportPath' wurde gelöscht."
        }

        # Erstelle den Ordner für den neuen Export
        New-Item -ItemType Directory -Path $VMExportPath

        # Überprüfe, ob die VM läuft, und stoppe sie, falls sie aktiv ist
        $VM = Get-VM -Name $VMName
        if ($VM.State -eq 'Running') {
            Write-Host "Die VM '$VMName' läuft. Sie wird gestoppt..."
            Stop-VM -Name $VMName -Force -ErrorAction Stop
            Write-Host "Die VM '$VMName' wurde gestoppt."
        }

        # Exportiere die VM
        Export-VM -Name $VMName -Path $VMExportPath -ErrorAction Stop

        # Optional: Ausgabe zur Bestätigung
        Write-Host "Die VM '$VMName' wurde erfolgreich nach '$VMExportPath' exportiert."

    } catch {
        # Fehler behandeln und E-Mail senden
        Write-Host "Fehler beim Exportieren von '$VMName': $_"
        SendErrorEmail -VMName $VMName
    }
}

Diese Seite verwendet Cookies, um die Nutzerfreundlichkeit zu verbessern. Mit der weiteren Verwendung stimmst du dem zu.

Datenschutzerklärung