emjot42
Goto Top

Powershell Script bricht ab, wenn im Task Scheduler ausgeführt

Hey Leute,

wie der Titel schon sagt, möchte ich ein Powershell-Script über den Task-Scheduler ausführen. Das Script läuft manuell ausgeführt Fehlerfrei. Es führt einige Git-Aktionen aus und loggt den Fortschritt - im Fehlerfall wird eine E-Mail versandt.
Führe ich das Script jedoch auf einem Windows Server 2016 Datacenter im Task-Scheduler aus, bricht es ab, das Fehlerhandling funktioniert nicht mehr und vor allem auch das Loging. Ich logge eigentlich jede Consolenausgabe (normal und Fehler) die die Ausgeführten Befehle zurückgeben. Ausgeführt auf dem Datacenter wird da jedoch nichts geloggt.
Eigenartigerweise funktioniert das Script auch, wenn ich es im Task Scheduler auf meinem Heimrechner (Win10 Pro) ausführe bei gleichen Einstellungen. Das Script wird unabhängig von der Benutzeranmeldung ausgeführt.

Hier etwas Code

# Hilfsfunktion zum schreiben in die Logdatei (append)
function AppendToFile
{
    param([string]$content)
    [switch]($silent) = $false

    $content | Out-File -FilePath $logFile -Append
    if ($silent -eq $false)
    {
        Write-Output $content
    }
}


# Hilfsfunktion um ein Commando auszuführen, das Ergebnis zu loggen und im Fehlerfall eine Exception zu werfen 
function ExcecuteThrow($command)
{
   # param
    AppendToFile -content ("Execute: " + $command)  
    Invoke-Expression $command -OutVariable exret -ErrorVariable errret
    if ($LastExitCode -ne 0)
    {
        #There was an Error -> throw
        throw ("Failed: " + $errret)  
    } else
    {
        AppendToFile -content $exret
    }
}

try
{
    # Header der Logdatei schreiben
    AppendToFile -content $headerMsg

    # ursprünglichen Pfad merken
    $oldLocation = Get-Location

    # ins Verzeichnis des LIVE-Systems gehen (Mergequelle)
    Set-Location $repopathlive

    # Git-status feststellen und loggen
    ExcecuteThrow "git status"  

    # Falls bereits Dateien für einen commit gestanged wurden, unstage
    ExcecuteThrow "git reset ."  

   # ...

  # ...
} catch 
{
    # Fehlerfall loggen und mail senden
    AppendToFile -content $_ 
    SendEMail $_
    AppendToFile -content "Terminating"  
} finally
{
  # ...
}

Das Fehlerhandling funktioniert über Exceptions (welche ausgelöst werden, wenn ein Befehl nicht mit 0 beendet). Dann wird der Fehlerfall geloggt und beendet. Eigentlich müsste dann im Task Scheduler auch stehen "beendet mit Fehlercode 0x0" oder so. Tut es aber nicht. Es ist, als ob das Exceptionhandling auf dem Datacenter nicht funktioniert.

Da es ja am naheliegend ist - nein, ein Berechtigungsproblem (git oder Directorys) liegt nicht vor.
Vlt. gibt es ja andere Sicherheitseinstellungen im Datacenter, die die Ausführung stören. Ich stehe auf dem Schlauch. Vlt. hat jemand eine Idee?

Viele Grüße,
mj

Content-ID: 4799290841

Url: https://administrator.de/forum/powershell-script-bricht-ab-wenn-im-task-scheduler-ausgefuehrt-4799290841.html

Ausgedruckt am: 27.03.2025 um 08:03 Uhr

emeriks
emeriks 29.11.2022 um 13:22:53 Uhr
Goto Top
Hi,
bist Du sicher, dass der Scheduled Task überhaupt gestartet wird?

Läuft der im Task unter einem anderen Benutzer, als wenn Du es manuell startest?
Execution Policy?

E.
emjot42
emjot42 29.11.2022 um 14:28:31 Uhr
Goto Top
Zitat von @emeriks:

Hi,
bist Du sicher, dass der Scheduled Task überhaupt gestartet wird?

Läuft der im Task unter einem anderen Benutzer, als wenn Du es manuell startest?
Execution Policy?

