Task Scheduler – Aufgaben automatisieren
Der Windows Task Scheduler automatisiert Skripte und Programme per Zeitplan oder Ereignis – von der GUI bis zur vollständigen PowerShell-Verwaltung.
Was ist der Task Scheduler und wozu brauchst du ihn?
Der Windows Task Scheduler (Aufgabenplanung) ist ein in Windows integrierter Dienst, der Programme, Skripte und Befehle automatisch ausführt – entweder nach Zeitplan oder als Reaktion auf bestimmte Systemereignisse. Für dich als IT-Allrounder in einem KMU ist er eines der wichtigsten Werkzeuge überhaupt: Backup-Skripte, Log-Rotationen, Monitoring-Checks, Benutzerberichte – all das läuft zuverlässig im Hintergrund, ohne dass jemand manuell etwas anstossen muss.
Im Alltag triffst du auf drei typische Szenarien:
- Regelmässige Wartungsaufgaben: Backups, Disk-Cleanup, Antivirus-Updates
- Ereignisgesteuerte Automatisierung: Ein Skript läuft, wenn sich ein User anmeldet oder ein bestimmtes Windows-Ereignis (Event Log) auftritt
- Einmalige geplante Aktionen: Eine Migration, ein Update-Rollout zu einem definierten Zeitpunkt
Den Task Scheduler öffnen
Es gibt drei Wege, die Aufgabenplanung aufzurufen:
Per Ausführen-Dialog:
Drücke Win+R, tippe taskschd.msc und bestätige mit Enter.
Per PowerShell oder CMD:
taskschd.msc
Per Suchfeld:
Startmenü öffnen, „Aufgabenplanung” eingeben, als Administrator starten.
Die Oberfläche zeigt dir links die Aufgabenbibliothek (Ordnerstruktur), mittig die Aufgabenliste und rechts den Aktionsbereich. Eigene Aufgaben legst du am besten in einem eigenen Unterordner ab, z.B. \Firma\Automatisierung – das hält die Übersicht sauber.
Anatomie einer geplanten Aufgabe
Jede Aufgabe besteht aus vier Bausteinen:
| Baustein | Funktion |
|---|---|
| Trigger | Wann oder warum die Aufgabe startet (Zeitplan, Ereignis, Login) |
| Aktion | Was ausgeführt wird (Programm, Skript, Befehl) |
| Bedingungen | Zusätzliche Voraussetzungen (z.B. nur bei Netzstrom) |
| Einstellungen | Verhalten bei Fehlern, Timeouts, Retry-Logik |
Trigger-Typen im Überblick
| Trigger | Typischer Einsatz |
|---|---|
| Einmalig | Geplante Migration, einmaliges Update |
| Täglich | Nachtbackup, Log-Rotation |
| Wöchentlich | Wochenbericht, Speicherplatz-Check |
| Monatlich | Monatsabschluss-Export |
| Beim Systemstart | Dienst oder Monitoring-Agent starten |
| Bei Benutzeranmeldung | Login-Skript, Drive-Mapping |
| Bei Leerlauf | Ressourcenintensive Aufgaben |
| Bei Ereignis (Event Log) | Reaktion auf Fehler oder Sicherheitsereignisse |
Neue Aufgabe per GUI erstellen
Wenn du eine Aufgabe per GUI anlegen willst (gut zum Verstehen der Parameter):
- Aufgabenplanung öffnen (
taskschd.msc) - Rechts auf Aufgabe erstellen… klicken (nicht „Einfache Aufgabe erstellen” – das ist zu eingeschränkt)
- Reiter Allgemein:
- Name vergeben (z.B.
Backup-NachtScript) - Benutzerkonto auf
SYSTEMsetzen - Mit höchsten Privilegien ausführen aktivieren
- „Ausführen unabhängig von der Benutzeranmeldung” wählen
- Name vergeben (z.B.
- Reiter Trigger: Neu > Täglich, Uhrzeit setzen
- Reiter Aktionen: Neu > Programm:
powershell.exe, Argumente:-NonInteractive -ExecutionPolicy Bypass -File "C:\Scripts\backup.ps1" - Reiter Bedingungen: „Aufgabe nur starten, wenn folgende Netzwerkverbindung verfügbar ist” ggf. aktivieren
- Reiter Einstellungen: Ausführungszeit-Limit setzen, Wiederholung bei Fehler konfigurieren
Aufgaben per PowerShell erstellen und verwalten
Die GUI ist gut zum Verstehen – für produktive Umgebungen nimmst du PowerShell. Du kannst Aufgaben skriptieren, versionieren und auf mehrere Maschinen ausrollen.
Grundstruktur: Vier Cmdlets, eine Registrierung
# 1. Aktion definieren: was soll ausgeführt werden?
$action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument "-NonInteractive -ExecutionPolicy Bypass -File `"C:\Scripts\backup.ps1`""
# 2. Trigger definieren: wann?
$trigger = New-ScheduledTaskTrigger -Daily -At "23:00"
# 3. Einstellungen: Timeout, Retry
$settings = New-ScheduledTaskSettingsSet `
-ExecutionTimeLimit (New-TimeSpan -Hours 2) `
-RestartCount 3 `
-RestartInterval (New-TimeSpan -Minutes 5) `
-StartWhenAvailable
# 4. Principal: unter welchem Konto laufen?
$principal = New-ScheduledTaskPrincipal `
-UserId "SYSTEM" `
-RunLevel Highest
# 5. Aufgabe registrieren
Register-ScheduledTask `
-TaskName "NaechtlichesBackup" `
-TaskPath "\Firma\Automatisierung" `
-Action $action `
-Trigger $trigger `
-Settings $settings `
-Principal $principal `
-Description "Taegliches Backup um 23 Uhr, laeuft als SYSTEM"
Wöchentliche Aufgabe (jeden Montag)
$trigger = New-ScheduledTaskTrigger `
-Weekly `
-DaysOfWeek Monday `
-At "06:00"
Bei Systemstart (z.B. Monitoring-Agent)
$trigger = New-ScheduledTaskTrigger -AtStartup
Bei Benutzeranmeldung
# Für einen spezifischen User
$trigger = New-ScheduledTaskTrigger -AtLogOn -User "DOMAIN\mmuster"
# Für alle User (User-Parameter weglassen)
$trigger = New-ScheduledTaskTrigger -AtLogOn
Ereignisgesteuert (Event Log)
# Aufgabe startet wenn Ereignis-ID 4625 (fehlgeschlagener Login) auftritt
$xmlQuery = @"
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and EventID=4625]]</Select>
</Query>
</QueryList>
"@
$trigger = New-ScheduledTaskTrigger -OnEvent -Subscription $xmlQuery -Delay (New-TimeSpan -Seconds 30)
Aufgaben verwalten und überwachen
# Alle Aufgaben im eigenen Ordner anzeigen
Get-ScheduledTask -TaskPath "\Firma\Automatisierung\"
# Aufgabenstatus und letzten Laufzeitpunkt anzeigen
Get-ScheduledTask -TaskName "NaechtlichesBackup" | Get-ScheduledTaskInfo
# Aufgabe manuell starten (zum Testen)
Start-ScheduledTask -TaskName "NaechtlichesBackup" -TaskPath "\Firma\Automatisierung"
# Aufgabe deaktivieren (ohne löschen)
Disable-ScheduledTask -TaskName "NaechtlichesBackup" -TaskPath "\Firma\Automatisierung"
# Aufgabe wieder aktivieren
Enable-ScheduledTask -TaskName "NaechtlichesBackup" -TaskPath "\Firma\Automatisierung"
# Aufgabe löschen
Unregister-ScheduledTask -TaskName "NaechtlichesBackup" -Confirm:$false
Letzten Laufstatus prüfen
$info = Get-ScheduledTask -TaskName "NaechtlichesBackup" | Get-ScheduledTaskInfo
Write-Host "Letzter Start: $($info.LastRunTime)"
Write-Host "Letzter Exitcode: $($info.LastTaskResult)"
Write-Host "Naechster Start: $($info.NextRunTime)"
Exit-Code 0 = Erfolg. Code 0x41301 bedeutet „Aufgabe läuft gerade”. Andere Codes findest du in der Microsoft-Dokumentation oder mit net helpmsg [Dezimalwert].
schtasks.exe – das Legacy-Werkzeug
Für Batch-Skripte oder wenn du keine PowerShell nutzen kannst, steht schtasks.exe zur Verfügung. Es ist weniger mächtig, aber überall verfügbar.
REM Neue Aufgabe erstellen (täglich um 23:00)
schtasks /create /tn "NaechtlichesBackup" /tr "powershell.exe -File C:\Scripts\backup.ps1" /sc DAILY /st 23:00 /ru SYSTEM /rl HIGHEST /f
REM Alle Aufgaben anzeigen
schtasks /query /fo LIST /v
REM Aufgabe manuell ausführen
schtasks /run /tn "NaechtlichesBackup"
REM Aufgabe löschen
schtasks /delete /tn "NaechtlichesBackup" /f
REM Aufgabe auf Remotecomputer erstellen
schtasks /create /s WS-MUSTER-01 /tn "DailyCheck" /tr "C:\Scripts\check.ps1" /sc DAILY /st 08:00 /ru SYSTEM /f
Praxisbeispiel: Automatisches Logfile-Cleanup
Ein typischer KMU-Use-Case: Der Logs-Ordner einer Applikation füllt sich mit alten .log-Dateien. Du willst Dateien, die älter als 30 Tage sind, automatisch löschen.
Das Skript (C:\Scripts\cleanup-logs.ps1):
$logPfad = "C:\AppLogs"
$maxAlterTage = 30
$cutoff = (Get-Date).AddDays(-$maxAlterTage)
$geloescht = Get-ChildItem -Path $logPfad -Filter "*.log" -File |
Where-Object { $_.LastWriteTime -lt $cutoff }
foreach ($datei in $geloescht) {
Remove-Item $datei.FullName -Force
Write-Output "$(Get-Date -Format 'yyyy-MM-dd HH:mm') - Geloescht: $($datei.Name)"
}
Write-Output "$(Get-Date -Format 'yyyy-MM-dd HH:mm') - Cleanup abgeschlossen. $($geloescht.Count) Dateien entfernt."
Die geplante Aufgabe dazu:
$action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument "-NonInteractive -ExecutionPolicy Bypass -File `"C:\Scripts\cleanup-logs.ps1`" >> `"C:\Logs\cleanup.log`" 2>&1"
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At "03:00"
$settings = New-ScheduledTaskSettingsSet `
-ExecutionTimeLimit (New-TimeSpan -Minutes 30) `
-StartWhenAvailable
Register-ScheduledTask `
-TaskName "LogCleanup-AppLogs" `
-TaskPath "\Firma\Wartung" `
-Action $action `
-Trigger $trigger `
-Settings $settings `
-RunLevel Highest `
-User "SYSTEM" `
-Description "Loescht Log-Dateien aelter als 30 Tage jeden Sonntag um 03:00"
Aufgaben als SYSTEM vs. Domänenbenutzer
| Konto | Wann nutzen |
|---|---|
SYSTEM | Lokale Aufgaben, kein Netzwerkzugriff nötig |
NT AUTHORITY\NETWORK SERVICE | Aufgaben mit eingeschränktem Netzwerkzugriff |
DOMAIN\ServiceAccount | Netzlaufwerke, AD-Abfragen, Mail-Versand |
| Lokaler Admin-User | Vermeiden – Passwort in Aufgabe gespeichert, rotiert nicht |
Für Aufgaben, die auf Netzlaufwerke oder Active Directory zugreifen müssen, legst du am besten ein dediziertes Service-Konto in der Domäne an. Dieses Konto bekommt nur die nötigen Rechte und hat „Passwort läuft nie ab” gesetzt. Mehr dazu in Active Directory – Benutzer und Gruppen.
Troubleshooting: Wenn die Aufgabe nicht läuft
Das ist das häufigste Frustrations-Szenario: Manuell klappt es, automatisch nicht. Hier ist die systematische Vorgehensweise:
1. Exit-Code prüfen
Get-ScheduledTask -TaskName "MeineAufgabe" | Get-ScheduledTaskInfo | Select-Object LastRunTime, LastTaskResult
Häufige Exit-Codes:
| Code (Hex) | Bedeutung |
|---|---|
0x0 | Erfolgreich |
0x1 | Allgemeiner Fehler |
0x41301 | Aufgabe läuft gerade |
0x41306 | Aufgabe wurde beendet (Timeout) |
0x8007010B | Verzeichnis ungültig |
0xC000013A | Anwendung wurde beendet (Ctrl+C / Kill) |
2. Event Log prüfen
# Task Scheduler Events der letzten 24 Stunden
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" |
Where-Object { $_.TimeCreated -gt (Get-Date).AddHours(-24) } |
Select-Object TimeCreated, Id, Message |
Format-List
Das Operational-Log des Task Schedulers findest du auch in der Ereignisanzeige unter:
Anwendungs- und Dienstprotokolle > Microsoft > Windows > TaskScheduler > Operational
Mehr zur Ereignisanzeige in Windows Ereignisanzeige.
3. Häufige Fehlerquellen
| Problem | Lösung |
|---|---|
| Skript läuft manuell, nicht automatisch | ExecutionPolicy fehlt im Argument (-ExecutionPolicy Bypass) |
| Relative Pfade funktionieren nicht | Immer absolute Pfade verwenden; Arbeitsverzeichnis (-WorkingDirectory) in der Aktion setzen |
| Aufgabe startet nicht ohne Login | Konto auf SYSTEM oder Domänen-Service-Account ändern |
| Netzlaufwerke nicht erreichbar | SYSTEM hat keinen Netzwerkzugriff; Domänen-Account nutzen |
| Aufgabe übersprungen | -StartWhenAvailable in Settings aktivieren |
| GUI-Fehler bei Passworteingabe | Passwort des Service-Accounts abgelaufen – erneuern |
4. Skript mit vollem Logging testen
# Testlauf: Ausgabe in Datei umleiten, damit du siehst was passiert
Start-ScheduledTask -TaskName "MeineAufgabe"
# Danach Log-Datei prüfen (falls du Redirect im Argument hast)
Get-Content "C:\Logs\meine-aufgabe.log" -Tail 20
Aufgaben zwischen Maschinen kopieren oder per GPO verteilen
Einzelne Aufgabe exportieren und importieren
# Exportieren (als XML)
Export-ScheduledTask -TaskName "NaechtlichesBackup" -TaskPath "\Firma\Automatisierung" |
Out-File "C:\Temp\NaechtlichesBackup.xml" -Encoding UTF8
# Auf Zielmaschine importieren
Register-ScheduledTask -Xml (Get-Content "C:\Temp\NaechtlichesBackup.xml" -Raw) `
-TaskName "NaechtlichesBackup" `
-TaskPath "\Firma\Automatisierung" `
-Force
Per GPO auf alle Maschinen verteilen
Geplante Aufgaben können per Gruppenrichtlinie auf alle Domänen-Computer ausgerollt werden:
- Gruppenrichtlinien-Verwaltungskonsole öffnen
- GPO bearbeiten >
Computerkonfiguration > Einstellungen > Systemsteuerungseinstellungen > Geplante Aufgaben - Rechtsklick > Neu > Geplante Aufgabe (mindestens Windows 7)
- Alle Parameter wie in der GUI konfigurieren
Mehr zu GPOs in Gruppenrichtlinien – Grundlagen.
Aufgaben per PowerShell auf Remotecomputern verwalten
# Aufgabe auf Remote-PC registrieren
$session = New-PSSession -ComputerName "WS-MUSTER-01" -Credential (Get-Credential)
Invoke-Command -Session $session -ScriptBlock {
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-NonInteractive -ExecutionPolicy Bypass -File C:\Scripts\check.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At "07:00"
Register-ScheduledTask -TaskName "MorgenCheck" -Action $action -Trigger $trigger `
-RunLevel Highest -User "SYSTEM"
}
Remove-PSSession $session
Für PowerShell-Remoting-Grundlagen schau in PowerShell Scripting – Vertiefung.
Weiterlernen
- Microsoft Learn: ScheduledTasks PowerShell-Modul (Referenz aller Cmdlets)
- Microsoft Learn: schtasks-Befehlsreferenz
- Microsoft Learn: Aufgabenplanung für Entwickler (Trigger, Aktionen, Bedingungen)
- Windows OS Hub: Create Scheduled Tasks with PowerShell (Praxisbeispiele)
- German PowerShell Blog: Geplante Aufgaben erstellen in PowerShell
Kommentare
Frage, Verbesserungsvorschlag oder eigene Erfahrung zu diesem Artikel? Schreib einen Kommentar. Neue Beiträge erscheinen nach kurzer Moderation.
- Lade Kommentare …