Hallo Forum,
dies ist mein erster Beitrag zuvor war ich nur anonymer Nutznieser.
Mein Problem:
Das folgende Powershellskript lässt sich via Aufgabenplanung ausführen, kommt aber nie zum Ende (es steht dann dauerhaft "wird ausgeführt" da) . Das Skript lässt sich in einer Admin Powershell starten und läuft dort problemlos durch (Export OK, Mailversand OK).
In der Aufgabenplanung wird das Skript wie folgt gestartet:
powershell.exe -ExecutionPolicy ByPass -command C:\Backup\Skripte\export.ps1
Der Fehler tritt erst seit der Änderung beim Mailversand auf (zuvor über lokales Relay ohne Auth) und lässt sich auf folgende Zeilen eingrenzen (wenn diese Zeilen auskommentiert sind läuft Skript in der Aufgabenplaung sauber durch - natürlich ohne Mail versand):
$smtpauthpw = Get-Content C:\Backup\Skripte\mailpwcrypted.txt | ConvertTo-SecureString
$smtpauthcred = New-Object System.Management.Automation.PSCredential "mail@domain.tld", $smtpauthpw
Send-MailMessage -encoding ([System.Text.Encoding]::UTF8) -SmtpServer $PSEmailServer -to $BackupMailTo -from $BackupMailFrom -Subject "Backup $BackupName $VMName" -Credential $smtpauthcred -body "Das Backup lieferte folgendes Ergebnis: `r`n Kunde: $BackupName `r`n Virtuelle Maschine: $VMName `r`n Backup Pfad: $BackupPath `r`n Backup Destination: $BackupDestination `r`n Backup Dauer: $BackupDuration `r`n Backup Datenmenge: $BackupSize GB`r`n"
Ich denke es handelt sich um ein Berechtigungsproblem, welches sich nicht über den ByPass schalter lösen lässt. Woran kann es noch liegen?
Einstellungen in der Aufgabenplanung:
Lokaler Administrator, erhöhte Rechte, Kennwort hinterlegt
Hier das komplette Skript:
#Variablen Definition inkl. Ausgabe
$BackupName = "Kunde1"
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Kunde: $BackupName
$VMName = "TestVM"
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Virtuelle Maschine: $VMName
$BackupPath = "E:\" #mit '\' am Ende
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Backup Pfad: $BackupPath
$PSEmailServer = "host.domain.tld"
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Mailserver: $PSEmailServer
$BackupMailTo = "mail@host.domain.tld"
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Mailempfänger: $BackupMailTo
$BackupMailFrom = "backup@kundendomain.de"
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Mailversender: $BackupMailFrom
#Zeitstempel Anfang
$BackupTimestampStart = Get-Date
#Definition Variable Pfad inkl. Ausgabe
$BackupStarttime = Get-Date -f _yyyy-MM-dd_HHmm
$BackupStarttimeString = $BackupStarttime.ToString()+"\"
$BackupDestination = "$BackupPath$VMName$BackupStarttimeString"
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Backup Destination: $BackupDestination
#Alle Verzeichnisse im $BackupPath löschen welche mit dem $VMName beginnen
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Alle Backupverzeichnisse der VM $VMName in $BackupPath löschen
rd -recurse -force "$BackupPath$VMName*"
#Backupverzeichnis anlegen
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Backup Verzeichnis anlegen
md $BackupDestination | Out-Null
#Export starten
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Starte Export von $VMName
#Export-VM -Name $VMName -Path $BackupDestination
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Export von $VMName abgeschlossen
#Zeitstempel Ende
$BackupTimestampStop = Get-Date
#Dauer berechnen und ausgeben
$BackupDuration = ($BackupTimestampStop - $BackupTimestampStart)
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Dauer des Backups: $BackupDuration
#Datenmenge berechnen und ausgeben
$BackupSize = 0
((gci $BackupDestination -Recurse -File) | % { $BackupSize += $_.Length / 1Gb })
#Mailversand vorbereiten
#Die Passwortdatei lässt sich mit folgendem Befehl anlegen (neu Powershell öffnen und eingeben, dann startet der Eingabedialog): (Get-Credential).password | ConvertFrom-SecureString > mailpwcrypted.txt
$smtpauthpw = Get-Content C:\Backup\Skripte\mailpwcrypted.txt | ConvertTo-SecureString
$smtpauthcred = New-Object System.Management.Automation.PSCredential "mail@domain.tld", $smtpauthpw
Send-MailMessage -encoding ([System.Text.Encoding]::UTF8) -SmtpServer $PSEmailServer -to $BackupMailTo -from $BackupMailFrom -Subject "Backup $BackupName $VMName" -Credential $smtpauthcred -body "Das Backup lieferte folgendes Ergebnis: `r`n Kunde: $BackupName `r`n Virtuelle Maschine: $VMName `r`n Backup Pfad: $BackupPath `r`n Backup Destination: $BackupDestination `r`n Backup Dauer: $BackupDuration `r`n Backup Datenmenge: $BackupSize GB`r`n"
Write-Host $(Get-Date -f yyyy-MM-dd_HH:mm:ss): Mail an $BackupMailTo versenden
Danke für eure Hilfe!
Eine Anpassung auf Plaintext Passwort lässt das Skript durchlaufen, allerdings steht es dann im Klartext im Skript. Nich so gut:-)
$smtpauthpw = "supergeheimespasswort" | ConvertTo-SecureString -asPlainText -Force
$smtpauthcred = New-Object System.Management.Automation.PSCredential "mail@host.domain.tld", $smtpauthpw
Send-MailMessage -encoding ([System.Text.Encoding]::UTF8) -SmtpServer $PSEmailServer -to $BackupMailTo -from $BackupMailFrom -Subject "Backup $BackupName $VMName" -Credential $smtpauthcred -body "Das Backup lieferte folgendes Ergebnis: `r`n Kunde: $BackupName `r`n Virtuelle Maschine: $VMName `r`n Backup Pfad: $BackupPath `r`n Backup Destination: $BackupDestination `r`n Backup Dauer: $BackupDuration `r`n Backup Datenmenge: $BackupSize GB`r`n"