Tâches planifiées PowerShell
Planifier l'exécution automatique de scripts PowerShell sans passer par l'interface graphique du Planificateur de tâches.
Créer une tâche planifiée
# Définir l'action (quelle commande exécuter)
$action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument "-NonInteractive -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\surveillance.ps1"
# Définir le déclencheur (quand)
$trigger = New-ScheduledTaskTrigger -Daily -At "06:00" # tous les jours à 6h
# Déclencheur hebdomadaire
$triggerWeekly = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At "08:00"
# Déclencheur au démarrage
$triggerBoot = New-ScheduledTaskTrigger -AtStartup
# Définir le principal (sous quel compte)
$principal = New-ScheduledTaskPrincipal `
-UserId "SYSTEM" `
-LogonType ServiceAccount `
-RunLevel Highest
# Enregistrer la tâche
Register-ScheduledTask `
-TaskName "Surveillance Disques" `
-Description "Vérifie l'espace disque quotidiennement" `
-Action $action `
-Trigger $trigger `
-Principal $principal
Gérer les tâches existantes
# Lister toutes les tâches
Get-ScheduledTask | Select-Object TaskName, State, TaskPath | Format-Table
# Lister les tâches actives seulement
Get-ScheduledTask | Where-Object { $_.State -eq 'Ready' }
# Exécuter manuellement une tâche
Start-ScheduledTask -TaskName "Surveillance Disques"
# Désactiver / réactiver
Disable-ScheduledTask -TaskName "Surveillance Disques"
Enable-ScheduledTask -TaskName "Surveillance Disques"
# Supprimer une tâche
Unregister-ScheduledTask -TaskName "Surveillance Disques" -Confirm:$false
# Voir le dernier résultat d'exécution
Get-ScheduledTaskInfo -TaskName "Surveillance Disques" |
Select-Object LastRunTime, LastTaskResult, NextRunTime
Cas concret : déploiement de script de monitoring
# Script surveillance.ps1 à déployer
$scriptContent = @'
$rapport = Get-PSDrive -PSProvider FileSystem | Select-Object Name,
@{N='Libre_GB';E={[math]::Round($_.Free/1GB,1)}},
@{N='Total_GB';E={[math]::Round(($_.Used+$_.Free)/1GB,1)}}
$rapport | Export-Csv "C:\Rapports\disques-$(Get-Date -Format yyyyMMdd).csv" -NoTypeInformation
'@
# Écrire le script
$scriptContent | Set-Content -Path C:\Scripts\surveillance.ps1
# Créer la tâche planifiée
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-NonInteractive -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\surveillance.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At "07:00"
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest
Register-ScheduledTask "Rapport Disques Quotidien" -Action $action -Trigger $trigger -Principal $principal
Write-Host "Tâche créée. Premier rapport demain à 7h."
Erreurs fréquentes
- ExecutionPolicy : PowerShell bloque par défaut les scripts. Ajouter
-ExecutionPolicy Bypassdans l'argument de la tâche planifiée (ne modifie pas la politique globale). - Chemins relatifs dans les scripts : la tâche planifiée s'exécute avec
C:\Windows\System32comme répertoire courant. Utiliser des chemins absolus dans le script. - Compte SYSTEM sans accès réseau : le compte SYSTEM n'a pas accès aux ressources réseau. Pour accéder à des partages, utiliser un compte de service dédié.
À retenir
New-ScheduledTaskAction+New-ScheduledTaskTrigger+Register-ScheduledTask= triplet de création.- Toujours
-ExecutionPolicy Bypassdans l'argument PowerShell de la tâche. - Utiliser des chemins absolus dans les scripts planifiés.
- Compte SYSTEM = accès local uniquement (pas de réseau sans configuration Kerberos).