15/11/2024

PowerShellSystème

PSWatch : Surveiller les changements de fichiers avec PowerShell

I. Présentation

Pour diverses raisons, il peut s'avérer utile de surveiller les changements sur un ou plusieurs fichiers d'un dossier sur un serveur et de recevoir une alerte s'il y a une modification sur les éléments ciblés. On peut imaginer cela pour surveiller l'état d'un fichier de configuration qui ne doit pas être modifié ou alors justement pour être informé de toute modification sur un fichier de configuration, par exemple.

On pourrait imaginer une surveillance basée sur l'empreinte MD5 ou SHA1 d'un fichier, c'est jouable mais ça nécessite de stockée quelque part l'empreinte souhaitée. Bref, il existe un outil intéressant en PowerShell et qui se nomme pswatch.

Je vous propose une démo dans ce tutoriel.

II. Installer PSWatch

Le module n'est pas disponible sur PowerShell Gallery, il faudra le télécharger directement depuis le GitHub de l'auteur, à savoir J.F. Romaniello : PSWatch

Le code est relativement court, 86 lignes actuellement, et le script s'appuie sur la class .NET "System.IO.FileSystemWatcher" qui a pour objectif de déclencher un événement lorsqu'un répertoire ou un fichier d'un répertoire est modifié. Intéressant.

L'installation est simple et s'effectue grâce à une commande fournie par l'auteur :

iex ((new-object net.webclient).DownloadString("http://bit.ly/Install-PsWatch"))

Ce qui doit retourner :

Creating module directory
Downloading and installing
Installed!
Use "Import-Module pswatch" and then "watch"

On va pouvoir importer le module :

Import-Module pswatch

Si tout est OK, alors passez à la suite...

III. Utiliser PSWatch

A. La commande watch et ses paramètres

Pour monitorer les changements de fichiers avec PSWatch, il faut utiliser la commande "watch" pour laquelle on a plusieurs paramètres :

- location (string) : chemin du dossier qui contient le(s) fichier(s) à surveiller
- includeRenamed (booléen) : inclure les fichiers renommés
- includeDeleted (booléen) : inclure les fichiers supprimés
- includeCreated (booléen) : inclure les fichiers créés
- includeChanged (booléen) : inclure les fichiers modifiés
- includeSubdirectories (booléen) : récursivité ou non

Pour info, en regardant le code du module, on se rend compte que par défaut tout est actif sauf la surveillance sur la suppression de fichiers :

param ([string]$location = "",
[switch]$includeSubdirectories = $true,
[switch]$includeChanged = $true,
[switch]$includeRenamed = $true,
[switch]$includeCreated = $true,
[switch]$includeDeleted = $false)

On peut alors démarrer la surveillance avec la commande suivante :

watch -location "C:\Watch"

Il est à noter qu'une fois lancée, watch reste en attente et surveille le dossier. Dès qu'un événement est détecté, cela est indiqué dans la console, par exemple :

B. Surveiller uniquement les fichiers ayant une extension spécifique

Pour surveiller uniquement les fichiers ayant une extension spécifique, on va ajouter un filtre à la suite de la commande watch. Ca peut être intéressant pour filtrer les fichiers ".cfg" par exemple.

Voici la commande à utiliser avec un exemple sur le filtre .txt :

watch -location "C:\Watch" | Get-Item | Where-Object { $_.Extension -eq ".txt" }

Ce qui fonctionne parfaitement (je sais la copie d'écran ce n'est pas très parlant) :

C. Surveiller un fichier spécifique

Ce filtre peut être adapté pour cibler la surveillance sur un seul et unique fichier, on utilisera simplement la propriété Name suivie du nom du fichier. Exemple avec le fichier "www.it-connect.fr" :

watch -location "C:\Watch" | Get-Item | Where-Object { $_.Name -eq "www.it-connect.fr" }

Là, encore, j'ai pu constater que ça fonctionnait très bien !

D. Personnaliser la sortie de la commande watch

Pour finir, je vous propose de regarder comment personnaliser la sortie de la commande watch, ce qui pourra notamment permettre d'envoyer un e-mail pour vous alerter !

watch -location "C:\Watch" | foreach {

Write-Output "INFO - Changement détecté : $($_.Path)"
Send-MailMessage -SmtpServer ...
}

Je vous laisse le soin d'ajouter les bons paramètres à la commande Send-MailMessage en fonction de votre environnement. Quoi qu'il en soit, l'ajout de "Write-Output" sert aussi à personnaliser la sortie dans la console.

Ce qui donne dans cet exemple :

Ce qui pourrait être intéressant, c'est de lancer la commande watch en tant que service Windows pour assurer une surveillance 24/7. Il est aussi possible de s'inspirer de watch pour créer un script à intégrer dans un système de supervision 😉

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

1 commentaire sur “PSWatch : Surveiller les changements de fichiers avec PowerShell

  • Bonjour, je trouve la commande « Watch » très intéressante. En fait, j’aimerais l’utiliser pour surveiller la modification de fichiers dans un dossier « X » et la combiner avec module Burnt Toast (pour obtenir une notification Windows plutôt qu’un courriel). Est-ce possible? Avez-vous un tutoriel dont je pourrais m’inspirer?

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.