Question Surveillance d'un répertoire et sous repertoires

Plus d'informations
il y a 12 ans 7 mois #15646 par SAUVAGE
Bonjour,

Tout d'abord je doit préciser que je n'ai débuté le PowerShell que la semaine dernière.

But du script :
Surveiller (et journaliser) la création de tout fichier sur une clé USB.

Mon problème est le suivant :
Mon script (largement inspiré de ce que j'ai trouvé sur ce site) ne vois que les fichiers créés à la racine de la clé. En effet, je ne détecte pas les fichiers dans les sous-répertoires.

Mon approche est la suivante :
Pour des questions de performance je ne souhaite pas utiliser une méthode de comparaison \"à la main\" du type de celle décrite par sonic31
powershell-scripting.com/index.php?optio...594&catid=5#1594
Je préfère utiliser une requête WMI du type :
powershell-scripting.com/index.php?optio...id=129&Itemid=71

Cependant, même si cette méthode fonctionne parfaitement pour les fichiers \"à la racine\" d'un répertoire, elle ne fonctionne pas pour les sous-répertoires.
Il me semble que cela viens simplement du faite que je ne maitrise pas parfaitement le langage.
En effet, j'ai testé d'ajouter un \"LIKE\" et un \"%\" pour étendre la requête mais cela ne fonctionne pas quelque soit la syntaxe utilisée.
De plus, je n'ai aucun moyen de connaitre à l'avance les sous-répertoires. Pour moi, les mètrent dans un tableau pour les comparer par la suite revient à la même solution que celle de sonic31 (que je souhaite éviter si possible).

Mon code est le suivant :
[code:1]

$ms = new-object system.management.managementscope
$ms.path = \"root\cimv2\"
$ms.connect()
$ew = new-object System.management.managementEventWatcher
$ew.scope = $ms
$ew.query = \"SELECT * FROM __InstanceCreationEvent WITHIN 1 `
WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' `
and TargetInstance.GroupComponent like 'Win32_Directory.Name=`\"E:\\\\%`\"'\"

[/code:1]
Quelqu’un pourrait-il m'aider s'il vous plais.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 7 mois #15648 par Matthew BETTON
Bonsoir,

Une piste :

Powershell FileSystemWatcher

The advantage of this method over using WMI eventing is that this can monitor sub-folders.


et notamment

[code:1]
# In the following line, you can change 'IncludeSubdirectories to $true if required.
[/code:1]

@ +

Matthew BETTON<br><br>Message édité par: Matthew BETTON, à: 19/08/13 22:14

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 6 mois #15717 par SAUVAGE
J'ai mis en peut de temps à répondre mais merci beaucoup. Cela fonctionne parfaitement.

Extrait de code :
[code:1]
# - - - Pas tres propre mais permet de garder l'adresse dans les 'actions' des watcher (sinon pb de porter des variables)
$global:«»sTemporaire = $sAdresseFichierJournal
# - - - Filtre seulement les fichiers
$filtre = '*.*'
# - - - Watcher - - -
$fileWatcherUn = New-Object IO.FileSystemWatcher $sAdresseRepertoire1, $filtre -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fileWatcherUn Created -SourceIdentifier FileCreatedUn -Action {
$AdresseFichier = $Event.SourceEventArgs.FullPath $ChaineLog = \&quot; Transfert sur la clé 1 de : $AdresseFichier\&quot;
Add-Content -Value $ChaineLog -Path $global:«»sTemporaire
}# Fin d'action
[/code:1]

Cela fonctionne, il est vrais que le coups de la variable globale pour l'adresse du fichier de log n'est pas tres propre mais je ne sais pas comment faire autrement (question de porté de variable).

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 6 mois #15718 par Matthew BETTON
Gromi écrit:

il est vrais que le coups de la variable globale pour l'adresse du fichier de log n'est pas tres propre mais je ne sais pas comment faire autrement (question de porté de variable).


Il n'est pas interdit d'utiliser une ou plusieurs variables globales.

Il faut juste que tu gardes à l'esprit qu'elle existe et pour éviter tout malentendu, tu la renseignes une fois dans ton script, puis tu n'y touches plus et ne fais qu'utiliser son contenu :)

Par contre, je te proposes d'utiliser systématiquement '$Global:ChaineLog' partout où tu devras l'utiliser, en lieu et place de '$ChaineLog'. Cela permet notamment au lecteur de savoir qu'il s'agit d'une variable globale et permet d'éviter toute erreur lors d'une possible mise à jour de ton script ...

Merci pour ton retour ;)

Message édité par: Matthew BETTON, à: 24/08/13 20:36

PS : Ne manque t'il pas un retour chariot ici :

[code:1]
$AdresseFichier = $Event.SourceEventArgs.FullPath $ChaineLog = \&quot; Transfert sur la clé 1 de : $AdresseFichier\&quot;
[/code:1]<br><br>Message édité par: Matthew BETTON, à: 24/08/13 20:38

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.047 secondes
Propulsé par Kunena