[R] surveillance de dossier et renommage de fichier

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 411
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

[R] surveillance de dossier et renommage de fichier

#1

Message 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
Modifié en dernier par jl56 le mer. 27 oct. 2021 19:25, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [.] surveillance de dossier et renommage de fichier

#2

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 411
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

Re: [.] surveillance de dossier et renommage de fichier

#3

Message 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
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [.] surveillance de dossier et renommage de fichier

#4

Message 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.')
   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
While 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)
   EndIf
WEnd
 
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 411
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

Re: [.] surveillance de dossier et renommage de fichier

#5

Message 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
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] surveillance de dossier et renommage de fichier

#6

Message 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 !) :mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [R] surveillance de dossier et renommage de fichier

#7

Message 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 ?...
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] surveillance de dossier et renommage de fichier

#8

Message par mikell »

Pour ça il faudrait utiliser _WinAPI_ReadDirectoryChanges en mode asynchrone, j'ai regardé comment faire et j'ai vite laissé tomber :mrgreen:
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
If ProcessExists("test.exe") Then
   ProcessClose("test.exe")
   Exit
EndIf
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)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [R] surveillance de dossier et renommage de fichier

#9

Message 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) :
#Include <APIConstants.au3>
#Include <RDC.au3>

Local $aDir = ["C:\", "E:\"]

_RDC_OpenDll()
If @Error Then
   ConsoleWrite('Error: _RDC_OpenDll() - ' & @Error & @CR)
   Exit
EndIf

Local $ID[UBound($aDir)]
Local $aData


For $i = 0 To UBound($aDir) - 1
   $ID[$i] = _RDC_Create($aDir[$i], 1, $FILE_NOTIFY_CHANGE_FILE_NAME)
   If @Error Then
      ConsoleWrite('Error: _RDC_Create() - ' & @Error & ', ' & @Extended & @CR)
      Exit
   EndIf
Next

While 1
   For $i = 0 To UBound($ID) - 1
      If $ID[$i] = -1 Then ContinueLoop
      $aData = _RDC_GetData($ID[$i])
      If @Error Then
         ConsoleWrite('Error: _RDC_GetData() - ' & @Error & ', ' & @Extended & ', ' & _RDC_GetDirectory($ID[$i]) & @CR)
         ; Delete thread to avoid receiving this error!
         _RDC_Delete($ID[$i])
         $ID[$i] = -1
         ContinueLoop
      EndIf
      For $j = 1 To $aData[0][0]
         Switch $aData[$j][1]
            Case $FILE_ACTION_ADDED
               ConsoleWrite("Fichier créé : " & _RDC_GetDirectory($ID[$i]) & '\' & $aData[$j][0] & @CRLF)
            Case $FILE_ACTION_REMOVED
               ConsoleWrite("Fichier supprimé : " & _RDC_GetDirectory($ID[$i]) & '\' & $aData[$j][0] & @CRLF)
;~             Case $FILE_ACTION_MODIFIED   ; ça, je sais pas pouquoi ça ne passe pas
;~                ConsoleWrite("Fichier modifié : " & _RDC_GetDirectory($ID[$i]) & '\' & $aData[$j][0] & @CRLF)
            Case $FILE_ACTION_RENAMED_OLD_NAME
               ConsoleWrite("FIchier renommé : " & _RDC_GetDirectory($ID[$i]) & '\' & $aData[$j][0] & " => " & $aData[$j+1][0] & @CRLF)
         EndSwitch
      Next
   Next
   Sleep(10)
WEnd
Edit : je viens de tester RDC_Ex_3.3.12.x.au3, c'est bluffant !
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [R] surveillance de dossier et renommage de fichier

#10

Message 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 :mrgreen:

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
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 411
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

Re: [R] surveillance de dossier et renommage de fichier

#11

Message 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
Répondre