Erweiterte Verwaltung und Trigger-Steuerung im Aufgabenplaner

Ü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-ScheduledTaskSettingsSet erstellt 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 Bypass nur intern verwenden.
  • SYSTEM oder Dienstkonto bevorzugen.
  • -Force zum Überschreiben erforderlich.
  • Wiederholungsintervall min. 1 Minute.
  • -RunLevel Highest nur 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-ScheduledTask entfernen.

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.