Contexte
Une entreprise dispose d’un script PowerShell backup-daily.ps1 qui tourne chaque nuit à 02h00 via le Planificateur de tâches sur un serveur Windows Server 2019. Il copie les données critiques vers un partage réseau \\NAS\backups\ et génère un fichier de log dans C:\Logs\backup.log. Le script tourne sans problème depuis plus d’un an.
La semaine dernière, l’équipe infrastructure a appliqué les mises à jour mensuelles Windows sur l’ensemble des serveurs, dont une mise à jour cumulative et une mise à jour de PowerShell 5.1. Depuis, plus aucune sauvegarde n’arrive sur le NAS.
Quelques éléments recueillis :
- Dans le Planificateur de tâches, la tâche affiche le statut « Opération réussie » avec le code de retour
0x0 - Le fichier
C:\Logs\backup.logn’est plus mis à jour depuis la nuit précédant les mises à jour - Exécuté manuellement depuis une console PowerShell ouverte en tant qu’administrateur, le script fonctionne parfaitement et les fichiers arrivent bien sur le NAS
- Le compte de service
svc_backuputilisé par la tâche planifiée n’a pas changé, son mot de passe est valide et n’a pas expiré - Le partage
\\NAS\backups\est accessible depuis le serveur
Problème
Le script fonctionne manuellement mais pas via le planificateur de tâches, qui indique pourtant un succès. Identifier la cause et rétablir les sauvegardes automatiques.
Cause racine : La mise à jour a modifié la politique d’exécution PowerShell (ExecutionPolicy) au niveau machine, la passant de RemoteSigned à Restricted. Le Planificateur de tâches exécute le script via powershell.exe sans préciser de politique d’exécution explicite. Le script est alors bloqué silencieusement avant même de démarrer, ce qui explique le code retour 0x0 — PowerShell se lance, constate qu’il ne peut pas exécuter le script, et quitte proprement sans erreur apparente. En manuel, l’admin ouvre une console avec sa propre politique d’exécution (RemoteSigned ou Bypass définie au niveau utilisateur) ce qui fonctionne.
Diagnostic :
Vérifier la politique d’exécution active sur le serveur :
powershell
Get-ExecutionPolicy -List→ Le scope LocalMachine affiche Restricted alors qu’il était RemoteSigned avant la mise à jour
Simuler les conditions du planificateur de tâches :
powershell
powershell.exe -NonInteractive -Command "& 'C:\Scripts\backup-daily.ps1'"→ Retourne une erreur File cannot be loaded because running scripts is disabled on this system
Vérifier les logs PowerShell (si activés) :
Observateur d'événements → Applications and Services Logs → Microsoft → Windows → PowerShell → Operational→ Event ID 4104 — erreur d’exécution de script bloquée par ExecutionPolicy
Résolution :
Option 1 — Rétablir la politique d’exécution au niveau machine :
powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine -ForceOption 2 — Modifier la commande dans le planificateur de tâches pour forcer la politique au lancement, sans toucher à la config globale :
powershell.exe -ExecutionPolicy RemoteSigned -NonInteractive -File "C:\Scripts\backup-daily.ps1"L’option 2 est préférable car elle est explicite et résistante aux futures mises à jour — la politique d’exécution est portée par la tâche elle-même.
Vérification :
- Déclencher la tâche manuellement depuis le planificateur
- Vérifier que
C:\Logs\backup.logest mis à jour - Vérifier que les fichiers arrivent sur
\\NAS\backups\