Exploitation avancée du Planificateur de tâches et contrôle des déclencheurs

Vue d’ensemble

Cet article détaille des techniques avancées d’automatisation avec le Planificateur de tâches Windows.
Nous abordons les déclencheurs conditionnels, l’exécution pilotée par les journaux d’événements, l’enregistrement et le contrôle des tâches via PowerShell, ainsi qu’une exploitation axée sur la sécurité.

Convention de variables

Variable Exemple Remarque
<<TASK_NAME>> Daily-Backup Nom de la tâche
<<SCRIPT_PATH>> C:\Scripts\backup.ps1 Chemin du script
<<EVENT_ID>> 4625 ID d’événement ciblé
<<USERNAME>> Administrator Compte d’exécution
<<TASK_PATH>> \MyCompany\Maintenance Dossier de la bibliothèque des tâches (optionnel)

Étape 1 : Enregistrer une tâche et définir les bases

Pour enregistrer des tâches avec PowerShell, on combine généralement trois cmdlets :

Cmdlet Rôle
New-ScheduledTaskAction Définit le programme/le script à exécuter
New-ScheduledTaskTrigger Définit le moment d’exécution (heure/événement)
Register-ScheduledTask Enregistre la tâche complète (Action + Trigger + Settings)

① Options de New-ScheduledTaskAction

Option Description Exemple
-Execute Exécutable "powershell.exe"
-Argument Arguments de ligne de commande "-NoProfile -NonInteractive -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>"
-WorkingDirectory Répertoire de travail "C:\Scripts"
-Id Identifiant d’action (pour plusieurs actions) "Action1"

💡 Pour plusieurs actions, créez plusieurs objets New-ScheduledTaskAction et passez-les sous forme de tableau.


② Options de New-ScheduledTaskTrigger

Option Description Exemple
-Daily Exécution quotidienne à combiner avec -At 3:00AM
-Weekly Exécution hebdomadaire -DaysOfWeek Monday,Wednesday
-Once Exécution unique -At (Get-Date).AddHours(1)
-AtStartup Au démarrage du système
-AtLogOn À l’ouverture de session
-RepetitionInterval Intervalle de répétition (New-TimeSpan -Minutes 30)
-RepetitionDuration Durée totale de répétition (New-TimeSpan -Days 1)
-RandomDelay Délai aléatoire (New-TimeSpan -Minutes 5)
-StartBoundary / -EndBoundary Période de validité "2025-01-01T00:00:00"

⚠️ -RepetitionInterval et -RepetitionDuration ne s’appliquent qu’à certains types de déclencheurs (p. ex. Daily/Once).


③ New-ScheduledTaskSettingsSet (optionnel)

Option Description Exemple
-AllowStartIfOnBatteries Autoriser sur batterie $false
-DontStopIfGoingOnBatteries Ne pas arrêter en cas de passage sur batterie $false
-StartWhenAvailable Démarrer dès que possible $true
-Hidden Masquer la tâche $true
-RunOnlyIfNetworkAvailable Exiger une connectivité réseau $true
-ExecutionTimeLimit Durée maximale d’exécution (New-TimeSpan -Hours 2)
-MultipleInstances Politique multi-instances (IgnoreNew/Parallel/Queue) "IgnoreNew"
-RestartCount / -RestartInterval Tentatives et intervalle de reprise 3, (New-TimeSpan -Minutes 5)

💡 New-ScheduledTaskSettingsSet génère l’objet de paramètres à passer à -Settings : énergie, réseau, reprises, etc.


④ Options clés de Register-ScheduledTask

Option Description Exemple
-TaskName Nom d’enregistrement "Daily-Backup"
-TaskPath Dossier de la tâche "\MyCompany\Maintenance"
-Action Action(s) définie(s) $action
-Trigger Déclencheur(s) défini(s) $trigger
-Settings Paramètres additionnels $settings
-Description Description "Daily maintenance backup task"
-User Compte d’exécution "SYSTEM" ou "Administrator"
-RunLevel Niveau de privilèges Highest
-Force Écraser si existant

💡 Une tâche = combinaison d’Action, Trigger et Settings.


⑤ Exemple de configuration

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

