[VBS] supprimmer un fichier sans connaitre son emplacement exact

Résolu
cs_zatox Messages postés 79 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 24 octobre 2017 - 8 juin 2009 à 14:20
cs_zatox Messages postés 79 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 24 octobre 2017 - 10 juin 2009 à 12:08
Bonjour à tous, j'espère ue je suis au bon endroit pour poser cette question.

j'aimerai savoir s'il est possible en avec un script vbs de supprimmer un fichier sur le disque dur sans connaitre son emplacement exact sur le disque.

Je m'explique, j'ai un fichier nommé "MechantVirus.exe" logé quelquepart sur le disque dur, mais je ne sais pas où exactement.

est-il possible de développer un petit script supprimant ce "MechantVirus.exe" peu importe son emplacement sur le disque?

Merci d'avance à ceux qui m'aideront



http://pc-system.fr

18 réponses

Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
9 juin 2009 à 21:19
Re,

Bon j'ai eu 5 minutes pour me pencher sur ton code, je t'ai pondu un script qui log, mais il comporte pas mal d'inconvénients que je te décris plus bas.

Voila le script :

'SCRIPT VBS SUPRESSION DE FICHIERS PAR APPEL RECURSIF
'
Dim LogFile
LogFile = "Cleaner.log"
'
Dim FSO
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
'
WriteLog "**** Suppression des fichiers ****" 
'
If FSO.FileExists(LogFile) then FSO.DeleteFile (LogFile)
'
For Each Drive In FSO.Drives
   '
   If Drive.IsReady Then
       '
       ' Ajouter ici les noms de fichiers à supprimer
       ' Model = KillFile Drive.DriveLetter & ":", "Virus.exe"
       '
       WriteLog "**** Lecteur: " &  Drive.DriveLetter & ": ****"
       KillFile Drive.DriveLetter & ":", "Virus.txt"
       KillFile Drive.DriveLetter & ":", "Text.txt"
       '
   End if



   '
Next



   ' demande de confirmation pour l'ouverture du journal.
   '
   Reponse = MsgBox ("Opération terminée, voulez vous ouvir le journal des événements ?", vbExclamation + vbYesNo, "Journal")
   '
If Reponse = vbYes Then
   set sh = createobject("wscript.shell" )
   sh.Run LogFile, 1, true
End If
'
Set FSO = Nothing
Sub KillFile (Directory, FileName)
    ' 
    Set rep=FSO.GetFolder(Directory)
    Set Files = rep.Files
    '
    For Each File In Files
       If FSO.GetFileName(File.Path) = FileName then   
          '         
          ' Tente la suppression du fichier
          Dim Fn
          FN = File.Path
          File.Delete (True)



          If err.number = 0 Then
             writeLog "Supprimé : " & FN     
          Else
             WriteLog "Erreur de suppression : " & FN
          End If
          '
       End If
       '
    Next
    '
    For each subFolder in rep.SubFolders
       KillFile subFolder, FileName
    Next
    '
End Sub
'
Sub WriteLog(Text)
   Set LogF = FSO.OpenTextFile(LogFile, 8, True)
   LogF.writeLine Text
   Set LogF = Nothing
End Sub



Donc, les lignes en rouge restent à modifier, tu peux en ajouter autant que tu veux, mais le problème c'est que le script effectue un scan complet de l'ordinateur par fichier, ce qui multiplie le temps d'execution par x Fichiers. La ligne en vert représente le chemin du log (dans le répertoire ou se trouve le script par défaut).

Le script n'est pas optimisé et très gourmand en ressources. Je te conseil donc d'en comprendre le fonctionnement pour le mettre à jour et ta sauce...

En ce qui concerne ton logiciel, je te conseil aussi le langage vb.Net, avec vb 2008 Express Edition qui est gratuit, c'est un langage simple, performant et stable avec beaucoup de possibilités et il est managé, et integre des fonctions de gestion du system de fichiers windows native et via le Framework.

En ce qui concerne les bases de données, vb les gère sous plusieur formes SQL, Access, Xml etc... De plus, graphiquement c'est propre et simple à mettre en place.

