- Vue d’ensemble
- Convention de variables
- Étape 1 : Enregistrer une tâche et définir les bases
- Étape 2 : Déclencheur par événement (avec modèle XML)
- Étape 3 : Combiner déclencheurs et conditions d’exécution
- Étape 4 : Gérer des tâches existantes
- Activer le journal opérationnel (Operational)
- Étape 5 : Dépannage et vérification des journaux
- Étape 6 : Paramètres recommandés
- Conclusion
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-ScheduledTaskActionet 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" |
⚠️
-RepetitionIntervalet-RepetitionDurationne 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-ScheduledTaskSettingsSetgé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 Bypassuniquement en interne ; envisagez des scripts signés. - Privilégiez SYSTEM ou un compte de service dédié.
-RepetitionIntervalminimal : 1 min ; limite par défaut de-RepetitionDuration: 1 jour.- L’écrasement nécessite
-Force. -RunLevel Highestseulement 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-ScheduledTaskInfoet alertez en cas d’anomalies. - Supprimez les tâches obsolètes avec
Unregister-ScheduledTaskpour 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.
