Page 1 sur 1
[R] surveillance de dossier et renommage de fichier
Posté : sam. 23 oct. 2021 09:56
par jl56
Bonjour à tous,
Je recherche un script pour la surveillance de dossier et notamment y surveiller le renommage de fichier. J'avais réaliser un script en 2011 approchant avec l'UDF FileSystemMonitor.au3 mais ça ne fonctionne plus, sur le forum us il n'y a pas de nouvelle version depuis 2010.
sur le forum FR je n'ai rien trouvé de récent.
Dans les WIN_API je n'ai rien trouvé de probant non plus. bref j’ appel à l'aide.
Auriez-vous, SVP, une idée , un exemple de script récent (fonctionnel) à me proposer
Merci de vos suggestions et remarques
Cordialement,
JL56
Re: [.] surveillance de dossier et renommage de fichier
Posté : dim. 24 oct. 2021 16:33
par mikell
Dans les WIN_API je n'ai rien trouvé de probant non plus
Il me semble pourtant que
_WinAPI_FindFirstChangeNotification ou
_WinAPI_ReadDirectoryChanges avec par exemple le paramètre $FILE_NOTIFY_CHANGE_FILE_NAME pourraient convenir
Re: [.] surveillance de dossier et renommage de fichier
Posté : dim. 24 oct. 2021 17:55
par jl56
Bonjour Mikell,
Merci pour votre retour, pour honnête je n'avais pas vu cet api , j'avais regardé les API qui contenaient FILE
cette API fonctionne mais sans dissocier le renommage d'une création de fichier.
Je vais préciser ce que j'aimerais faire avec un script
J'ai eu quelques clients qui se sont fait crypter leur donnée alors qu'ils étaient équipés dans les règles de l'art (système et antivirus à jour (avec system anti crypto), boitier UTM ...). le constat est que des dossiers partagés sur le serveur exemple un dossier de bureautique peut être crypté par un poste infecté sans être détecté par l'antivirus du serveur. Nous avons réalisé une maquette de test la semaine passé avec un nouvelle génération d'antivirus basé sur de intelligence artificiel. un ramsoware sur le serveur a été détecté immédiatement mais le même ransomware sur un poste non protégé a crypté le dossier partagé!.
Le support de l'antivirus nous à confirmé que c'était normal car le poste n'était pas protégé ( La pallisse aurait dit la même chose)
Mon constat avec un ramsoware, c'est que dans les dossiers les fichiers sont renommés les .docs deviennent des .docx.tes-crypté etc..
si un script sur le serveur détecte plusieurs renommage on génère une action ( envoie d'un mail, arrêt du partage, désactivation de la carte réseau voir arrêt du serveur par exemple)
j'ai trouvé sur ce site
https://www.nodesoft.com/foldermonitor un outil qui détecte le renommage en affichant l'ancien nom, le nouveau et l'action de renommage.
C'est ce que j'aimerais faire, détecter un renommage .docx en autre chose le confirmer sur un ou x autre fichier et déclencher les actions.
Pensez-vous SVP que l'on peut le faire en Autit ?
Merci encore pour votre aide
Cordialement,
JL56
Re: [.] surveillance de dossier et renommage de fichier
Posté : mar. 26 oct. 2021 21:54
par jguinch
Il ne faut pas se limiter au paramètre $iFilter de la fonction _WinAPI_ReadDirectoryChanges, il faut en plus vérifier quel est le type de modification :
#include <APIFilesConstants.au3>#include <Array.au3>#include <MsgBoxConstants.au3>#include <WinAPIError.au3>#include <WinAPIFiles.au3>#include <WinAPIMem.au3>Global $g_sPath = "c:\temp"If Not FileExists($g_sPath) Then MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Error', 'Unable to create folder.') ExitEndIfLocal $hDirectory = _WinAPI_CreateFileEx($g_sPath, $OPEN_EXISTING, $FILE_LIST_DIRECTORY, BitOR($FILE_SHARE_READ, $FILE_SHARE_WRITE), $FILE_FLAG_BACKUP_SEMANTICS)If @error Then _WinAPI_ShowLastError('', 1) ExitEndIfLocal $pBuffer = _WinAPI_CreateBuffer(8388608)Local $aDataWhile 1 $aData = _WinAPI_ReadDirectoryChanges($hDirectory, BitOR($FILE_NOTIFY_CHANGE_FILE_NAME, $FILE_NOTIFY_CHANGE_DIR_NAME), $pBuffer, 8388608, 1) If Not @error Then If $aData[0][0] Then For $i = 1 To $aData[0][0] If $aData[$i][1] = $FILE_ACTION_RENAMED_OLD_NAME Then ConsoleWrite("Fichier renommé : " & $aData[$i][0] & " => " & $aData[$i + 1][0] & @CRLF) EndIf Next EndIf Else _WinAPI_ShowLastError('', 1) EndIfWEnd
Re: [.] surveillance de dossier et renommage de fichier
Posté : mer. 27 oct. 2021 19:24
par jl56
Bonjour à tous,
waouh c'est très efficace même sur un disque entier, c'est exactement ce que je recherchais.
Merci beaucoup Jguinch
Est-ce qu'il est possible de surveiller plusieurs dossier en même temps ? (plusieurs scripts en paralélle sans doute) ?
Note: chez moi cette ligne #include <WinAPIMem.au3> provoque une erreur je l'ai désactiver et ça fonctionne
Merci encore une fois
Cordialement,
JL56
Re: [R] surveillance de dossier et renommage de fichier
Posté : mer. 27 oct. 2021 19:48
par mikell
WinAPIMem.au3 est nécessaire pour la fonction _WinAPI_CreateBuffer mais l'include existe déjà dans WinAPIFiles.au3
Peut-être un _WinAPI_FreeMemory à la fin ?
Joli script jguinch, je garde (et joyeuse Toussaint !)

Re: [R] surveillance de dossier et renommage de fichier
Posté : mer. 27 oct. 2021 19:55
par walkson
[optionnel] Spécifie si la fonction doit surveiller les sous-répertoires du répertoire spécifié, les valeurs valides sont:
True - Surveille l'arborescence des répertoires don la racine est spécifié.
False - Surveille seulement le dossier spécifié (par défaut).
pour le dernier flag $bSubtree
Jguich l'a mis à True (1) donc il y a une récursivité
Par contre, je n'arrive pas à stopper le script (sortir de la boucle) car _WinAPI_ReadDirectoryChanges() est bloquant tant qu'il n'y a pas de fichier renommé. une solution ?...
Re: [R] surveillance de dossier et renommage de fichier
Posté : jeu. 28 oct. 2021 17:34
par mikell
Pour ça il faudrait utiliser _WinAPI_ReadDirectoryChanges en mode asynchrone, j'ai regardé comment faire et j'ai vite laissé tomber
Sinon il faut utiliser un thread différent, personnellement j'utilise un moyen à la c.. mais qui marche : dans mon script compilé, en tête je mets
je relance le programme, et il se ferme lui-même s'il est déjà lancé (ça évite de faire un 2ème exe)
Re: [R] surveillance de dossier et renommage de fichier
Posté : jeu. 28 oct. 2021 21:23
par jguinch
Pour le mode asynchrone, c'est clair que c'est pas évident.
En cherchant un peu, je suis tombé sur un
super post de Yashied qui explique qu'il faut passer par les threads pour que ça fonctionne correctement (donc pas possible nativement avec AutoIt). La solution proposée passe par l'utilisation d'une dll (fournie !).
Après quelques tests, je peux dire que c'est juste génial !
Voilà le script que j'ai utilisé (modifié à partir du script RDC_Ex_Simple (Loop).au3 présent dans l'archive) :
Edit : je viens de tester RDC_Ex_3.3.12.x.au3, c'est bluffant !
Re: [R] surveillance de dossier et renommage de fichier
Posté : ven. 29 oct. 2021 18:34
par walkson
Michel ta proposition ne fonctionne pas. Test.exe se lance et s’arrête aussi vite mais ça m'a donné des idées
Code : Tout sélectionner
If WinExists("test","") Then
$pid = WinGetProcess("test","")
ProcessClose($pid)
Exit
EndIf
GUICreate("test",20,20,0,0)
et donc en relançant le code, le programme se stoppe
Ça me donne cela comme code
Code : Tout sélectionner
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=test.exe
#AutoIt3Wrapper_Res_Comment=Relancer pour fermer
#AutoIt3Wrapper_Res_Description=Relancer pour fermer
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
If WinExists("test","") Then
$pid = WinGetProcess("test","")
ProcessClose($pid)
Exit
EndIf
GUICreate("test",20,20,0,0)
#include <APIFilesConstants.au3>
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIError.au3>
#include <WinAPIFiles.au3>
#include <WinAPIMem.au3>
#include <WinAPISys.au3>
Global $g_sPath = "C:\temp\"
If Not FileExists($g_sPath) Then
MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Error', 'Unable to create folder.')
Exit
EndIf
Local $hDirectory = _WinAPI_CreateFileEx($g_sPath, $OPEN_EXISTING, $FILE_LIST_DIRECTORY, BitOR($FILE_SHARE_READ, $FILE_SHARE_WRITE), $FILE_FLAG_BACKUP_SEMANTICS)
If @error Then
_WinAPI_ShowLastError('', 1)
Exit
EndIf
Local $pBuffer = _WinAPI_CreateBuffer(8388608)
Local $aData, $cpt
While 1
$aData = _WinAPI_ReadDirectoryChanges($hDirectory, BitOR($FILE_NOTIFY_CHANGE_FILE_NAME, $FILE_NOTIFY_CHANGE_DIR_NAME,$FILE_NOTIFY_CHANGE_LAST_WRITE), $pBuffer, 8388608, 1)
If Not @error Then
If $aData[0][0] Then
For $i = 1 To $aData[0][0]
Local $fichier = "Fichier"
Select
Case $aData[$i][1] = $FILE_ACTION_RENAMED_OLD_NAME
$cpt += 1
If FileGetAttrib("C:\temp\" & $aData[$i + 1][0]) = "D" Then $fichier = " Dossier"
ConsoleWrite($cpt &" "& $fichier & " renommé : " & $g_sPath & $aData[$i][0] & " => " & $aData[$i + 1][0] & @CRLF)
Case $aData[$i][1] = $FILE_ACTION_REMOVED
$cpt += 1
If StringRegExp("C:\temp\" & $aData[$i][0],"(?:\.([^ :\\/.]*))$",0) = False Then $fichier = " Dossier"
ConsoleWrite($cpt &" "& $fichier & " déplacé : " & $g_sPath & $aData[$i][0] & @CRLF)
Case $aData[$i][1] = $FILE_ACTION_ADDED
$cpt += 1
If FileGetAttrib("C:\temp\" & $aData[$i][0]) = "D" Then $fichier = " Dossier"
ConsoleWrite($cpt &" "& $fichier & " ajouté : " & $g_sPath & $aData[$i][0] & @CRLF)
Case $aData[$i][1] = $FILE_ACTION_MODIFIED
$cpt += 1
If FileGetAttrib("C:\temp\" & $aData[$i][0]) = "D" Then $fichier = " Dossier"
ConsoleWrite($cpt &" "& $fichier & " modifié : " & $g_sPath & $aData[$i][0] & @CRLF)
EndSelect
Next
EndIf
Else
_WinAPI_ShowLastError('', 1)
EndIf
WEnd
et comme résultat dans la console
Code : Tout sélectionner
+>Setting Hotkeys...--> Press Ctrl+Alt+Break to Restart or Ctrl+BREAK to Stop.
1 Dossier ajouté : C:\temp\Temp\Nouveau dossier
2 Dossier modifié : C:\temp\Temp
3 Dossier renommé : C:\temp\Temp\Nouveau dossier => Temp\Dossier
4 Dossier modifié : C:\temp\Temp
5 Fichier ajouté : C:\temp\Temp\Dossier\Nouveau document texte.txt
6 Dossier modifié : C:\temp\Temp\Dossier
7 Fichier renommé : C:\temp\Temp\Dossier\Nouveau document texte.txt => Temp\Dossier\texte.txt
8 Dossier modifié : C:\temp\Temp\Dossier
9 Fichier déplacé : C:\temp\Temp\Dossier\texte.txt
10 Fichier ajouté : C:\temp\Temp\texte.txt
11 Dossier modifié : C:\temp\Temp
12 Dossier modifié : C:\temp\Temp\Dossier
+>18:10:52 AutoIt3.exe ended.rc:0
+>18:10:52 AutoIt3Wrapper Finished.
>Exit code: 0 Time: 27.46
ça se rapproche de beaucoup du code RDC_Ex_Advanced.au3 de Yashied. Merci à Jguinch pour l'info et son exemple
Re: [R] surveillance de dossier et renommage de fichier
Posté : ven. 29 oct. 2021 19:20
par jl56
Bonjour,
Merci JGUINCH pour ce partage très intéressant et votre script d'exemple, c'est l’idéal pour moi.
Merci également WALKSON pour votre exemple
Cordialement,
JL56