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 😉