Bonjour, je souhaiterai automatisé la suppression des données sur les clés usb qui se connecterai sur un ordinateur qui tourne sous xp, est-ce possible? Merci de vos conseils.
Bonjour, je souhaiterai automatisé la suppression des données sur les clés usb qui se connecterai sur un ordinateur qui tourne sous xp, est-ce possible? Merci de vos conseils.
Bonjour,
Oui c'est possible
Je le fais sur Win7 avec un programme Perl.
Dans un premier temps, à la lecture de ta question, bien qu'il me semble qu'il n'y ait pas les GPO sous XP, j'ai cherché à le faire avec.
En Win7 les GPO permettent de lancer des actions à partir de certains évènements détectés, par exemple l'arrêt du PC.
J'espérais pouvoir ajouter une applet à GPO sur les Stratégies de lecture automatique de la configuration Utilisateur :
Stratégie ordinateur local->configuration utilisateur->Modèles d'administration->Composants Windows->Stratégies de lecture automatique
Tout comme il est possible d'ajouter des applets dans le Panneau de configuration...
Manque de chance je n'ai pas trouvé, Microsoft est avare d'info... comme souvent...
Petit intermède pour lancer un appel, si quelqu'un sait comment faire
Donc je me suis rabattu sur Perl, et du coup ça doit tourner sur XP :
J'ai Perl Strawberry 5.20 64bits avec quelques modules dedans, dont spécifiquement pour ce qui nous intéresse :
Pour installer un module, le plus simple c'est l'outil du cpan qui se trouve dans le core, il suffit de taper dans une invite de commande :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 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
cpan install nom_du_module ex :
Passons au choses sérieuses, le programme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part cpan install DBD::WMI
usb.pl
qui se lance dans une invite de commande :
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 #!/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 (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"; } } }
Ou à partir d'un .bat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl usb.pl
Ou si on ne souhaite ne pas voir la console :
Code : Sélectionner tout - Visualiser dans une fenêtre à part C:\Strawberry\perl\bin\perl.exe E:\_DEV\USB\usb.pl
Et pour finir si on souhaite lancer ce programme au démarrage du PC sans Invite de commande intempestive, un .vbs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part C:\Strawberry\perl\bin\wperl.exe E:\_DEV\USB\usb.pl
USB.vbs :
Enfin on ajoute une valeur à la clé RUN du registre pour le démarrer systématiquement pour tous les utiisateurs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 ' Fonctionne dans [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] ' ou dans [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] ' Fonctionne dans menu Démarrer Set WshShell = WScript.CreateObject("WScript.Shell") strData=WshShell.ExpandEnvironmentStrings("%AppData%") WshShell.CurrentDirectory = strData WshShell.Run chr(34) & "E:\_DEV\USB\USB.bat" & Chr(34), 0 Set WshShell = Nothing WScript.Quit
HKEY_LOCAL_MACHINE_SOFTWARE_Microsoft_Windows_CurrentVersion_Run_DelUSB.reg :
Pour un utilisateur spécifique dans la clé qui va bien uniquement...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] "DelUSB"="E:\\_DEV\\USB\\USB.vbs"
Bien sûr dans tout cela il faut mettre les PATHS des fichiers selon la configuration...
NB : En supprimant le # qui commente la suppression :
Vous prenez vos responsabilités !
Code : Sélectionner tout - Visualiser dans une fenêtre à part # rmtree([$Contenu], 1, 0);
PS : A l'arrêt du PC, un programme en cours peut être signalé ?!?
Avec les GPO il suffirait, à l'arrêt du PC, de tuer l’interpréteur wperl en cours...
Enfin : testez correctement le programme avant de le mettre en production, il s'agit d'un premier jet de ce jour...
il est donc perfectible et peut provoquer des bugs dans des environnements différents du mien
Bonjour,
Je trouve votre solution très intéressante et je vous remercie pour vos efforts. j'essaye de faire la même chose mais je sais pas comment modifier ton code a ce qu'il lance un programme de chiffrement tel que bitlocker.
Je vous remercie par avance pour votre réponse.
Bonjour,
C'est vieux comme Hérode
Je ne me rappelais plus avoir fait çà !
Mais je viens de tester et ça fonctionne.
Entre temps je suis passé en perl Strawberry v5.26.0 MSWin32-x64-multi-thread
J'ai dû installer les modules :
Win32::GUI
DBI
Je n'ai jamais utilisé bitlocker, je viens donc de regarder sommairement comment ça fonctionne.
N'ayant pas les droits j'ai dû le lancer dans une invite de commande en tant qu'administrateur (Donc à voir...).
J'ai modifié rapidement le programme usb.pl pour lancer la commande :
Mis en commentaire entre =pod & =cut la destruction initiale des fichiers,
Code : Sélectionner tout - Visualiser dans une fenêtre à part manage-bde.exe -status
Laissé l'avertissement :
Ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Win32::GUI::MessageBox(0,$Message,"ATTENTION !");
Inséré une clé USB en I:
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 my ( $Disk, $FhRep ) = (); 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 !"); sleep 5; my $Executable = 'manage-bde.exe'; my $Param = '-status'; my @Cde = ( $Executable , $Param ); print "\n\n-->@Cde<--\n\n"; system @Cde; =pod 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"; } } =cut } }
Ça fonctionne (encore )
Je ne te serai pas d'un grand secours dans l'utilisation de bitlocker, mais l'idée est là, je pense.
Images :
On continue sur le forum OK
Donc le code pour supprimer tous les fichiers de la clé je l'ai mis en commentaire (entre =pod & =cut)
Le code pour lancer un exécutable c'est tout simplement :
Dans l'odre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 my $Executable = 'manage-bde.exe'; my $Param = '-status'; my @Cde = ( $Executable , $Param ); print "\n\n-->@Cde<--\n\n"; system @Cde;
- On met la commande à lancer dans une variable (il peut être utile de renseigner le PATH complet de cet exécutable
- On met le parametre à passer à l'exécutable dans une autre variable OU dans plusieurs variables ... en fonction des besoins...
- On créé un tableau @Cde (avec pour colonne $Executable et $Param)
- Pour faire bien le print entre --><-- affichera sur le terminal la commande lancée les --> <-- permettent de voir s'il n'y a pas de caractères parasites, espaces...
- On lance l'instruction Perl system qui prend en paramètre la commande à lancer
NB on peut faire plus simple mais j'ai l'habitude de faire comme çà
exemple :
Ou ENCORE :
Code : Sélectionner tout - Visualiser dans une fenêtre à part system 'manage-bde.exe -status';
Note bien qu'il s'agit de quote inversée (AltGr 7) +Espace
Code : Sélectionner tout - Visualiser dans une fenêtre à part `manage-bde.exe -status`;
on peut faire aussi :
On peut ici tester ce qui est renvoyé par la commande et tester $Resultat pour voir si ça c'est bien passé...
Code : Sélectionner tout - Visualiser dans une fenêtre à part my $Resultat = `manage-bde.exe -status`;
...
[Edit 16:34]
Si tu rencontres des soucis avec Perl, il y a sur developpez.net un forum dédié à Perl et même un qui regroupe tout ce qui concerne Perl avec plein de tuto de doc...
Bonjour,
j'ai trouvé que pour chiffré un volume faut passer la commande manage-dbe -on "le nom du volume" -recoverypassword
sauf que dans perl quand j'essaye d'écrire cette comannde il l'accepte pas mon $Disk
ensuite je veux que l'usb inséré qui soit chiffré et pas les autres lecteurs donc voici mon code
my $Message =encode("iso-8859-16", "Le disque $Disk va être chiffré !");
Win32::GUI::MessageBox(0,$Message,"ATTENTION !");
sleep 5; #ça signifie quoi cette ligne ??
my $Executable = 'manage-bde.exe';
my $Param = '-on $Disk -recoverypassword'; #Ici $Disk est le disk que je veux chiffré (celui qui vient d'être inséré)
my @Cde = ( $Executable , $Param );
print "\n\n-->@Cde<--\n\n";
system @Cde;
Merci
my $Executable = 'manage-bde.exe';
my $Param1 = '-on';
my @Cde = ( $Executable , $Param1, $Disk );
print "\n\n-->@Cde<--\n\n";
system @Cde;
J'ai essayé ce code ça marche pas la valeur $Disk rajoute un anti slash a la fin
Par exemple si le Volume est H il m'affiche H:\ alors que dans la syntaxe de la commande manage-bde doit avoir comme option de volume exactement H:
Merci par avance pour votre aide.
Bonjour,
1)
cela provoque une attente de 5 secondes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part sleep 5;
Tu peux l'enlever !
C'était juste pour laisser un peu de temps pour réfléchir
2)
c'est parce que moi j'avais besoin d'un antislash à passer à ma commande, regarde bien là où je l'ajoute :il m'affiche H:\ alors que dans la syntaxe de la commande manage-bde doit avoir comme option de volume exactement H:
Si tu n'en as pas besoin tu supprimes ou commentes la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part $Disk = $Disk ."\\";
[Edit 14:55]
PS : lorsque tu colles du code utilise les balises \[CODE\] \[/CODE\] avec le bouton # ça conserve les indentations et c'est beaucoup plus lisible...
et la bulle pour faire des citations.
Pour avoir :
manage-dbe -on "le nom du volume" -recoverypasswordÉventuellement mets des espaces au bons endroits devant les - :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 my $Executable = 'manage-bde.exe'; my $Param1 = '-on'; my $Param2= '-recoverypassword'; my @Cde = ( $Executable , $Param1, $Disk, $Param2 ); print "\n\n-->@Cde<--\n\n"; system @Cde;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 my $Executable = 'manage-bde.exe'; my $Param1 = ' -on '; my $Param2= ' -recoverypassword'; my @Cde = ( $Executable , $Param1, $Disk, $Param2 ); print "\n\n-->@Cde<--\n\n"; system @Cde;
Bonjour,
Après avoir modifié mon code j'arrive au code suivant :
#!/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:ath; # 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 (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 chiffré ! \a\a\a\a\n";
my $Message =encode("iso-8859-16", "Le disque $Disk va être effacé !");
Win32::GUI::MessageBox(0,$Message,"ATTENTION !");
my $Executable = 'manage-bde.exe';
my $Param1 = '-on';
my @Cde = ( $Executable , $Param1, $Disk );
print "\n\n-->@Cde<--\n\n";
system @Cde;
}
#==============================================================
# Pour avoir les accents sur la console DOS
# http://perl.developpez.com/faq/perl/...nal#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
Je comprend pas cette ligne et tout ce qui est en dessous pourquoi aviez vous rajoutez ce bout de code, ce n'est pas du SQL Si vous pouvez commentez les lignes principales je serais vraiment reconnaissant !!
#!/usr/bin/perl -w
package main;
use strict;
use DBI;
use Data:umper;
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";
}
}
}
Merci par avance de votre réponse
Bonjour,
Ta réponse est totalement illisible
Rappel :
Tout ce qui est après =pod c'est du commentaire, tu peux le supprimer.
Tout ce qui est entre =pod & =cut c'est du commentaire, tu peux le supprimer.
Je le mets pour montrer où j'ai pioché l'info :
Pour avoir les accents sur l'invite de commande DOS : https://perl.developpez.com/faq/perl...nal#AccentsDOS
Le module DBI
Explications du module DBI : http://www.perlmonks.org/bare/?node_id=827106
Si tu suis les liens qui se trouvent à l'intérieur, tu arriveras aux informations
Quand j'insère un disque dure externe ça m'affiche
manage-bde -on E:<--
en fait je cherche a ce que le nom du volume s'affiche tel qu'il est (manage-bde -on E: ) , j'ai essayé de décomenter la ligne ci-dessous mais sans résultat.
$Disk = $ev->{TargetInstance}->{Name};
Je tiens vraiment a vos réponses,
Merci bien
Insère la totalité de ton code entre balises CODE comme sur l'image ci-dessous
[-CODE] [/CODE]
je ne peux pas voir où est le pb
Pour avoir :
Avec ce qu'on a fait, il faut :
Code : Sélectionner tout - Visualiser dans une fenêtre à part manage-bde -on E:
Mais je n'ai jamais utilisé manage-bde...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 my $Executable = 'manage-bde.exe'; my $Param1 = ' -on '; my @Cde = ( $Executable , $Param1, $Disk ); print "\n\n-->@Cde<--\n\n"; system @Cde;
Je te donne seulement l'ordre des paramètres... après ce que ça fait, si tu as les droits ou non, si tu as une key correctement générée... je ne maîtrise pas
Ah voilà désolé ;
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 #!/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 (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 chiffré ! \a\a\a\a\n"; my $Message =encode("iso-8859-16", "Le disque $Disk va être chiffré !"); Win32::GUI::MessageBox(0,$Message,"ATTENTION !"); my $Executable = 'manage-bde.exe'; my $Param1 = '-on'; my @Cde = ( $Executable , $Param1, $Disk ); print "\n\n@Cde\n\n"; system @Cde; } } #============================================================== # 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"; } } }Merci bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part Quand j'insère une clé USB tout marche comme prévu et la clé est chiffré mais quand j'insère un disque mais cette fois sur un autre ordinateur il me dis que la commande manage-bde.exe n'est pas reconnu en tant que commande interne ou externe.
Par contre en dehors du script la commande manage.bde.exe fonctionne bien!
HA !
merci ça va mieux pour mes vieux yeux.
Utilise # que pour le code pour les citations tu as la bulle juste à côté :
Donc soitQuand j'insère une clé USB tout marche comme prévu et la clé est chiffré mais quand j'insère un disque mais cette fois sur un autre ordinateur il me dis que la commande manage-bde.exe n'est pas reconnu en tant que commande interne ou externe.
- tu es sur un PC qui n'a pas manage-bde.exe et tu es cuit
- soit le PATH n'est pas à niveaux (ce qui m'étonnerait)
Donc :
- il te faut recherche sur tout le disque l'exécutable manage-bde.exe
En Windows 7 il se trouve sous :
Si tu le trouves tu mets la totalité du PATH de cet exécutable dans la variable $Executable
Code : Sélectionner tout - Visualiser dans une fenêtre à part C:\Windows\System32
Comme ceci :
J'ai supprimé tous les commentaires et l'utilisation de ActiverAccents(); puisque tu ne fais pas de print sur l'invite de commande
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 #!/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 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(); my ( $Disk, $FhRep ) = (); 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 "ATTENTION il va être chiffré !\n"; my $Message =encode("iso-8859-16", "Le disque $Disk va être chiffré !"); Win32::GUI::MessageBox(0,$Message,"ATTENTION !"); my $Executable = 'C:\Windows\System32\manage-bde.exe'; my $Param1 = '-on'; my @Cde = ( $Executable , $Param1, $Disk ); print "\n\n@Cde\n\n"; system @Cde; } }
[Edit]
Bonne nouvelle !Par contre en dehors du script la commande manage.bde.exe fonctionne bien!
Donc mets dans le pgm le PATH complet (Le tien pas forcément le mien, vérifie que l'exécutable se trouve bien :
Code : Sélectionner tout - Visualiser dans une fenêtre à part C:\Windows\System32
[Re Edit]
Tu n'as pas besoin non plus de :
puisque tu ne gère pas de fichiers...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 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
A supprimer !
Je l'ai fait dans le code ci-dessus !
En fait la commande n'est pas reconnu que quand je la lance via le script usb.pl
, par contre quand je la lance en CMD normal la commande s'éxecute !
jai bien marqué le chemin de la commande mais toujours le même résultat ( commande non reconnu )
Merci Bien
Est-ce que tu le lances dans une invite en tant qu'Administraateur ?
Si non :
Clic droit sur l'icône 'Invite de commande' --> Lancer en tant qu'Administrateur
et là tu lances l'exécutable Perl
Je crains que ce soit un pb de droits
J'ai rajouté activeraccent();
J'ai modifié de façon an ne faire qu'un -status en paramètre et ça fonctionne
Essaie de faire la même chose : juste un -status dans manage-bde :
Là je fais une pause miam miam @+
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 #!/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 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 (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 "ATTENTION il va être chiffré !\n"; my $Message =encode("iso-8859-16", "Le disque $Disk va être chiffré !"); Win32::GUI::MessageBox(0,$Message,"ATTENTION !"); my $Executable = 'manage-bde.exe'; my $Param1 = '-status'; my @Cde = ( $Executable , $Param1, $Disk ); print "\n\n--->@Cde<---\n\n"; system @Cde; } } #============================================================== # 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; }
Bon le jour se lève
Essaie çà :
Chez moi je n'ai pas pas d'erreur... ???
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 #!/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 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, $LigneCde ) = (); my $Executable = 'C:/Windows/System32/manage-bde.exe'; my $Param1 = '-on'; 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 "ATTENTION il va être chiffré !\n"; my $Message =encode("iso-8859-16", "Le disque $Disk va être chiffré !"); Win32::GUI::MessageBox(0,$Message,"ATTENTION !"); $LigneCde = "$Executable $Param1 $Disk"; print "\n\n--->$LigneCde<---\n\n"; my $Resultat = `$LigneCde`; print "PATIENTER retirer la clé !\n"; if ( $Resultat ) { my $Message =encode("iso-8859-16", "Retirer la clé, Taper OK, puis en insérer événtuellement une autre !"); print "$Message \n"; Win32::GUI::MessageBox(0,$Message,"ATTENTION !"); sleep 5; next; } } } #============================================================== # 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; }
Mais je n'ai pas de key de chiffrement, mais déjà il ne proteste pas !
Si tu me donnes qq explications pour chiffrer, créer une key... ça me permettrait de mieux tester...
Je n'ai pas trop envie de partir à la découverte, surtout si tu as l'info... ou un lien...
[Edit 29/05 04:35]
Ma curiosité n'a pas résisté, mais elle n'a pu aller bien loin, mes PC sont en Win7 -> BitLocker en supporte pas toutes les nouvelles fonctionnalités.
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