Question
Surveillance répertoire et sous repertoires + mail
- sonic
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 65
- Remerciements reçus 0
Voici deja le code actuel qui fonctionne très bien
sauf ..... voir a la fin du script .....
[code:1]
$tempo =10
$derniercheck = get-date
$rep =\"C:\repsurveille\"
$ancien = get-childitem $rep -r
$trace =\"VRAI\"
$fichier_log = \"c:\appl\repsurveille.log\"
while ($derniercheck -ne $null)
{
start-sleep -s $tempo
$date_cour = get-date -uformat \"%Y:%m:%d-%H:%m:%S\"
echo \"####################################################\" >> $fichier_log
echo \"Itération du $date_cour\" >> $fichier_log
$actuel = get-childitem $rep -r
\"fichiers modifiés\"
$a=$actuel |where {($_.lastwritetime -gt $derniercheck)-and($_.creationtime -lt $derniercheck)} |
format-table Lastwritetime, Length, name, directoryname -autosize -hideTableHeaders
\"fichiers crees\"
$b=$actuel |where {($_.creationtime -gt $derniercheck)} |
format-table Lastwritetime, Length, name, directoryname -autosize -hideTableHeaders
\"fichiers renomés\"
$c=$actuel | where {(($ancien | foreach {$_.name}) -notcontains $_.name)-and ($_.creationtime -lt $derniercheck)}|
format-table Lastwritetime, Length, name, directoryname -autosize -hideTableHeaders
\"fichiers supprimés\"
$d=$ancien |where {((get-childitem $rep -r $_) -eq $null)} |
format-table Lastwritetime, Length, name, directoryname -autosize -hideTableHeaders
if ($trace -eq \"VRAI\"«»)
{
echo \"Les variables : a($a) b($b) c($c) d($d)\" >> $fichier_log
}
\"mise en fichier de actuel\"
$actuel > actuel.txt
\"mise en fichier de ancient\"
$ancient > ancient.txt
$test=$a,$b,$c,$d
if ($test -ne $nul)
{
echo $a > c:\dev\at.txt
echo $b > c:\dev\bt.txt
echo $c > c:\dev\ct.txt
echo $d > c:\dev\dt.txt
$fmod= get-content c:\dev\at.txt
$fcre= get-content c:\dev\bt.txt
$freno= get-content c:\dev\ct.txt
$fsupp= get-content c:\dev\dt.txt
\" \" > c:\dev\ok.txt
\"Rapport des modifications\" >> c:\dev\ok.txt
\"Le format est: date, HH:MM:«»SS, taille, nom, chemin.\" >> c:\dev\ok.txt
\"\" >> c:\dev\ok.txt
\"Fichies modifies:\" >>c:\dev\ok.txt
$fmod >> c:\dev\ok.txt
\"Fichier créés:\" >> c:\dev\ok.txt
$fcre >> c:\dev\ok.txt
\"fichier remonés:\" >> c:\dev\ok.txt
$freno >> c:\dev\ok.txt
\"Fichier suprimés:\" >> c:\dev\ok.txt
$fsupp >> c:\dev\ok.txt
$body= \"=============================\" + \"`r`n\" + \"Ne répondez pas a ce mail.\" + \"`r`n\" + \"=============================\"
$bodya = get-content c:\dev\ok.txt
Foreach ($bodyok in $bodya)
{
$body = $body + \"`r`n $bodyok\"
}
$body= $body + \"`r`n\" + \"`r`n\" + \"=======================================================\" + \"`r`n\" + \"finf, okokokoko \"
$mail_pass_smtp=\"servsmtp\"
$mail_from=\"Ndodo@ht.fr,\"
$mail_desti=\"aaaaaa@ggg.fr\"
function sendmail([string] $body)
{
$objet = \"Alerte modification \" + [System.DateTime]::Now
$SmtpClient = new-object system.net.mail.smtpClient
$MailMessage = New-Object system.net.mail.mailmessage
$SmtpClient.Host = $mail_pass_smtp
$mailmessage.from = $mail_from
$mailmessage.To.add($mail_desti)
#$mailmessage.CC.add(\"xxxxx@ttt.fr\"«»)
#$mailmessage.BCC.add(\"xxxxx@ttt.fr\"«»)
$mailmessage.Subject = \"$objet\"
$MailMessage.IsBodyHtml = $False
$mailmessage.Body = $body
$smtpclient.Send($mailmessage)
}
sendmail($body)
if ($trace -eq \"VRAI\"«»)
{
echo \"body($body)\" >> $fichier_log
echo \" \" >> $fichier_log
}
}
$ancien = $actuel
$derniercheck = get-date
echo \"aa\"
$date_cour2 = get-date -uformat \"%Y:%m:%d-%H:%m:%S\"
echo \"####################################################\" >> $fichier_log
echo \"fin Itération du $date_cour a $date_cour2\" >> $fichier_log
}
[/code:1]
Alors donc ca fonctionne très très bien ..... sauf que au dela de 700 fichiers dans sous repertiore ou pas ca prend beaucoup trop de temps et c'est très gourmand . En fait la partie fichier renomé et supprimé sont trsè longue a traiter . Pour l'instant les repertoires visés sont peux garnis mais a ternme je ne sais pas . Et puis je ne peu pas en rester la surtout en ayant vu une solution possible par WMI .....
Je la poste dessuite .<br><br>Message édité par: sonic31, à: 30/01/08 16:46
Connexion ou Créer un compte pour participer à la conversation.
- sonic
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 65
- Remerciements reçus 0
#
#
# Script: Monitoring_Repertoire.ps1
#
# Description : Ce script surveille un répertoire toutes les secondes.
# A l'arrivée d'un fichier, le nom de celui-ci est affiché à l'écran
#
# Ecrit par : A. PETITJEAN
# Avril 2007
#
# Dernière modification : 17/04/2007
#
$RepAMonitorer = \"C:\repsurveille\"
$RepAMonitorer = $RepAMonitorer.replace(\"\\", \"\\\\\"«»)
$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='Win32_Directory.Name=`\"${RepAMonitorer}`\"'\"
#
$options = new-object system.management.EventWatcherOptions
$options.TimeOut = [timespan]::FromSeconds(2)
$ew.options = $options
$ew.Start()
while ($true) {
trap {continue}
$e = $null
$NomFichierComplet = $null
$e = $ew.WaitForNextEvent()
$a=$e.TargetInstance.PartComponent
if (!($a -eq $null))
{
$NomFichierComplet = $a.substring($a.lastindexof(\"\\"«»)+1,$a.substring($a.lastindexof(\"\\"«»)+1).length-1)
Write-Host \"Le fichier suivant a été detecté : \" $NomFichierComplet
}
}
[/code:1]
Ca fonctionne très bien et je pense que c'est beaucoup moins gourmant .
Sauf que il me manque la recursivité ( les sous repertoires) et surtout ca ne détecte que les nouveaux fichiers . Comme on peu le voir j'ai testé de remplacer:
FROM __InstanceCreationEvent par FROM __InstanceModificationEvent et la ca ne detecte pas les modidications .... j'ai beau chercher des exemples et ou aides mais ca ne vat jamais . Je regarde WMI que je connais très très peu mais j'y arrive pas .
a partir de cet exemple je voudrais donc détecter:
les créations, les renomages (si possibe ?? ), les supprétions, et modifications et cela dans un sous repertoire et ses sous dossiers . Exemple: fichier xxxx.txt modifier :chemin c:\dev\.
Ce que je fait avec la version ultérieures en fait .
Alors voila je continue a chercher mais j'èspère de l'aide .<br><br>Message édité par: sonic31, à: 30/01/08 16:59
Connexion ou Créer un compte pour participer à la conversation.
- sonic
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 65
- Remerciements reçus 0
J'ai quand meme réussi a avoir le chemin affiché .
Voici le nouveau code qui donne le chemin .
[code:1]
$RepAMonitorer = \"C:\repsurveille\"
$RepAMonitorer = $RepAMonitorer.replace(\"\\", \"\\\\\"«»)
$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='Win32_Directory.Name=`\"${RepAMonitorer}`\"'\"
$options = new-object system.management.EventWatcherOptions
$options.TimeOut = [timespan]::FromSeconds(2)
$ew.options = $options
$ew.Start()
while ($true) {
trap {continue}
$e = $null
$NomFichierComplet = $null
$e = $ew.WaitForNextEvent()
$a=$e.TargetInstance.PartComponent
if (!($a -eq $null))
{
$NomFichierComplet = $a.substring($a.lastindexof(\".Name\"«»)+6)
Write-Host \"Le fichier suivant a été detecté : \" $NomFichierComplet
}
}
[/code:1]
Quelqu'un pourrait me traduire la requete :
[code:1]
$ew.query = \"SELECT * FROM __InstanceCreationEvent WITHIN 1 `
WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' `
and TargetInstance.GroupComponent='Win32_Directory.Name=`\"${RepAMonitorer}`\"'\"
[/code:1]
Je suppose que c'est la que je peut cherché a détecté la suppression moidification et autre ?
C'est pas possible!!! ou lui dit on que l'on veut la création ?
Message édité par: sonic31, à: 31/01/08 15:07<br><br>Message édité par: sonic31, à: 31/01/08 15:17
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
Grâce à WMI, tu peux monitorer différents type d'instances : la création, la modification et la suppression. Respectivement, __InstanceCreationEvent, __InstanceModificationEvent, __InstanceDeletionEvent.
Ca va peut-être te sembler évident ce que je vais dire mais je le dis quand même...
Pour que WMI détecte quoi que ce soit, il faut que le script soit en cours d'exécution. Lorsqu'un script de surveillance d'évènements WMI démarre, il prend en quelque sorte une photo de l'existant à un instant T; puis toutes les N secondes le script reprend une nouvelle photo et regarde les différences.
Ton code suivant
[code:1]$ew.query = \"SELECT * FROM __InstanceCreationEvent WITHIN 1 `
WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' `
and TargetInstance.GroupComponent='Win32_Directory.Name=`\"${RepAMonitorer}`\"'\"[/code:1]
signifie en humain simplifié \"regarde chaque seconde (WITHIN 1) s'il y a une création d'instance de type 'CIM_DirectoryContainsFile' à l'intérieur du répertoire $RepAMonitorer\".
Pour information, j'ai une partie entière de mon livre qui est consacrée à ce sujet...
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Arnaud écrit:
Je me permets une petite remarque sur la formulation, c'est WMI qui, au travers de l'exécution de la requête WQL vérifie, via son référentiel, les modifications effectuées. Sinon cela laisse supposer que PS est fortement couplé à WMI, ce qui n'est pas le cas.Bonsoir Sonic,
Lorsqu'un script de surveillance d'évènements WMI démarre, il prend en quelque sorte une photo de l'existant à un instant T; puis toutes les N secondes le script reprend une nouvelle photo et regarde les différences.
Arnaud écrit:
Je dirais plutot qq chose comme \"informe moi chaque seconde ...\", car à mon avis le terme \"regarde\" laisse penser que c'est du pooling alors qu'il s'agit d'événement.signifie en humain simplifié \"regarde chaque seconde (WITHIN 1) s'il y a une création d'instance de type 'CIM_DirectoryContainsFile' à l'intérieur du répertoire $RepAMonitorer\".
La même requête pouvant être synchrone ou asynchrone.
ps:
Je sais je suis pointilleux
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
C'est bien WMI qui informe le script sur les évènements reçus.
D'autre part, j'ai oublié de préciser à Sonic que la requête est une requête synchrone. C'est à dire que le déroulement du script est \"bloqué\" jusqu'à ce que l'évènement attendu se produise.
C'est la raison pour laquelle j'avais du contourner le problème en mettant en place un Timeout pour récupérer la main.
Il n'est pas évident de faire des requêtes WMI asynchrones, à moins de passer par les extensions PSEventing sur le site communautaire CodePlex .
D'autre part, il peut être intéressant de savoir que PowerShell v2 sera capable nativement d'exécuter des scripts en arrière-plan. Mais pour cela il va falloir encore patienter un peu avant de pouvoir s'en servir dans des environnements de production.
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Surveillance répertoire et sous repertoires + mail