Objectif
Éviter qu’un serveur Windows sature son disque lorsque l’option d’archivage des journaux est utilisée, en supprimant uniquement les fichiers EVTX archivés plus anciens qu’une durée définie, sans effacer les journaux actifs ni contourner les obligations de conservation.
Prérequis
- Chemin réel où Windows crée les archives EVTX.
- Durée de rétention validée, par exemple 30, 60, 90 ou 180 jours.
- Compte SYSTEM ou compte de service possédant les droits de lecture/suppression sur le dossier.
- Répertoire de log pour tracer ce que la tâche supprime.
- Espace disque suffisant pour tester sans urgence immédiate.
Procédure pas à pas
Vérifier la configuration du journal actif
Commencez par lire la configuration du journal qui archive lorsqu’il est plein. wevtutil permet d’afficher le fichier, la taille maximale et les paramètres de rétention. Vérifiez que vous traitez bien des fichiers d’archive générés par Windows et non un journal déplacé vers un chemin personnalisé. Conservez cette sortie avant toute modification.
wevtutil gl Security
Get-WinEvent -ListLog Security | Select LogName,FileSize,MaximumSizeInBytes,LogMode,LogFilePath
- Le chemin et le mode du journal actif sont documentés.
Lister les archives sans rien supprimer
Localisez les fichiers Archive-*.evtx et affichez leur date, taille et chemin. Le nom exact peut varier selon le journal et la configuration. N’écrivez pas encore de suppression. Cette étape permet de vérifier que le motif ne capture pas Security.evtx ou d’autres fichiers actifs.
Get-ChildItem 'C:WindowsSystem32winevtLogs' -Filter 'Archive-*.evtx' -File | Sort LastWriteTime | Select FullName,LastWriteTime,Length
- La liste contient uniquement des archives et aucun journal actif.
Définir la rétention et estimer l’impact
Choisissez un nombre de jours compatible avec la politique. Calculez combien de fichiers et combien d’octets seraient supprimés. Cela constitue le dry-run. Si le volume à supprimer est inattendu, arrêtez-vous et vérifiez le chemin, le motif ou la date. Ne basez pas la purge sur CreationTime si des fichiers ont été copiés ; LastWriteTime est généralement plus représentatif de l’archive locale.
$RetentionDays = 90
$Cutoff = (Get-Date).AddDays(-$RetentionDays)
$Candidates = Get-ChildItem 'C:WindowsSystem32winevtLogs' -Filter 'Archive-*.evtx' -File | Where-Object LastWriteTime -lt $Cutoff
$Candidates | Measure-Object Length -Sum
$Candidates | Select FullName,LastWriteTime,Length
- Le nombre et la taille des archives candidates sont validés avant suppression.
Créer un script PowerShell avec garde-fous
Enregistrez un script dans un répertoire administrateur, par exemple C:Scripts, et paramétrez le chemin, la rétention et un fichier de journal. Le script doit sélectionner uniquement Archive-*.evtx plus anciens que le cutoff, consigner chaque suppression et s’arrêter si le chemin n’existe pas. Évitez les jokers trop larges comme *.evtx.
New-Item -ItemType Directory -Path 'C:Scripts' -Force
- Le script de purge est stocké dans un emplacement protégé et cible uniquement les archives.
Tester le script sans Remove-Item
Exécutez une version de test qui écrit la liste des candidats dans un fichier ou dans la console. Comparez plusieurs fichiers avec Event Viewer pour confirmer qu’ils sont réellement anciens et qu’ils ne sont plus nécessaires. Si vous avez un SIEM, vérifiez au moins un événement ancien côté collecteur avant de supprimer son archive locale.
$Candidates | ForEach-Object { "WOULD DELETE $($_.FullName) $($_.LastWriteTime)" } | Out-File 'C:ScriptsArchiveLogPurge-test.log' -Append
- Le dry-run correspond exactement aux archives que la politique autorise à supprimer.
Activer la suppression avec journalisation
Une fois le dry-run validé, ajoutez Remove-Item -LiteralPath afin d’éviter l’interprétation de caractères spéciaux. Écrivez une ligne de log avant ou après chaque suppression et capturez les erreurs. Le script doit continuer sur un fichier verrouillé tout en signalant le problème.
$Candidates | ForEach-Object { try { Remove-Item -LiteralPath $_.FullName -Force -ErrorAction Stop; "DELETED $($_.FullName)" | Out-File 'C:ScriptsArchiveLogPurge.log' -Append } catch { "ERROR $($_.FullName) $($_.Exception.Message)" | Out-File 'C:ScriptsArchiveLogPurge.log' -Append } }
- Les archives dépassant la rétention sont supprimées et chaque action est traçable.
Créer la tâche planifiée sous SYSTEM
Créez une tâche quotidienne à une heure peu chargée. Utiliser SYSTEM évite de stocker un mot de passe de compte de service et possède normalement les droits sur le dossier de logs. La tâche doit lancer powershell.exe avec -NoProfile, ExecutionPolicy adapté à votre politique et le chemin du script. Ne choisissez pas une fréquence excessive ; une exécution quotidienne suffit généralement.
$Action = New-ScheduledTaskAction -Execute 'PowerShell.exe' -Argument '-NoProfile -File "C:ScriptsPurge-ArchivedEventLogs.ps1"'
$Trigger = New-ScheduledTaskTrigger -Daily -At 3:15am
$Principal = New-ScheduledTaskPrincipal -UserId 'SYSTEM' -LogonType ServiceAccount -RunLevel Highest
Register-ScheduledTask -TaskName 'BOAI - Purge archives journaux' -Action $Action -Trigger $Trigger -Principal $Principal -Description 'Supprime les Archive-*.evtx plus anciens que la rétention validée'
- La tâche existe, s’exécute sous SYSTEM et ne stocke aucun mot de passe utilisateur.
Exécuter manuellement la tâche et vérifier le résultat
Déclenchez la tâche une première fois, puis contrôlez LastTaskResult et le fichier de log du script. Mesurez l’espace disque avant/après. Vérifiez que le journal Security actif continue de recevoir des événements et qu’aucune erreur EventLog n’apparaît.
Start-ScheduledTask -TaskName 'BOAI - Purge archives journaux'
Start-Sleep -Seconds 10
Get-ScheduledTaskInfo -TaskName 'BOAI - Purge archives journaux'
Get-Volume -DriveLetter C | Select SizeRemaining
- La tâche retourne un résultat réussi et le journal actif reste fonctionnel.
Superviser la tâche et la capacité disque
Ajoutez une alerte sur échec de tâche ou sur espace disque faible. Une tâche de purge ne doit pas masquer une augmentation anormale du volume d’événements : si les archives se multiplient beaucoup plus vite qu’avant, recherchez la cause. Révisez aussi la rétention lorsqu’une politique de conformité évolue.
- La purge prévient la saturation sans masquer une explosion anormale de journaux ni réduire la conservation sans décision.
Validation
La procédure est validée lorsque :
- Le journal actif Security/System/Application n’est jamais supprimé ou vidé.
- Seuls les Archive-*.evtx dépassant la rétention sont supprimés.
- La tâche planifiée s’exécute sous SYSTEM avec LastTaskResult attendu.
- L’espace disque est stabilisé et les suppressions sont journalisées.
Retour arrière
- Désactiver ou supprimer la tâche planifiée si le motif ou la rétention est incorrect.
- Restaurer les archives depuis sauvegarde si elles ont été supprimées alors qu’elles devaient être conservées.
- Revenir au script en mode dry-run jusqu’à validation d’une nouvelle politique.
- Ne tentez pas de recréer artificiellement un EVTX supprimé ; utilisez la copie sauvegardée ou le SIEM.
Dépannage / erreurs fréquentes
- Access denied sous votre compte mais pas SYSTEM : tester la tâche planifiée plutôt que modifier les ACL du dossier EventLog.
- La tâche réussit mais rien n’est supprimé : vérifier LastWriteTime, cutoff et motif Archive-*.evtx.
- Le disque continue de se remplir : rechercher d’autres logs, dumps ou une rétention trop longue.
- LastTaskResult non nul : lire le log du script et TaskScheduler/Operational.
- Le fichier Security.evtx est capturé par le script : arrêter immédiatement et corriger le filtre avant toute nouvelle exécution.