Zum Inhalt springen
sw
en

Tippe um zu suchen

Scripting & Automatisierung

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.

9 Min Lesezeit Fortgeschritten Zuletzt aktualisiert:

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:

BausteinFunktion
TriggerWann oder warum die Aufgabe startet (Zeitplan, Ereignis, Login)
AktionWas ausgeführt wird (Programm, Skript, Befehl)
BedingungenZusätzliche Voraussetzungen (z.B. nur bei Netzstrom)
EinstellungenVerhalten bei Fehlern, Timeouts, Retry-Logik

Trigger-Typen im Überblick

TriggerTypischer Einsatz
EinmaligGeplante Migration, einmaliges Update
TäglichNachtbackup, Log-Rotation
WöchentlichWochenbericht, Speicherplatz-Check
MonatlichMonatsabschluss-Export
Beim SystemstartDienst oder Monitoring-Agent starten
Bei BenutzeranmeldungLogin-Skript, Drive-Mapping
Bei LeerlaufRessourcenintensive 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):

  1. Aufgabenplanung öffnen (taskschd.msc)
  2. Rechts auf Aufgabe erstellen… klicken (nicht „Einfache Aufgabe erstellen” – das ist zu eingeschränkt)
  3. Reiter Allgemein:
    • Name vergeben (z.B. Backup-NachtScript)
    • Benutzerkonto auf SYSTEM setzen
    • Mit höchsten Privilegien ausführen aktivieren
    • „Ausführen unabhängig von der Benutzeranmeldung” wählen
  4. Reiter Trigger: Neu > Täglich, Uhrzeit setzen
  5. Reiter Aktionen: Neu > Programm: powershell.exe, Argumente: -NonInteractive -ExecutionPolicy Bypass -File "C:\Scripts\backup.ps1"
  6. Reiter Bedingungen: „Aufgabe nur starten, wenn folgende Netzwerkverbindung verfügbar ist” ggf. aktivieren
  7. 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

KontoWann nutzen
SYSTEMLokale Aufgaben, kein Netzwerkzugriff nötig
NT AUTHORITY\NETWORK SERVICEAufgaben mit eingeschränktem Netzwerkzugriff
DOMAIN\ServiceAccountNetzlaufwerke, AD-Abfragen, Mail-Versand
Lokaler Admin-UserVermeiden – 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
0x0Erfolgreich
0x1Allgemeiner Fehler
0x41301Aufgabe läuft gerade
0x41306Aufgabe wurde beendet (Timeout)
0x8007010BVerzeichnis ungültig
0xC000013AAnwendung 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

ProblemLösung
Skript läuft manuell, nicht automatischExecutionPolicy fehlt im Argument (-ExecutionPolicy Bypass)
Relative Pfade funktionieren nichtImmer absolute Pfade verwenden; Arbeitsverzeichnis (-WorkingDirectory) in der Aktion setzen
Aufgabe startet nicht ohne LoginKonto auf SYSTEM oder Domänen-Service-Account ändern
Netzlaufwerke nicht erreichbarSYSTEM hat keinen Netzwerkzugriff; Domänen-Account nutzen
Aufgabe übersprungen-StartWhenAvailable in Settings aktivieren
GUI-Fehler bei PassworteingabePasswort 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:

  1. Gruppenrichtlinien-Verwaltungskonsole öffnen
  2. GPO bearbeiten > Computerkonfiguration > Einstellungen > Systemsteuerungseinstellungen > Geplante Aufgaben
  3. Rechtsklick > Neu > Geplante Aufgabe (mindestens Windows 7)
  4. 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

Kommentare

Frage, Verbesserungsvorschlag oder eigene Erfahrung zu diesem Artikel? Schreib einen Kommentar. Neue Beiträge erscheinen nach kurzer Moderation.

  • Lade Kommentare …
Kommentar schreiben