8.1 : Planifier avec le Task Scheduler

Sophie referme le rapport de supervision multi-serveurs du TP précédent : « Ce script est excellent. Mais tu ne vas pas le lancer à la main chaque matin à 8h. Il faut qu’il s’exécute tout seul. » C’est le rôle du Planificateur de tâches Windows (Task Scheduler) : déclencher automatiquement un script, à une heure précise, selon une récurrence, ou en réaction à un événement.

Deux approches possibles

On peut créer une tâche planifiée de deux façons : via l’interface graphique (taskschd.msc), ou entièrement en PowerShell — cette seconde approche étant bien plus adaptée dès qu’on veut reproduire la même tâche sur plusieurs serveurs, exactement dans l’esprit de la section 7.

Les trois briques d’une tâche planifiée

Une tâche planifiée PowerShell repose sur trois éléments distincts, qu’on assemble ensuite :

1. L’action : ce qui doit être exécuté.

$action = New-ScheduledTaskAction -Execute "pwsh.exe" `
          -Argument "-File C:\Nordika\Scripts\rapport-supervision.ps1"

2. Le déclencheur : quand l’action doit se déclencher.

$declencheur = New-ScheduledTaskTrigger -Daily -At "08:00"

3. Le contexte d’exécution : sous quel compte la tâche s’exécute.

$principal = New-ScheduledTaskPrincipal -UserId "NORDIKA\svc-supervision" -LogonType ServiceAccount -RunLevel Highest

Assembler et enregistrer la tâche

Register-ScheduledTask -TaskName "Rapport-Supervision-Quotidien" `
                        -Action $action `
                        -Trigger $declencheur `
                        -Principal $principal `
                        -Description "Génère le rapport de supervision multi-serveurs chaque matin à 8h"

Vérifier, modifier, supprimer une tâche

Get-ScheduledTask -TaskName "Rapport-Supervision-Quotidien"

Pour consulter le résultat de la dernière exécution (statut, dernier code retour) :

Get-ScheduledTaskInfo -TaskName "Rapport-Supervision-Quotidien"

Pour supprimer une tâche devenue obsolète :

Unregister-ScheduledTask -TaskName "Rapport-Supervision-Quotidien" -Confirm:$false

Le compte d’exécution : le point le plus souvent mal configuré

Retour d’expérience terrain : la cause la plus fréquente d’une tâche planifiée qui « ne fait rien » en apparence, alors qu’elle est bien enregistrée, est presque toujours liée au compte d’exécution. Un script lancé sous le compte personnel d’un administrateur échouera silencieusement le jour où ce compte change de mot de passe, est désactivé lors d’un départ, ou n’a tout simplement pas les droits nécessaires sur les serveurs distants ciblés par Invoke-Command.

C’est pourquoi Sophie insiste systématiquement, dans la lignée des principes de sécurité déjà vus en section 6, pour utiliser un compte de service dédié (svc-supervision dans l’exemple ci-dessus), avec seulement les droits strictement nécessaires — jamais un compte personnel, et encore moins un compte disposant de droits d’administration complets du domaine.

Autres types de déclencheurs utiles

Au-delà d’une simple récurrence quotidienne, New-ScheduledTaskTrigger couvre plusieurs scénarios courants à Nordika :

New-ScheduledTaskTrigger -AtStartup                              # Au démarrage de la machine
New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At "06:00"   # Chaque lundi à 6h
New-ScheduledTaskTrigger -Once -At (Get-Date)                     # Exécution unique, immédiate

Diagnostiquer une tâche qui échoue silencieusement

Sans logging explicite dans le script lui-même (un sujet approfondi en section 9 avec Start-Transcript), une tâche planifiée qui échoue ne laisse souvent aucune trace visible en dehors de l’observateur d’événements Windows :

Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" -MaxEvents 20

Bonne pratique constatée en production : ne jamais considérer qu’une tâche planifiée fonctionne simplement parce qu’elle apparaît « Ready » dans Get-ScheduledTask. Le seul indicateur fiable est le contenu de Get-ScheduledTaskInfo (dernier code retour, LastTaskResult à 0 signifiant un succès) combiné à une vérification que le script produit bien le résultat attendu — un rapport vide généré à l’heure prévue peut donner une fausse impression de bon fonctionnement.

Un exemple concret Nordika : le script complet, de bout en bout

$action = New-ScheduledTaskAction -Execute "pwsh.exe" `
          -Argument "-NoProfile -File C:\Nordika\Scripts\rapport-supervision.ps1"

$declencheur = New-ScheduledTaskTrigger -Daily -At "08:00"

$principal = New-ScheduledTaskPrincipal -UserId "NORDIKA\svc-supervision" `
             -LogonType ServiceAccount -RunLevel Highest

$parametres = New-ScheduledTaskSettingsSet -StartWhenAvailable `
              -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 5)

Register-ScheduledTask -TaskName "Rapport-Supervision-Quotidien" `
                        -Action $action -Trigger $declencheur `
                        -Principal $principal -Settings $parametres `
                        -Description "Rapport de supervision multi-serveurs, exécuté chaque matin à 8h"

-StartWhenAvailable rattrape l’exécution si la machine était éteinte à l’heure prévue (par exemple après un redémarrage tardif), et -RestartCount/-RestartInterval retentent automatiquement l’exécution en cas d’échec — deux réglages qui évitent bien des rapports manquants sans intervention manuelle.

Source officielle : la documentation Microsoft about_Scheduled_Jobs et le module ScheduledTasks (Get-Command -Module ScheduledTasks) détaillent l’ensemble des options disponibles, notamment les déclencheurs conditionnels (sur batterie, sur réseau spécifique) utiles sur des postes portables.

Retenez le principe central : -NoProfile dans l’action est un détail qui compte — il évite que la tâche charge inutilement le profil PowerShell complet (alias personnalisés, modules auto-importés) à chaque exécution planifiée, pour un script qui tourne seul, sans utilisateur derrière l’écran.

Dans la prochaine leçon, on va plus loin dans l’automatisation : faire en sorte que ce rapport soit directement envoyé par email, sans même que quelqu’un ait à aller le consulter.