Geavanceerde exploitatie en trigger-sturing van Taakplanner

Overzicht

Dit artikel behandelt geavanceerde automatisering met de Windows Taakplanner.
We bespreken voorwaardelijke triggers, eventlog-gestuurde uitvoering, taakregistratie en -beheer via PowerShell, plus een beveiligingsbewuste operationele aanpak.

Notatie van variabelen

Variabele Voorbeeld Opmerking
<<TASK_NAME>> Daily-Backup Taaknaam
<<SCRIPT_PATH>> C:\Scripts\backup.ps1 Pad naar het script
<<EVENT_ID>> 4625 Doel-event-ID
<<USERNAME>> Administrator Gebruiker die de taak uitvoert
<<TASK_PATH>> \MyCompany\Maintenance Taakmap (optioneel)

Stap 1: Taakregistratie en basisinstellingen

Voor het registreren van taken met PowerShell combineer je doorgaans drie cmdlets:

Cmdlet Doel
New-ScheduledTaskAction Definieert het uit te voeren programma/script
New-ScheduledTaskTrigger Definieert het uitvoermoment (tijd/evenement)
Register-ScheduledTask Registreert de volledige taak (Action + Trigger + Settings)

① Opties van New-ScheduledTaskAction

Optie Beschrijving Voorbeeld
-Execute Uitvoerbaar bestand "powershell.exe"
-Argument Opstartargumenten "-NoProfile -NonInteractive -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>"
-WorkingDirectory Werkmap "C:\Scripts"
-Id Actie-ID (bij meerdere acties) "Action1"

💡 Meerdere acties? Maak meerdere New-ScheduledTaskAction-objecten en geef ze als array door.


② Opties van New-ScheduledTaskTrigger

Optie Beschrijving Voorbeeld
-Daily Dagelijks te combineren met -At 3:00AM
-Weekly Wekelijks -DaysOfWeek Monday,Wednesday
-Once Eenmalig -At (Get-Date).AddHours(1)
-AtStartup Bij systeemstart
-AtLogOn Bij aanmelding
-RepetitionInterval Herhalingsinterval (New-TimeSpan -Minutes 30)
-RepetitionDuration Totale herhalingsduur (New-TimeSpan -Days 1)
-RandomDelay Willekeurige vertraging (New-TimeSpan -Minutes 5)
-StartBoundary / -EndBoundary Geldigheidsperiode "2025-01-01T00:00:00"

⚠️ -RepetitionInterval en -RepetitionDuration werken alleen bij bepaalde trigger-typen (bijv. Daily/Once).


③ New-ScheduledTaskSettingsSet (optioneel)

Optie Beschrijving Voorbeeld
-AllowStartIfOnBatteries Toestaan op batterijvoeding $false
-DontStopIfGoingOnBatteries Doorgaan bij wissel naar batterij $false
-StartWhenAvailable Starten zodra mogelijk $true
-Hidden Taak verbergen $true
-RunOnlyIfNetworkAvailable Alleen met netwerk $true
-ExecutionTimeLimit Maximale looptijd (New-TimeSpan -Hours 2)
-MultipleInstances Beleid meervoudige instanties (IgnoreNew/Parallel/Queue) "IgnoreNew"
-RestartCount / -RestartInterval Herhalingspogingen en interval 3, (New-TimeSpan -Minutes 5)

💡 New-ScheduledTaskSettingsSet maakt een instelling-object voor de -Settings parameter: energie, netwerk, herstarten, etc.


④ Belangrijke opties van Register-ScheduledTask

Optie Beschrijving Voorbeeld
-TaskName Naam "Daily-Backup"
-TaskPath Map "\MyCompany\Maintenance"
-Action Actie(s) $action
-Trigger Trigger(s) $trigger
-Settings Extra instellingen $settings
-Description Beschrijving "Daily maintenance backup task"
-User Account "SYSTEM" of "Administrator"
-RunLevel Rechtenniveau Highest
-Force Overschrijven toestaan

💡 De volledige taak bestaat uit een combinatie van Action, Trigger en Settings.


⑤ Voorbeeldconfiguratie

# Actie
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
  -Argument "-NoProfile -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>"

# Trigger (dagelijks 03:00)
$trigger = New-ScheduledTaskTrigger -Daily -At 3:00AM

