Si j'installe Perl que le clé USB en question ça marcherais ?
Si j'installe Perl que le clé USB en question ça marcherais ?
Ben oui, il n'y a aucune raison pour que ça ne fonctionne pas
Perl 5.20 se trouve ICI en version 32 ou 64 bits suivant ton PC
Ensuite il peut y avoir des modules à installer, le plus facile c'est cpan qui se lance depuis une invite DOS par exemple
C:\> cpan File::Spec
ou File::Spec est le nom du module à installer...
NB : le programme usb.pl est juste une vérification de la fonctionnalité, il faut l'adapter en fonction des besoins.
Par exemple en l'état, lorsqu'il est lancé, il ne supprime les fichiers que lors de la première insertion de la clé, donc il faut :
- soit faire une boucle infinie avec une temporisation, ce qui n'est pas très beau
- soit le refaire sous la forme d'un thread, ce qui n'est pas immédiat...
Voici ce que j'obtiens :
[EDIT 05:50] Modification des images trop grandes
Bon c'est encore plus simple que je pensais
Dans la mesure où la boucle :
est en attente d'évènement, il n'est pas nécessaire de faire un thread.
Code : Sélectionner tout - Visualiser dans une fenêtre à part while (defined (my $row = $sth->fetchrow_arrayref())) {
La boucle infinie ne consomme pratiquement rien !
Donc voici une petite mouture rudimentaire, dans laquelle il suffit de passer les print qui restent en commentaire pour ne plus avoir les messages sur l'invite de commande DOS
Et pour lancer ce programme sans l'invite de commande DOS, il suffit de faire un :
usb.bat :
qu'il ne reste plus qu'à mettre dans Démarrer->Démarrage pour qu'il se lance automatiquement à l'ouverture de la session
Code : Sélectionner tout - Visualiser dans une fenêtre à part C:\Strawberry\perl\bin\wperl.exe E:\_APPLI\usb\usb_MAX.pl
usb_MAX.pl :
S'il n'y a plus de print à faire, il faut nettoyer...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127 #!/usr/bin/perl use strict; use warnings; use utf8; use DBI; # Pour interroger la base WMI sous Windows use Win32::GUI (); # Pour afficher une fenêtre d'ATTENTION use Encode; # Pour encoder en iso-8859-16 use File::Spec; # Pour gérée les noms des chemins sous tous les OS use File::Path; # Pour effacement récursif de répertoire my $dbh = DBI->connect('dbi:WMI:'); my $sth = $dbh->prepare(<<WQL); SELECT * FROM __instanceoperationevent WITHIN 5 WHERE TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.Name != 'C:' WQL $sth->execute(); ActiverAccents(); my ( $Disk, $FhRep ) = (); while (1) { while (defined (my $row = $sth->fetchrow_arrayref())) { my $ev = $row->[0]; if ($ev->Path_->Class eq '__InstanceCreationEvent') { $Disk = $ev->{TargetInstance}->{Name}; $Disk = $Disk ."\\"; print "Un support USB est inséré en $Disk\n"; # print "\a\a\a\a ATTENTION il va être effacé ! \a\a\a\a\n"; # my $Message =encode("iso-8859-16", "Le disque $Disk va être effacé !"); # Win32::GUI::MessageBox(0,$Message,"ATTENTION !"); opendir my $FhRep, $Disk or die "impossible d'ouvrir le répertoire $Disk\n $!"; my @Contenus = grep { !/^\.\.?$/ } readdir($FhRep); foreach my $Contenu ( @Contenus ) { $Contenu = File::Spec->catfile($Disk, $Contenu ); if ( -f $Contenu || -d $Contenu ) { print "\a$Contenu en cours d'effacement\n"; #### ATTENTION si vous supprimez le # # dans la ligne suivante vous effacerez le contenu du support USB fraîchement connecté ! # rmtree([$Contenu], 1, 0); } else { print "ATTENTION $Contenu n'est ni un fichier, ni un répertoire !\n"; } } } } } #============================================================== # Pour avoir les accents sur la console DOS # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS #============================================================== sub ActiverAccents { my $encodage; # Windows if ( lc($^O ) eq 'mswin32') { eval { my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ ); $encodage = "cp$codepage"; foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) { binmode $h, ":encoding($encodage)"; } }; } else { $encodage = `locale charmap`; eval { foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) { binmode $h, ":encoding($encodage)"; } }; } return $encodage; } #Sinon : #ü \x81 à \x85 è \x8A #é \x82 ç \x87 ï \x8B #â \x83 ê \x88 î \x8C #ä \x84 ë \x89 =pod ############################################## # # DOC & ORIGINES # #http://www.perlmonks.org/bare/?node_id=827106 #!/usr/bin/perl -w package main; use strict; use DBI; use Data::Dumper; my $dbh = DBI->connect('dbi:WMI:'); my $sth = $dbh->prepare(<<WQL); SELECT * FROM __instanceoperationevent WITHIN 5 WHERE TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.Name != 'C:' WQL $sth->execute(); # loops forever while (defined (my $row = $sth->fetchrow_arrayref())) { my $ev = $row->[0]; # Windows XP only :( print "Class\t",$ev->Path_->Class,"\n"; for (qw(Name DeviceID Caption MediaType InterfaceType)) { print join "\t", $_, ($ev->TargetInstance->{$_} || '<none>'); print "\n"; if ($ev->Path_->Class eq '__InstanceCreationEvent') { print "Device (letter) $ev->{TargetInstance}->{Name} added\n"; } } } VOIR AUSSI : http://powershell-scripting.com/index.php?option=com_joomlaboard&Itemid=76&func=view&catid=14&id=4844
Supprimer tous les commentaires
Supprimer la fonction sub ActiverAccents { et tout ce qui suit...
...
NB : Si tu utilises ce programme à des fins malicieuses, c'est de ton entière responsabilité !
Entre temps j'ai éjecté la clé, puis copié des répertoires différents... à la réinsertion il y a effacement.
Voici ce que ça donne :
AJOUT :
ATTENTION : Lorsqu'on connecte un disque USB contenant plusieurs partitions,
la totalité des contenus dans toutes les partitions est effacé !
Exemple avec 3 partitions sur un DD USB :
Corrige moi si je me trompe mais la tu fait en sorte que le script ce lance au démarage de la session mais vue que je n'est pas accès au pc sur lequel le sdript doit s’exécute bah je ne peut pas l'utilisé et comme je ne connais rien en Perl bah je ne peut pas essayer de d'adapter ton code ..
En tous cas encore merci
Oui il se lance au démarrage.
Soit dans Démarrer->Démarrage
Et beaucoup mieux dans la clé Run de CURRENT_USERS
En tout état de cause si tu n'as pas accès au PC, rien n'est faisable
PS : J'effacerai d'ici 2, 3 jours les images qui prennent de la place pour rien.
Bonne continuation !
Je relance un peu cette conversation.
En effet, j'ai le même problème (ou presque)
Je voudrais tout simplement lancer automatiquement au branchement de la clé soit un petit programme, soit un menu (en html ?), par pure élégance envers l'utilisateur comme ça se fait sur les cd
Le problème est que Windows n'accepte pas cette démarche par sécurité. Normal on pourrait lancer automatiquement n'importe quel virus ou autre programme malveillant (effacer le disque dur !).
La question qui semble posée - et que je pose - est : y a-t-il moyen pour un honnête homme, de contourner ce comportement ?
Bonjour,
Bien sûr ! c'est toujours le même principe :Envoyé par turblad
Donc je pars encore du programme en Perl donné ICI ou d'adapter la dernière mouture de usb_MAX.pl
Dans lequel il suffit d'adapter la commande à lancer.
Donc dans la boucle :
Plutôt que de lancer le .bat qui va effacer fichiers et répertoires tu lances ce que tu veux un navigateur, un jeu perso, un traitement de texte...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 while (defined (my $row = $sth->fetchrow_arrayref())) { my $ev = $row->[0]; if ($ev->Path_->Class eq '__InstanceCreationEvent') { $Disk = $ev->{TargetInstance}->{Name}; $Disk = $Disk ."\\"; my @Cde = "E:\\_DEV\\USB\\commande.bat"; system @Cde; } }
- soit en modifiant le programme commande.bat
comme ceci, par exemple pour ouvrir une page html qui se trouve ICI sur le PC, mais on peut aussi bien en ouvrir une du WEB...commande.bat :
- soit en lançant directement la commande dans le programme Perl
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 E:\_DEV>"C:\Program Files (x86)\FirefoxPerso\Firefox_24_0\firefox.exe" -P FF24 E:\_SITE\Orange\index.html E:\_DEV>"C:\Program Files (x86)\FirefoxPerso\Firefox_24_0\firefox.exe" -P FF24 http://strawberryperl.com/
Le plus souple étant de mettre les commandes souhaitées dans un .bat, il n'y a plus à revenir dans le programme Perl
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 while (defined (my $row = $sth->fetchrow_arrayref())) { my $ev = $row->[0]; if ($ev->Path_->Class eq '__InstanceCreationEvent') { $Disk = $ev->{TargetInstance}->{Name}; $Disk = $Disk ."\\"; my @Cde = 'E:\_DEV>"C:\Program Files (x86)\FirefoxPerso\Firefox_24_0\firefox.exe" -P FF24 E:\_SITE\Orange\index.html'; # OU my @Cde = 'E:\_DEV>"C:\Program Files (x86)\FirefoxPerso\Firefox_24_0\firefox.exe" -P FF24 http://strawberryperl.com/'; # OU my @Cde = 'Word.exe'; # OU my @Cde = 'notepad'; system @Cde; } }
Attention, dès que le port USB est sollicité le programme est déclenché, ceci qu'il s'agisse d'une clé, d'un DD, d'un téléphone portable, une tablette...
Donc pour limiter l'action, il faut par exemple tester la présence d'un fichier particulier sur une clé USB pour que le programme souhaité ne se lance qu'à l'insertion de celle-ci uniquement.
Il est certainement possible de faire la même chose avec d'autres langages que Perl, dès l'instant où ils sont en mesure de détecter un évènement sur un port USB, powershell probablement mais je ne connais pas...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager