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
}
}