# Registratie
Register-ScheduledTask -TaskName "<<TASK_NAME>>" `
  -TaskPath "<<TASK_PATH>>\Daily" `
  -Action $action -Trigger $trigger `
  -User "<<USERNAME>>" -Description "Dagelijkse geplande taak om 03:00"

⑥ Aandachtspunten

  • Gebruik -ExecutionPolicy Bypass alleen intern; overweeg gesigneerde scripts.
  • Voorkeur voor SYSTEM of een dedicated service-account.
  • Minimale -RepetitionInterval is 1 minuut; standaardlimiet -RepetitionDuration is 1 dag.
  • Overschrijven vereist -Force.
  • -RunLevel Highest alleen voor beheertaken.

Stap 2: Eventlog-trigger met XML-sjabloon

PowerShell biedt (nog) geen native event-triggers via New-ScheduledTaskTrigger (zoals -OnEvent).
Gebruik daarom XML-import voor eventgestuurde taken.

Registratie:

$xml = @'
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Author><<USERNAME>></Author>
    <Description>Scriptuitvoering bij 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>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>true</StartWhenAvailable>
    <ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </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"

Stap 3: Voorwaardelijke triggers en uitvoercondities

Definieer taakcondities (voeding, netwerk, idle) met New-ScheduledTaskSettingsSet.

$settings = New-ScheduledTaskSettingsSet `
  -AllowStartIfOnBatteries:$false `
  -DontStopIfGoingOnBatteries:$false `
  -StartWhenAvailable:$true `
  -Hidden:$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 "Voorwaardelijke taak (netwerk vereist / netvoeding)"

Veelgebruikte condities

Conditie Instelling Toelichting
Alleen netvoeding -AllowStartIfOnBatteries:$false Geen uitvoering op batterij
Netwerk vereist -RunOnlyIfNetworkAvailable:$true Slaat uit als geen verbinding
Alleen idle XML of COM Beperkte native PowerShell-ondersteuning
Max. looptijd -ExecutionTimeLimit Voorkomt runaway-processen
Herstartpogingen XML of herhalingstrigger Sommige limieten in PowerShell

Stap 4: Beheer van bestaande taken

# Overzicht
Get-ScheduledTask | Where-Object TaskPath -like "<<TASK_PATH>>*"

# In-/uitschakelen
Enable-ScheduledTask -TaskName "<<TASK_NAME>>"
Disable-ScheduledTask -TaskName "<<TASK_NAME>>"

# Status
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>" |
  Select-Object TaskName, NextRunTime, LastRunTime, LastTaskResult

Operationeel logboek inschakelen

Het kanaal Microsoft-Windows-TaskScheduler/Operational kan standaard uit staan.
Schakel het in voor troubleshooting en detailhistorie.

wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true

Stap 5: Troubleshooting en logcontrole

# Laatste uitvoerresultaat
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>"

# Operationeel log filteren op taaknaam
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" -MaxEvents 50 |
  Where-Object { $_.Message -match "<<TASK_NAME>>" } |
  Select-Object TimeCreated, Id, Message | Format-Table -AutoSize

Veelvoorkomende oorzaken en maatregelen

Oorzaak Maatregel
Onvoldoende rechten Accountrechten herzien / service-account gebruiken
ExecutionPolicy blokkeert Gesigneerd script of -ExecutionPolicy Bypass
Ontbrekende paden/beschrijving Stel -TaskPath en -Description in
Event-trigger werkt niet XML-definitie en eventfilter opnieuw valideren
Conflicterende condities Triggers/instellingen herzien op logische tegenstrijdigheid

Stap 6: Aanbevolen instellingen

  • Gebruik SYSTEM of een dedicated service-account met least-privilege.
  • Voeg logging en foutafhandeling toe aan scripts; registreer succes/fout.
  • Beheer taakdefinities als templates (XML) in versiebeheer (bijv. GitHub).
  • Monitor cyclisch met Get-ScheduledTaskInfo en alarmeer bij afwijkingen.
  • Verwijder overbodige taken met Unregister-ScheduledTask en houd de bibliotheek schoon.

Samenvatting

De Windows Taakplanner is niet alleen voor tijdgestuurde runs; met eventtriggers, voorwaardelijke uitvoering en PowerShell-integratie vormt hij een krachtig automatiseringsplatform.
Scriptaanpak voor registratie, beheer en monitoring levert reproduceerbaarheid, beheersbaarheid en beveiliging op in de operatie.