Derniers Articles
Vous êtes ici : Accueil / Tutoriaux / Administration Systèmes / PSWatch : Surveiller les changements de fichiers avec PowerShell

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 » }

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.informatique-loiret.fr  » :

watch -location « C:\Watch » | Get-Item | Where-Object { $_.Name -eq « www.informatique-loiret.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 :


Répondre

Votre adresse email ne sera pas publiée.

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

shared on wplocker.com