E.

Ja bin ich. Es loggt ja - aber eben nicht alles! Das ausgeführte command wird geloggt - diese Zeile:
 AppendToFile -content ("Execute: " + $command)   
Die Rückgabe der Ausführung wird nicht geloggt, da kommt nichts an:
Invoke-Expression $command -OutVariable exret -ErrorVariable errret 
Komischerweise funktioniert es, sowohl bei manueller Ausführung (auch auf dem Server) als auch im Task-Scheduler lokal bei mir.
Ich kann auch am Git-Log erkennen, dass die Befehle ausgeführt werden auf dem Server. Eben nur ohne Logging und Fehlerhandling.
Der Catch-Block wird auf dem Server auch nicht ausgeführt und das Script bricht dann mit 0x41306 "Die letzte Ausführung wurde durch den Benutzer beendet" ab. Auf meiner Win10 Pro Maschine greift das Fehlerhandling und das Script wird normal (Code 0x0) beendet!
Crusher79
Crusher79 29.11.2022 um 14:39:54 Uhr
Goto Top
Beispiel

Da haben wir noch ein paar "Schrauben" zum drehen. Benutzer? Nur wenn angemeldet? Höchste Privilegien?

Nicht immer macht alles Sinn. Poste mal deine Scheduler Maske und die vom Server wo es final laufen soll. Normal sollte es sich bei gleicher PS Version ähnlich verhalten. Aber zeig mal was du auf den beiden im Task hinterlegt hast.
emjot42
emjot42 29.11.2022 um 14:51:46 Uhr
Goto Top
Zitat von @Crusher79:

Beispiel

Da haben wir noch ein paar "Schrauben" zum drehen. Benutzer? Nur wenn angemeldet? Höchste Privilegien?

Vielen Dank für deine Antwort. Das meiste ist eigentlich schon gesagt.
Es liegt KEIN Berechtigungsproblem vor. Es läuft in beiden Fällen unter dem selben Nutzer (unabhängig von Anmeldung)

Nicht immer macht alles Sinn. Poste mal deine Scheduler Maske und die vom Server wo es final laufen soll. Normal sollte es sich bei gleicher PS Version ähnlich verhalten. Aber zeig mal was du auf den beiden im Task hinterlegt hast.

Es handelt sich nicht um die gleiche Systemversion. Beim Kunden wo es laufen soll ist es Server 2016 Datacenter in einer VM, bei mir lokal ist es Windows 10 Pro (nicht virtualisiert)
Welchen Teil der Maske willst du denn sehen? Es sind ja mehrere Tabs und ich habe die Einstellungen eigentlich schon vergleichen ...
Powershell scheint in beiden die selbe Version zu haben? Ich nutze jeweils "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
Crusher79
Crusher79 29.11.2022 aktualisiert um 15:36:05 Uhr
Goto Top
Möglich das Script zu zerlegen? Und immer bissel mehr reinzupacken?

SCHED_S_TASK_TERMINATED

    0x00041306

    Die letzte Ausführung der Aufgabe wurde vom Benutzer beendet.

Immer Schritt merhr, um zu sehen wo es hängen bleibt? Timeout? Nur komisch dass es normal nicht kommt.
emjot42
emjot42 29.11.2022 um 16:23:25 Uhr
Goto Top
Zitat von @Crusher79:

Möglich das Script zu zerlegen? Und immer bissel mehr reinzupacken?

SCHED_S_TASK_TERMINATED

    0x00041306

    Die letzte Ausführung der Aufgabe wurde vom Benutzer beendet.

Immer Schritt merhr, um zu sehen wo es hängen bleibt? Timeout? Nur komisch dass es normal nicht kommt.

Ja ich hab mich ein bisschen vorangetastet. Die Abbrüche sind gar nicht das Problem (und eigentlich auch gut, dass sie aufgetreten sind, die muss das Script sowieso behandeln können).
Letztlich liegt das Problem darin, dass der Catch-Block nicht korrekt ausgeführt zu werden scheint und somit das Errorhandling nicht greift. Dann steht im Task-Scheduler Fehler 0x00041306, obwohl selbst im Falle eines "Abbruchs" das Script durch das Fangen der Exception ordentlich beendet werden müsste ...
Crusher79
Crusher79 29.11.2022 aktualisiert um 16:28:09 Uhr
Goto Top
Kommt da zuviel rüber? Typconversion etc.? Hab meine immer so ähnlich gemacht wie hier:

