Tags: PowerShell, Automatisierung, System-Management
Viele geplante Aufgaben spielen eine wichtige Rolle bei der regelmäßigen Wartung des Systems oder von Anwendungen. Da sie meist zeitgesteuert im Hintergrund laufen, ist meist nicht immer gleich erkennbar, wenn ihre Ausführung scheitert. Mit Hilfe von PowerShell kann man relativ einfach herausfinden, ob Probleme aufgetreten sind.
Grundsätzlich kann man auch auf der GUI der Aufgabenplanung die Historie einer Task einsehen. Dazu öffnet man die Eigenschaften einer Aufgabe und wechselt zur Registerkarte Verlauf. Das Fenster ist jedoch ziemlich klein und lässt sich nicht vergrößern, so dass es mühsam ist, dort Informationen zu finden.
Get-ScheduledTaskInfo
Einige Basisdaten zu einer geplanten Aufgabe kann man mit dem Cmdlet Get-ScheduledTaskInfo abrufen. Dieses verlangt als Argument den Namen der Task, der auch den Pfad enthalten muss. Diesen kann man nach diesem Muster ermitteln:
Get-ScheduledTask -TaskName "*Defender*" | select TaskName, TaskPath
Der obige Aufruf würde alle geplanten Aufgaben für Microsoft Defender anzeigen. Der Ausgabe des Befehls entnimmt man dann die Daten für den Aufruf von Get-ScheduledTaskInfo. In unserem Defender-Beispiel könnte dieser so aussehen:
Get-ScheduledTaskInfo -TaskName "\Microsoft\Windows\Windows Defender\Windows Defender Scheduled Scan"
Aus dem Output des Cmdlets geht hervor, wann die Aufgabe das letzte Mal ausgeführt wurde und welchen Code sie zurückgeliefert hat. Jeder Wert ungleich null deutet auf ein Problem hin. Eine Übersicht über diverse Fehlercodes findet sich auf Microsofts Website.
Der offensichtliche Nachteil dieses Cmdlets besteht darin, dass es nur Auskunft über die letzte Ausführung einer Task gibt. Eine mögliche Fehlermeldung, die in das Logfile geschrieben wurde, sieht man damit auch nicht.
Log auswerten mit Get-WinEvent
Ausführlichere Informationen zu aufgetretenen Fehlern erhält man über die Auswertung des Eventlogs. Zuständig dafür ist das Logfile
Get-WinEvent -LogName "microsoft-windows-taskscheduler/operational"
Dieser Befehl gibt alle Ereignisse für sämtliche Tasks aus, was man bei einer Fehlersuche aber normalerweise nicht möchte. Daher kann man die Logs mit Hilfe einer Hash-Tabelle filtern:
In diesem Beispiel erhalten wir bis zu 500 Einträge, die nach dem 01.02.2023 geschrieben wurden, die einen Fehler dokumentieren (Level 2) und in der Nachricht den Begriff Update enthalten.
Eine bestimmte Task kann man nur über den Inhalt der Nachricht ermitteln, was aber über den Hashtable nicht möglich ist. Diesem Zweck dient daher der anschließende Filter mittels Where-Object, der im obigen Aufruf nach der Zeichenkette "Update" sucht.
Zusammenfassung
Wenn eine geplante Aufgabe nicht läuft wie erwartet, konsultiert man am besten erst das Cmdlet Get-ScheduledTaskInfo. Es liefert ein paar Infos zur letzten Ausführung, darunter den Return-Code.
Wenn diese nicht ausreichen, dann wirft man einen Blick in das Eventlog. Eine Filterung nach bestimmten Aufgaben ist mit PowerShell indes nicht ohne weiteres möglich. Vielmehr muss man dazu den Inhalt der Nachricht durchsuchen.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- GPO mit Active-Directory-Provider von Terraform erstellen und konfigurieren
- ScriptRunner Portal Edition R5: Konfiguration von Abfragen, OpenID-Support, Web-API statt IIS
- WSUS-Bereinigung als geplante Aufgabe ausführen
- Microsoft Graph: Einheitliches (PowerShell)-API für Microsofts Cloud-Dienste
- Benutzer im Active Directory mit Power Automate for Desktop erstellen
Weitere Links