Surveiller les changements de fichiers en temps réel avec PowerShell

Tu veux savoir si un fichier a été modifié sans ton accord ? Être alerté quand un dossier change ?
Ce genre de surveillance est ultra utile pour repérer :

  • une activité suspecte sur ton PC
  • une attaque de ransomware
  • une erreur humaine (ex. : suppression ou écrasement de fichiers importants)
  • ou tout simplement pour garder le contrôle sur ce qui se passe dans un dossier critique (Dropbox, projet, partages en réseau…)

Et la bonne nouvelle : PowerShell permet de faire ça en temps réel, sans installer quoi que ce soit, avec quelques lignes de script.


Objectif : recevoir une alerte dès qu’un fichier est créé, modifié ou supprimé dans un dossier précis

On va utiliser un objet Windows très pratique : System.IO.FileSystemWatcher
C’est lui qui va espionner le dossier pour nous.


Le script PowerShell (simple et fonctionnel)

Voici un exemple de script que tu peux copier-coller et adapter :

# Chemin du dossier à surveiller
$chemin = "C:\Users\TonNom\Documents\DossierÀSurveiller"

# Création du watcher
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $chemin
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true

# Détection des changements
Register-ObjectEvent $watcher Changed -SourceIdentifier FileChanged -Action {
    Write-Host "Fichier modifié : $($Event.SourceEventArgs.FullPath)" -ForegroundColor Yellow
}

Register-ObjectEvent $watcher Created -SourceIdentifier FileCreated -Action {
    Write-Host "Nouveau fichier : $($Event.SourceEventArgs.FullPath)" -ForegroundColor Green
}

Register-ObjectEvent $watcher Deleted -SourceIdentifier FileDeleted -Action {
    Write-Host "Fichier supprimé : $($Event.SourceEventArgs.FullPath)" -ForegroundColor Red
}

# Garder le script en vie
Write-Host "`nSurveillance en cours sur : $chemin"
Write-Host "Appuie sur Ctrl + C pour quitter.`n"
while ($true) { Start-Sleep 1 }

Ce que fait ce script

  • Il Surveille un dossier et ses sous-dossiers
  • Il Détecte en temps réel :
    • Création de fichiers
    • Suppression de fichiers
    • Modification de fichiers
  • Il Affiche un message clair à l’écran à chaque événement

Tu peux le lancer dans PowerShell classique ou en tant qu’administrateur, et le laisser tourner en arrière-plan sur un écran.


Variante : envoyer un e-mail ou un son d’alerte

Tu peux remplacer les Write-Host par une notification Windows, un bip, ou même l’envoi d’un e-mail.

Exemple (simple) : faire un son à chaque alerte :

[console]::beep(1000,500)

Ou afficher une notif Windows :

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show("Fichier modifié !")

Astuce bonus : enregistrer les logs dans un fichier texte

Ajoute simplement cette ligne dans chaque bloc -Action :

"$($Event.TimeGenerated) - Action : $($Event.SourceEventArgs.ChangeType) - Fichier : $($Event.SourceEventArgs.FullPath)" | Out-File -Append -FilePath "C:\Logs\surveillance.txt"

Que peut-on surveiller avec ça ?

  • Dossier “Documents” pour éviter les suppressions par erreur
  • Un dossier partagé (réseau ou cloud) pour surveiller qui fait quoi
  • Un dossier système pour repérer des actions suspectes
  • Un projet en développement (détection de recompilation, fichiers écrasés…)

Limites à connaître

  • Le script Ne détecte pas le contenu modifié (juste le fait qu’un fichier a changé)
  • Si le script est fermé ou que le PC redémarre, la surveillance s’arrête (sauf si tu l’automatises avec le planificateur)
  • Il n’est pas compatible avec des environnements ultra lourds (ex. 100 000 fichiers qui bougent constamment)

Voici une version graphique avec notifications + logs + bouton start/stop.

L’interface te permettra de :

  • Sélectionner un dossier à surveiller,
  • Lancer ou arrêter la surveillance,
  • Visualiser en temps réel les événements (création, suppression, modification),
  • Enregistrer les logs dans un fichier,
  • Recevoir des alertes visuelles (popup) et sonores si tu le souhaites.

Script complet de l’application PowerShell graphique

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# === Fenêtre principale ===
$form = New-Object System.Windows.Forms.Form
$form.Text = "Surveillance de dossier"
$form.Size = New-Object System.Drawing.Size(600, 500)
$form.StartPosition = "CenterScreen"

# === Étiquette ===
$label = New-Object System.Windows.Forms.Label
$label.Text = "Dossier à surveiller :"
$label.Location = New-Object System.Drawing.Point(10, 20)
$label.Size = New-Object System.Drawing.Size(120, 20)
$form.Controls.Add($label)