Tu serrais surement surppris par la facilité à mettre en place un utilitaire comme le tiens en vb.Net (quelque heures de travail pour quelqu'un qui maîtrise).


Voila, tien moi au courrant de l'évolution de ton projet au besoin si tu décide de passer au .Net je serais la pour te donner un coup de main (MP ou Forum).

Cordialement Mayzz.





                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
3
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
8 juin 2009 à 14:25
Bonjour,

je ne suis pas un exepert du vbs, mais il faut soit parcourir les disques et supprimer tout les fichiers dont le nom est "MechantVirus.exe", soit tu as le Hash ou CRC du fichier et la tu fais le tri dans la liste, pour ce qui est de l'implémentation du Hash/CRC... Aucune idée, je ne peux même pas te dire si c'est faisable en vbs... Par contre en postant une autre question sur le sujet quelqu'un te répondra certainement.

Mayzz.
                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
0
cs_zatox Messages postés 79 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 24 octobre 2017
8 juin 2009 à 14:30
Bonjour, merci pour ta réponse rapide, en fait, le script me servirait à supprimmer plusieurs dizaines de fichiers, mais la plupart a une taille variable, il n'y a que le nom qui est le même d'un pc à l'autre, donc impossible de travailler une un hash/CRC du fichier

j'aurai besoin d'un exemple ( si c'est réalisable) de ligne de coses pour supprimmer un fichier, ensuite j'adapterai le code a ma base de données . merci d'avance


http://pc-system.fr
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
8 juin 2009 à 14:43
Ce doit être un truc du genre :

Function KillFile(Directory, FileName)

Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set rep=FSO.GetFolder(Directory)

Set Files = rep.Files

For Each File In Files
    If FSO.GetName(File.Path) = FileName then File.Delete
Next
 
For each subFolder in rep.SubFolders 
   KillFile(subFolder)
Next

End function

à appeler comme suit : Function KillFile ("c:", "MechantVirus.exe")

Voila @+

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
8 juin 2009 à 14:51
Salut,

il est courant en vbs de mixer avec MsDos pour ce genre de chose.
je te propose un batch que j'ai ecrit il y a quelque temps deja et qui permet de recherché toute les occurences d'un  fichier:

Explication du fonctionnement:

il est possible d'utiliser le joker(*) dans le nom du fichier recherché pour remplacer 0 ou plusieurs caracteres. Avec cette nouvelle version
l'utilisation du joker en plus le l'option /a permettra par exemple de retrouver touts les fichier text d'un repertoire.

par exemple en supposant que le batch se nome recherche.bat

recherche /a *.txt c:\windows "/d:c:\temp\resultat recherche.txt"

le code batch:

@echo off
rem -----------------------------------------------
rem commande batch search
rem cree par Bigfish alias Philippe E
rem le 08-08-08
rem mis a jour le 18-11-08
rem -----------------------------------------------

rem initialisation des variables
setmyfilepath=
setmultiresult=false
setcompteur=0
setdestination=
setin=
setnosearchpath=false

rem on verifi qu'un parametre a ete specifie
rem le signe ~ supprime les double-quotes du parametre
ifnot "%~1"=="" gotostart

rem si pas de parametre
gotoerror

:start
rem on recupere les parametres
if "%~1"=="/" gotoerror
if /i "%~1"=="/?" gotohelp
if /i "%~1"=="/a" (
    setmultiresult=true
    setmyfile=%~2
   
    rem y a t'il un 3ieme parametre ?
    if "%~3"=="" gotoinitin

    rem si un chemin a ete specifie
    setin=%~3

    call :parametre %3 %4
    gotonext
)else(
    setmyfile=%~1

    rem y a t'il un 2ieme parametre ?
    if "%~2"=="" gotoinitin

    rem le 2ieme parametre est-il le chemin de recherche ?
    setin=%~2

    call :parametre %2 %3
    gotonext
)

rem si pas de chemin specifie on recupere le disque systeme
:initin
setin=%SYSTEMDRIVE%\

:next
echo.
echo Searching for file "%myfile%" in "%in%"
echo Please Wait...
echo.

rem
 ces lignes recherchent myfile dans le disque ou chemin specifie et met
le resultat dans la variable myfilepath ou dans le fichier specifié
if %multiresult%==true for /r "%in%" %%i in(*"%myfile%")docall :multiresultat "%%i"
if %multiresult%==false for /r "%in%" %%i in(*"%myfile%")dosetmyfilepath=%%i

rem on verifi que quelque chose a bien ete trouve
if %multiresult%==true (
    if %compteur%==0gotorientrouve
    if %compteur%==1echo %compteur% file found
    if %compteur% gtr1echo %compteur% files found
)else(
    if /i "%myfilepath%"=="" gotorientrouve
    if /i not "%destination%"=="" echo %myfilepath%>"%destination%"
    echo %destination%
    echo %myfilepath%  
)
echo.
gotofin

rem si aucun fichier
:rientrouve
echo no file found !
echo please check the file or the path specified
echo.
gotofin

rem si l'option /a a ete specifiee
:multiresultat
set /a compteur=compteur+1
echo %~1
if /i not "%destination%"=="" (
    if%compteur%==1(echo%~1>"%destination%")elseecho %~1>>"%destination%"
)
gotofin

:parametre
setbob=%~1
setbob=%bob:~0,3%
if /i "%bob%"=="/d:" (
    setnosearchpath=true
    setin=%SYSTEMDRIVE%\
)else(
    setnosearchpath=false
)
if %nosearchpath%==true call :extractdestinationpath %1
if %nosearchpath%==false call :extractdestinationpath %2
gotofin

rem extraction du chemin de destination
:extractdestinationpath
if "%~1"=="" gotofin
setdestination=%~1
setdestination=%destination:~3%
gotofin

:help
setNomCommande=%~n0
echo%NomCommande% file
echo.
echo%NomCommande%/?/A filename [drive:][path]/D:destination
echo%NomCommande%/?/A "filename" ["drive:path"]["/D:destination"]
echo.
echo     /A           Returns all the files found. If omitted, only the
echo                  last one found will be returned
echo     filename     Specifies the file to search
echo     drive:       Optional if no path specified
echo.
echo     Note that if no drive and path have been specified,
echo     the research will be done in the system drive
echo.
echo     /D:          Destination switch
echo     destination  Specifies the location and name of the file in where the
echo                  results will be written.
echo.
echo     You can use a quoted string in order to specify a file name
echo     or path that contains space:
echo.
echo     %NomCommande% "My file.txt" "c:\program files" "/D:c:\My folder\Result file.txt"
echo.
echo     You can also use the asterisk(*) as a substitute for zero or more
echo     characters.
echo.
echo     %NomCommande% /A My*file*.txt "/D:c:\My folder\Result file.txt"
gotofin

:error
echo The syntax of the command is incorrect.
echo.
gotohelp

:fin
rem pause

rem @33ddI7IHd

Vous pouvez retrouver ce code ici

A+
0
cs_zatox Messages postés 79 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 24 octobre 2017
8 juin 2009 à 16:05
Merci à tous les deux, Bigfish, en batch je sais faire, et c'est justement pour éviter de'avoir recours à du batch que je je voudrai le faire en vbs, (en fait j'ai développé un tool de nettoyage en batch que j'essaye de transcrire en VBS) pour des raisons de facilité d'utilisation pour les utilisateurs.


Mayzz je teste ton script et je te tiens au courant ;)
0
cs_zatox Messages postés 79 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 24 octobre 2017
8 juin 2009 à 16:18
bon je viens de tester, regardes, j'ai modifié comme tu l'a expliqué


Function KillFile ("C:", "VEGAVEGAVEGA.txt")

Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set rep=FSO.GetFolder(Directory)

Set Files = rep.Files

For Each File In Files
If FSO.GetName(File.Path) = FileName then File.Delete
Next

For each subFolder in rep.SubFolders
KillFile(subFolder)
Next

End function


mais celà ne semble pas fonctionner, j'ai ce message




ligne 1

caract 20

identificateur attendu

http://pc-system.fr
0
cs_zatox Messages postés 79 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 24 octobre 2017
8 juin 2009 à 16:20
désolé pour la mise en page, mais si on doit commencer à écrire tous nos messages en HTML sur ce forum...
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
8 juin 2009 à 20:15
Re,

Bon du coup j'ai testé le script, il y avais deux ou trois erreurs que j'ai corrigé (dont l'appel à la fonction) et tout cela fonctionne.

KillFile "d:\Mayzz\Desktop","test.txt"


Function KillFile (Directory, FileName)
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set rep=FSO.GetFolder(Directory)
Set Files = rep.Files
For Each File In Files
If FSO.GetFileName(File.Path) = FileName then File.Delete
Next
For each subFolder in rep.SubFolders
KillFile subFolder, FileName
Next
End function

Ne change que l'appel à la focntion (la ligne en bleu)

@+





                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
0
cs_zatox Messages postés 79 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 24 octobre 2017
9 juin 2009 à 10:25
Merci beaucoup Mayzz


J'ai testé, et celà fonctionne à merveille.Meme si on doit connaitre le nom du repertoire, mais ce n'est pas grave pour l'instant


Je vais encore avoir besoin de ton aide,Comment modifier ce script pour supprimmer un deuxième fichier? j'ai essayé en dupliquant la ligne en bleu, mais celà ne fonctionne pas, j'ai aussi essayé en duplicant 2 fois tout le code en changeant juste le nom du fichier, masi celà ne fonctionne pas non plus


ensuite, comment faire pour afficher le nom et le repertoire des fichiers supprimmés dans un fichier texte.

Un grand merci à toi Mayzz





http://pc-system.fr
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
9 juin 2009 à 15:00
Salut

Bien, alors pour te donner un coup de main, je vais avoir besoin de quelques précisions sur ton projet si tu permet ?

Ce que je vousdrais savoir en faite, c'est si ce petit script va te servir pour faire par exemple des plugins d'antivirus ou autres truc du genre, c'est à dire, que tu vas saisir manuellement les scripts uns  à uns via le bloc note et faire des patchs pour tel et tel virus/malware. Ou bien si tu possede un programme qui va automatiquement générer ton fichier en se servant des fonctions d'I/O via le code que je t'ai fournis ?

En fait il y a plusieurs possibilités de modifications pour le script, mais cela dépendra de ta réponse. Pour ce qui est des fichiers supprimer, en vbs il n'y a pas de 'formulaire' ou d'écran/console (comme dans un batch) donc deux choix sont possibles. Le premier consiste à afficher un MsgBox (une boîte de dialogue modale avec un bouton ok et une icone d'information) avec le listing des fichiers, cependant cette solution est plus approprié lors ce que le nombre de fichiers est connu et peu important, la deuxième est de créer un fichier log dans lequel on enregistre ligne par ligne les fichiers trouvés et supprimés (il serait même possible de marquer le résultat de la suppression je pense), puis de lancer une instance du programme associé à l'extention de fichier (en l'occurence *.log ou *.txt, ce qui veut dire notepad ou wordpad mais cela dépend le la machine cliente...).

Pour ce qui est des répertoires il  y a aussi une possibilité de scanner tout les disques si c'est ce que tu recherche à faire.

Autre chose, si cela concerne toujours la sécurité informatique (en rapport à ton site), je répète que je ne suis pas un mordu de vbs (mon truc c'est le .Net et anciennement le vb6), mais il y a la possibilité de lecture/écriture dans le registre Windows, ce qui est primordiale pour une désinfection. 

Voila. J'attend plus de précisions de ta part.

@+ Mayzz
                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
0
cs_zatox Messages postés 79 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 24 octobre 2017
9 juin 2009 à 15:38
http://pc-system.fr

salut,encore un grand merci à toi, en fait, comme tu l'a remarqué, mon projet a en effet un rapport avec la sécurité informatique.



Comme tu a l'air de t'y connaitre un peu en la matière, tu dois savoir que chaque type d'infection se traite d'une manière différente, et que les antivirus ne suffisent pas toujours à éradiquer une ifection.


Je suis "helper" sur différents forums d'entraide informatique, et j'aide les gens a désinfectr leurs Ordinateurs.
Pour celà, j'utilise une multitude de petits fix en tout genre, qui s'entassent sur le PC des personnes que j'ai aidé à la fin de la désinfection.



étant donné que je ne suis pas le seul à utiliser ces nombreux fix, J'ai développé un programme (ToolsCleaner) tu peux le télécharger ici pour y jetter un oeil http://pc-system.fr/TC/ToolsCleaner2.exe

Ce programme sert à supprimmer toutes les traces de ces fix antivirus, qui, utilisés sans un minimum de précautions peuvent entrainner de graves dégats.



Il est actuellement codé en Delphi, mais je suis confronté a de légers beug de type buffer overflow, et autres erreurs de suppressions.


C'est pourquoi J'aimerai le réécrire en VBS certes moins puissant mais plus stable, dumoins la partie recherche/suppression, mais pour celà j'aurai besoin d'un coup de main car je suis débutant dans ce langage et j'explore plusieurs possibilités avant de trouver le langage définitif de réécriture de ceprogramme.

j'ai déja testé le batch, mais c'est pas franchement glorieux, C++ aussi mais c'est plutot lent, alors je me suis dit pourquoi pas en vbs...



Donc tu l'aura compris, il s'agit d'une base de donnée interne, et l'idée du fichier log me parait très apppropriée pour suivre les actions du programme.

Merci à toi
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
9 juin 2009 à 16:13
Pas de quoi  

Mais en fait tu n'as pas réelement répondu à ma question ^^

Ce que je voulais savoir, c'est si ton programme en Delphi, va lui même écrire les scripts en fonction de ce que tu rentreras (dans ta base de données) ou si tu vas écrire tou les vbs à la main et les spécifer ds ta base (genre "Malware.A", "Malware.A.vbs") et que ton programme lancera juste le script ?

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
0
cs_zatox Messages postés 79 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 24 octobre 2017
9 juin 2009 à 16:24
oups désolé pour l'oubli, non je vais coder tous les vbs a la main et pour les lancer je les appellerai depuis le programme
0
cs_zatox Messages postés 79 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 24 octobre 2017
10 juin 2009 à 11:31
Ouah, un grand merci pour le temps que tu passes à m'aider, c'est parfait, je ne pense pas passer au .net tout de suite, mais j'y songerai certainement,quand le moment sera venu je te ferai signe .

Merci encore, cordialement Zatox
0
cs_zatox Messages postés 79 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 24 octobre 2017
10 juin 2009 à 11:32
PS: c'est tout à fait ce que je voulais, ce script est parfait, je vais essayer de l'optimise tout seul ;)
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
10 juin 2009 à 11:51
J'ai pas vraiment eu le temps mais...
 
Pour l'optimistation du script voila mes conseils :

  - Mettre les fichier dans un tableau et faire une boucle durant le scan, pour éviter d'avoir 36000 scan (1 par fichier actuellement)

  - Mettre une instruction de pause durant les boucles (DoEvents en vb6, en vbs ... ?)

  - Mettre un gestion des erreurs plus complète en cas d'impossibilité d'accès à un priphérique (Drive.IsReady) ne suffit pas il peut y avoir des problème d'acces autres (doits) ce qui provoque une erreur et stop le scan.

  - Enfin ajouter la gestion des clés/valeurs de registre (certain fix les modifient à tort).

  - Possiblité de marquage des fichiers en cours d'utilisation pour une supression au démarrage :
     En admettant que ce n'est que des restes de Fix, il ne possederons pas de clés de registre leurs permettant de booter au démarrage de windows, du coup, il faut faire en sorte que le script en crée un autre (inscrit dans le runonce) qui aura pour objectif de supprimer ces fichiers au prochain démarrage de la machine.

Voila @+ et bon dev !

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
0
cs_zatox Messages postés 79 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 24 octobre 2017
10 juin 2009 à 12:08
merci pour tous ces conseils, c'est noté A+ et bon surf
0
Rejoignez-nous