$_ Objekt bietet ja mehr. Hab in Message und ItemName getrennt. Zumindest nur die Message solte ja reichen.

} catch {
    $ErrorMessage = $_.Exception.Message
    $FailedItem = $_.Exception.ItemName	
    "$(Get-Date) - Firewall Deaktivieren $ErrorMessage Item: $FailedItem" | Out-File -FilePath "C:\temp\startup-log.txt" -Append -Force  
}

Ok mit $_.Exception.Message oder $($_.Exception.Message) sollte es auch ohne die Var gehen.
Crusher79
Crusher79 29.11.2022 um 16:32:33 Uhr
Goto Top
Zitat von @emjot42:

Letztlich liegt das Problem darin, dass der Catch-Block nicht korrekt ausgeführt zu werden scheint und somit das Errorhandling nicht greift.

Für kopieren etc. hab ich es oft in die Folgezeile so geschrieben und gelöst:

            Remove-Item "C:\TEMP\backup\db\*" -Recurse -Force -ErrorAction SilentlyContinue  
            if(-not $?) { $Script:MOVEErrorMsg += "`r`n`r`nRemove c:\temp\... Failed: " + $error.exception.message }  

if(-not $?) Fängt hier Fehler ab. Umbrüche nur, damit es im Ticket System schöne aussieht.
Crusher79
Crusher79 29.11.2022 um 16:55:45 Uhr
Goto Top
https://stackoverflow.com/questions/38419325/catching-full-exception-mes ...

Das sollte die Lücken schließen. Das Objekt was zurück kommt ist nicht immer das selbe. Je nachdem wo wir uns bewegen...
emjot42
emjot42 29.11.2022 um 22:17:05 Uhr
Goto Top
Zitat von @Crusher79:

https://stackoverflow.com/questions/38419325/catching-full-exception-mes ...

Das sollte die Lücken schließen. Das Objekt was zurück kommt ist nicht immer das selbe. Je nachdem wo wir uns bewegen...

Ja das stimmt. Wobei in meinem Falle, werte ich ja nur den Rückgabewert eines Befehls aus, werfe dann die Exception selbst mit Typ "String". Letztlich steckt ja .Net dahinter, afaik - also wird es vermutlich eine System.Exception erzeugen mit der entsprechenden Message.
Aber danke auf jeden Fall für die Ideen - ich werde es mal testen. Letztlich ist das eigenartige halt, dass ja auf meinem HeimPC funktioniert wie erwartet, bloß dort eben nicht ...
Crusher79
Crusher79 30.11.2022 um 09:57:11 Uhr
Goto Top
Alles gut. Nur ein Versuch. Schwierig wenn man nicht davor sitzt.

PowerShell Version, Alias kann man ja auch alles anpassen, wenn man möchte. Aber denke mal am PS Profil in den tiefen des Systems hast du wohl kaum rumgedreht.

Pauschal fällt einen bei Servern + PS + externe Dienste noch SSL ein. Aber dann müsste das ein generelles Problem sein. Oder es muss ggf. ja der Internet Explorer/ Edge einmal "aktiviert" sein. Meine die Fragenkataloge beim erseten Aufruf. Sonst lässt es sich nichit steuern. Progamme die die Module nutzen greifen ins leere.

Aber auch hier würde man das in der GUI auch sehen. Bin ratlos. Hatten hier vor ein paar Tagen wen, der unter den richtigen Account alles ausgeführt hat. Nach ein paar Tagen kam er zu dem Schluß, dass er sich immer beim User vertan hat.

Mitunter ist man ja Betriebsblind. Die groben Fehler sind ja meist:
- fehlende Aktivierugn vin IE bei Webrequest
- SSL Handling
- Berechtigungsproblem.
- PS 2 statt PS 5.x (Windows 7 vs Windows 10 z.B.) - Pipen u.ä. verhält sich da oft auch anders.

Außer "Hallo Welt" und testen fällt mir nichts ein ....