# Déclencheur (tous les jours à 03:00)
$trigger = New-ScheduledTaskTrigger -Daily -At 3:00AM

# Enregistrement
Register-ScheduledTask -TaskName "<<TASK_NAME>>" `
  -TaskPath "<<TASK_PATH>>\Daily" `
  -Action $action -Trigger $trigger `
  -User "<<USERNAME>>" -Description "Tâche planifiée quotidienne à 03:00"

⑥ Points d’attention

  • Utilisez -ExecutionPolicy Bypass uniquement en interne ; envisagez des scripts signés.
  • Privilégiez SYSTEM ou un compte de service dédié.
  • -RepetitionInterval minimal : 1 min ; limite par défaut de -RepetitionDuration : 1 jour.
  • L’écrasement nécessite -Force.
  • -RunLevel Highest seulement pour les opérations nécessitant des droits admin.

Étape 2 : Déclencheur par événement (avec modèle XML)

New-ScheduledTaskTrigger ne gère pas nativement les déclencheurs d’événements (p. ex. -OnEvent).
Pour déclencher sur événement, importez une définition XML.

Enregistrement :

$xml = @'
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Author><<USERNAME>></Author>
    <Description>Exécuter le script lors de l’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"

Étape 3 : Combiner déclencheurs et conditions d’exécution

Définissez les conditions (alimentation, réseau, inactivité) avec 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 "Tâche conditionnelle (réseau requis / secteur)"

Exemples de conditions

Condition Paramètre Description
Secteur uniquement -AllowStartIfOnBatteries:$false N’exécute pas sur batterie
Réseau requis -RunOnlyIfNetworkAvailable:$true S’interrompt sans connectivité
Uniquement à l’état inactif via XML ou COM Prise en charge PowerShell limitée
Durée max. d’exécution -ExecutionTimeLimit Évite les tâches « zombie »
Reprises XML ou déclencheur de répétition Limitations en PowerShell pur

Étape 4 : Gérer des tâches existantes

# Lister les tâches
Get-ScheduledTask | Where-Object TaskPath -like "<<TASK_PATH>>*"

# Activer / désactiver
Enable-ScheduledTask -TaskName "<<TASK_NAME>>"
Disable-ScheduledTask -TaskName "<<TASK_NAME>>"

# État d’exécution
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>" |
  Select-Object TaskName, NextRunTime, LastRunTime, LastTaskResult

Activer le journal opérationnel (Operational)

Le canal Microsoft-Windows-TaskScheduler/Operational peut être désactivé par défaut.
Activez-le pour le dépannage et l’historique détaillé.

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

Étape 5 : Dépannage et vérification des journaux

# Dernier résultat d’exécution
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>"

# Filtrer le journal opérationnel sur le nom de la tâche
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" -MaxEvents 50 |
  Where-Object { $_.Message -match "<<TASK_NAME>>" } |
  Select-Object TimeCreated, Id, Message | Format-Table -AutoSize

Causes fréquentes et remèdes

Cause Action
Droits insuffisants Revoir les privilèges / utiliser un compte de service
ExecutionPolicy bloque Script signé ou -ExecutionPolicy Bypass
TaskPath / description manquants Renseigner -TaskPath et -Description
Déclencheur d’événement inopérant Valider le XML et le filtre d’événement
Conditions contradictoires Revoir la logique des déclencheurs et paramètres

Étape 6 : Paramètres recommandés

  • Utilisez SYSTEM ou un compte de service dédié selon le principe du moindre privilège.
  • Ajoutez journalisation et gestion d’exceptions aux scripts ; consignez succès/échec.
  • Gérez les définitions de tâches (XML) sous contrôle de version (p. ex. GitHub).
  • Surveillez régulièrement via Get-ScheduledTaskInfo et alertez en cas d’anomalies.
  • Supprimez les tâches obsolètes avec Unregister-ScheduledTask pour garder la bibliothèque propre.

Conclusion

Le Planificateur de tâches Windows ne se limite pas aux exécutions planifiées.
Avec les déclencheurs d’événements, l’exécution conditionnelle et l’intégration PowerShell, il devient une plateforme d’automatisation puissante.
En standardisant l’enregistrement, la gestion et la supervision par code, vous obtenez reproductibilité, gouvernance et sécurité opérationnelle.