Jump to content

Powershell: Backupskript läuft nicht in Aufgabenplanung


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Geschrieben

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"
Geschrieben

Um den Fehler abzufangen kannst du es mit Try,Catch probierten

try
{
  # Befehle...
}
catch
{
  $Fehler = "Fehler; Zeile: $($_.InvocationInfo.ScriptLineNumber); $_"
  Write-Host $Fehler
  out-file -FilePath PFAD -Append -Encoding utf8 -InputObject $Fehler
}

Geschrieben

Ohne es genau zu wissen kann es auch damit zusammenhängen, dass ein Start der Powershell den Schalter "-command C:\...ps1" in der dadurch geöffneten PowerShell-Sitzung als Textstring und nicht als auszuführende Skriptdatei behandelt (siehe Hilfe zur powershell.exe). Mit dem Command-Schalter musst du noch ein "&" davor setzen: "-command "& C:\...ps1".

 

Ich habe gute Erfahrungen über die Aufgabenplanung gemacht wenn ich den Aufruf so gemacht habe (und bevorzuge auch diese Methode, weil sie lesbarer ist):

 

powershell.exe -ExecutionPolicy ByPass -File C:\Backup\Skripte\export.ps1

 

Probier das mal. Vielleicht hilft es. :)

Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...