- Übersicht
- Platzhaltervariablen
- Schritt 1: Aufgabenregistrierung und Grundeinstellungen
- Schritt 2: Ereignisbasierte Trigger (XML-Vorlage)
- Schritt 3: Bedingte Trigger und Ausführungsbedingungen
- Schritt 4: Verwaltung bestehender Aufgaben
- Betriebsprotokoll aktivieren
- Schritt 5: Fehleranalyse
- Schritt 6: Best Practices
- Fazit
Übersicht
Dieser Artikel erklärt fortgeschrittene Methoden zur Automatisierung mit dem Windows-Aufgabenplaner.
Er behandelt bedingte Trigger, Ereignissteuerung, PowerShell-Integration für Registrierung und Verwaltung sowie sicherheitsbewusste Betriebsstrategien.
Platzhaltervariablen
| Variable | Beispiel | Beschreibung |
|---|---|---|
<<TASK_NAME>> |
Daily-Backup |
Aufgabenname |
<<SCRIPT_PATH>> |
C:\Scripts\backup.ps1 |
Pfad zum auszuführenden Skript |
<<EVENT_ID>> |
4625 |
Ziel-Ereignis-ID |
<<USERNAME>> |
Administrator |
Ausführender Benutzer |
<<TASK_PATH>> |
\MyCompany\Maintenance |
Aufgabenordner (optional) |
Schritt 1: Aufgabenregistrierung und Grundeinstellungen
Bei der Registrierung einer Aufgabe mit PowerShell werden hauptsächlich drei Cmdlets verwendet:
| Cmdlet | Funktion |
|---|---|
New-ScheduledTaskAction |
Definiert das auszuführende Programm oder Skript |
New-ScheduledTaskTrigger |
Legt den Zeitpunkt oder das Ereignis fest |
Register-ScheduledTask |
Registriert die vollständige Aufgabe (Action + Trigger + Settings) |
① New-ScheduledTaskAction Optionen
| Option | Beschreibung | Beispiel |
|---|---|---|
-Execute |
Auszuführende Datei | "powershell.exe" |
-Argument |
Befehlszeilenargumente | "-NoProfile -NonInteractive -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>" |
-WorkingDirectory |
Arbeitsverzeichnis | "C:\Scripts" |
-Id |
Aktionskennung | "Action1" |
💡 Mehrere Aktionen können als Array übergeben werden.
② New-ScheduledTaskTrigger Optionen
| Option | Beschreibung | Beispiel |
|---|---|---|
-Daily |
Täglich ausführen | -At 3:00AM |
-Weekly |
Wöchentlich | -DaysOfWeek Monday,Wednesday |
-Once |
Einmalig | -At (Get-Date).AddHours(1) |
-AtStartup |
Beim Systemstart | — |
-AtLogOn |
Beim Benutzer-Login | — |
-RepetitionInterval |
Wiederholungsintervall | (New-TimeSpan -Minutes 30) |
-RepetitionDuration |
Gesamtdauer | (New-TimeSpan -Days 1) |
-RandomDelay |
Zufällige Verzögerung | (New-TimeSpan -Minutes 5) |
-StartBoundary / -EndBoundary |
Gültigkeitszeitraum | "2025-01-01T00:00:00" |
⚠️ Einige Optionen gelten nur für bestimmte Triggerarten (z. B. Daily, Once).
③ New-ScheduledTaskSettingsSet (optional)
| Option | Beschreibung | Beispiel |
|---|---|---|
-AllowStartIfOnBatteries |
Auf Akku ausführen | $false |
-DontStopIfGoingOnBatteries |
Bei Akku-Wechsel fortsetzen | $false |
-StartWhenAvailable |
Start bei Verfügbarkeit | $true |
-Hidden |
Aufgabe ausblenden | $true |
-RunOnlyIfNetworkAvailable |
Nur mit Netzwerk | $true |
-ExecutionTimeLimit |
Maximale Laufzeit | (New-TimeSpan -Hours 2) |
-MultipleInstances |
Mehrfachausführung | "IgnoreNew" |
-RestartCount / -RestartInterval |
Wiederholungsversuche | 3, (New-TimeSpan -Minutes 5) |
💡
New-ScheduledTaskSettingsSeterstellt ein Objekt, das an-Settingsübergeben wird, um Energie-, Netzwerk- und Wiederholungsrichtlinien zu steuern.
④ Register-ScheduledTask Optionen
| Option | Beschreibung | Beispiel |
|---|---|---|
-TaskName |
Aufgabenname | "Daily-Backup" |
-TaskPath |
Aufgabenpfad | "\MyCompany\Maintenance" |
-Action |
Aktionen | $action |
-Trigger |
Trigger | $trigger |
-Settings |
Weitere Einstellungen | $settings |
-Description |
Beschreibung | "Daily maintenance backup task" |
-User |
Benutzerkonto | "SYSTEM" oder "Administrator" |
-RunLevel |
Berechtigungsstufe | Highest |
-Force |
Überschreibt vorhandene Aufgaben | — |
💡 Kombination aus Action, Trigger und Settings bildet die vollständige Aufgabenstruktur.
Beispiel
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>"
$trigger = New-ScheduledTaskTrigger -Daily -At 3:00AM
Register-ScheduledTask -TaskName "<<TASK_NAME>>" `
-TaskPath "<<TASK_PATH>>\Daily" `
-Action $action -Trigger $trigger `
-User "<<USERNAME>>" -Description "Tägliche Backup-Aufgabe"
Hinweise
-ExecutionPolicy Bypassnur intern verwenden.- SYSTEM oder Dienstkonto bevorzugen.
-Forcezum Überschreiben erforderlich.- Wiederholungsintervall min. 1 Minute.
-RunLevel Highestnur bei Admin-Tasks.
Schritt 2: Ereignisbasierte Trigger (XML-Vorlage)
Da PowerShell keine nativen Ereignis-Trigger unterstützt, erfolgt die Registrierung über XML.
$xml = @'
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Author><<USERNAME>></Author>
<Description>Ausführung bei EventID <<EVENT_ID>></Description>
</RegistrationInfo>
<Triggers>
<EventTrigger>
<Enabled>true</Enabled>
<Subscription><![CDATA[
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[(EventID=<<EVENT_ID>>)]]</Select>
</Query>
</QueryList>
]]></Subscription>
</EventTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>SYSTEM</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<StartWhenAvailable>true</StartWhenAvailable>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Command>
<Arguments>-NoProfile -ExecutionPolicy Bypass -File "<<SCRIPT_PATH>>"</Arguments>
</Exec>
</Actions>
</Task>
'@
Register-ScheduledTask -TaskName "<<TASK_NAME>>" -TaskPath "<<TASK_PATH>>\OnEvent" -Xml $xml -User "SYSTEM"
Schritt 3: Bedingte Trigger und Ausführungsbedingungen
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries:$false `
-RunOnlyIfNetworkAvailable:$true `
-ExecutionTimeLimit (New-TimeSpan -Hours 2)
Register-ScheduledTask -TaskName "<<TASK_NAME>>_Cond" `
-TaskPath "<<TASK_PATH>>\Conditional" `
-Action $action -Trigger $trigger -Settings $settings `
-User "<<USERNAME>>" -Description "Netzwerk- und Strombedingte Ausführung"
| Bedingung | Einstellung | Beschreibung |
|---|---|---|
| Nur Netzbetrieb | -AllowStartIfOnBatteries:$false |
Keine Akkuausführung |
| Netzwerk erforderlich | -RunOnlyIfNetworkAvailable:$true |
Nur mit Verbindung |
| Maximale Laufzeit | -ExecutionTimeLimit |
Schutz vor Endlosschleifen |
Schritt 4: Verwaltung bestehender Aufgaben
Get-ScheduledTask | Where-Object TaskPath -like "<<TASK_PATH>>*"
Enable-ScheduledTask -TaskName "<<TASK_NAME>>"
Disable-ScheduledTask -TaskName "<<TASK_NAME>>"
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>" |
Select-Object TaskName, NextRunTime, LastRunTime, LastTaskResult
Betriebsprotokoll aktivieren
wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true
Schritt 5: Fehleranalyse
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>"
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" -MaxEvents 50 |
Where-Object { $_.Message -match "<<TASK_NAME>>" } |
Select-Object TimeCreated, Id, Message | Format-Table -AutoSize
| Ursache | Maßnahme |
|---|---|
| Fehlende Rechte | Konto prüfen |
| ExecutionPolicy blockiert | Signiertes Skript oder Bypass |
| Trigger-Fehler | XML-Filter prüfen |
| Konfliktierende Bedingungen | Trigger-Logik überprüfen |
Schritt 6: Best Practices
- SYSTEM- oder Dienstkonto verwenden.
- Skripte mit Logging und Fehlerbehandlung ausstatten.
- XML-Vorlagen versionieren (z. B. GitHub).
- Überwachung per
Get-ScheduledTaskInfo. - Alte Aufgaben mit
Unregister-ScheduledTaskentfernen.
Fazit
Der Windows-Aufgabenplaner bietet weit mehr als einfache Zeitpläne.
Mit Ereignistriggern, bedingten Ausführungen und PowerShell-Steuerung wird er zu einem mächtigen Automatisierungswerkzeug.
Eine strukturierte, skriptbasierte Verwaltung sorgt für Nachvollziehbarkeit, Stabilität und Sicherheit im IT-Betrieb.