# === Zone texte du chemin ===
$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(130, 20)
$textBox.Size = New-Object System.Drawing.Size(350, 20)
$form.Controls.Add($textBox)

# === Bouton Parcourir ===
$browseButton = New-Object System.Windows.Forms.Button
$browseButton.Text = "Parcourir"
$browseButton.Location = New-Object System.Drawing.Point(490, 18)
$browseButton.Add_Click({
    $folderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
    if ($folderBrowser.ShowDialog() -eq "OK") {
        $textBox.Text = $folderBrowser.SelectedPath
    }
})
$form.Controls.Add($browseButton)

# === Zone de log ===
$logBox = New-Object System.Windows.Forms.TextBox
$logBox.Multiline = $true
$logBox.ScrollBars = "Vertical"
$logBox.ReadOnly = $true
$logBox.Location = New-Object System.Drawing.Point(10, 60)
$logBox.Size = New-Object System.Drawing.Size(560, 330)
$form.Controls.Add($logBox)

# === Boutons Start/Stop ===
$startButton = New-Object System.Windows.Forms.Button
$startButton.Text = "Démarrer la surveillance"
$startButton.Location = New-Object System.Drawing.Point(100, 410)
$form.Controls.Add($startButton)

$stopButton = New-Object System.Windows.Forms.Button
$stopButton.Text = "Arrêter"
$stopButton.Location = New-Object System.Drawing.Point(350, 410)
$stopButton.Enabled = $false
$form.Controls.Add($stopButton)

# === Variables globales ===
$watcher = $null
$handlers = @()

# === Fonction pour ajouter un log ===
function Add-Log($message) {
    $timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
    $entry = "$timestamp - $message"
    $logBox.AppendText("$entry`r`n")
    $entry | Out-File -Append -FilePath "$env:TEMP\logsurveillance.txt"
    [console]::Beep(1000, 300)
    [System.Windows.Forms.MessageBox]::Show($message, "Alerte", "OK", "Information")
}

# === Démarrer la surveillance ===
$startButton.Add_Click({
    $path = $textBox.Text
    if (-not (Test-Path $path)) {
        [System.Windows.Forms.MessageBox]::Show("Le dossier n'existe pas.", "Erreur", "OK", "Error")
        return
    }

    $watcher = New-Object System.IO.FileSystemWatcher $path -Property @{
        IncludeSubdirectories = $true
        EnableRaisingEvents = $true
    }

    $handlers += Register-ObjectEvent $watcher Created -Action {
        Add-Log "Nouveau fichier : $($Event.SourceEventArgs.FullPath)"
    }
    $handlers += Register-ObjectEvent $watcher Deleted -Action {
        Add-Log "Fichier supprimé : $($Event.SourceEventArgs.FullPath)"
    }
    $handlers += Register-ObjectEvent $watcher Changed -Action {
        Add-Log "Fichier modifié : $($Event.SourceEventArgs.FullPath)"
    }

    $startButton.Enabled = $false
    $stopButton.Enabled = $true
    Add-Log "Surveillance activée sur : $path"
})

# === Arrêter la surveillance ===
$stopButton.Add_Click({
    $watcher.EnableRaisingEvents = $false
    $handlers | ForEach-Object { Unregister-Event -SourceIdentifier $_.Name }
    $handlers = @()
    $watcher.Dispose()
    $watcher = $null

    $startButton.Enabled = $true
    $stopButton.Enabled = $false
    Add-Log "Surveillance arrêtée."
})

# === Lancer l'app ===
[void]$form.ShowDialog()

Comment l’utiliser

  1. Ouvre PowerShell (en mode normal ou admin)
  2. Copie-colle le script dans un fichier SurveillanceGraphique.ps1
  3. Exécute le fichier :
.\SurveillanceGraphique.ps1

Tu obtiens ceci normalement:

image-5 Surveiller les changements de fichiers en temps réel avec PowerShell

Conclusion

Avec ce script PowerShell, tu as une mini alarme maison, qui te prévient à la seconde où un fichier bouge.
Pas besoin de logiciel tiers, pas besoin d’antivirus payant ou de solution cloud.

C’est léger, puissant, et parfait pour garder un œil sur tes dossiers sensibles.

Tu veux d’autres astuces comme celle-ci ? Des scripts utiles, du PowerShell bien pensé ? Laisses un commentaire et n’hésites pas à t’abonner à la NewsLetter pour ne rien ratter. 😉

Share this content:

1 commentaire

comments user
Filou Kiril

Merci beaucoup, ça peut aider.

Laisser un commentaire