Comment manipuler la base de registre Windows en Perl ?

djibril

Le but de cet article est de vous montrer comment manipuler la base de registre en Perl : lecture ou création des clés/valeurs.
Commentez

- Titre : Comment manipuler la base de registre Windows en Perl ?

- Auteur : djibril

- Parution : 8 mai 2013

- Mise à jour : 22 mai 2013

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 djibril. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Prérequis

- III. Lire la base de registre

- III-A. Obtenir des informations sur l'installation d'ActivePerl

- IV. Modifier la base de registre

- IV-A. Manuellement

- IV-B. Programme Perl

- IV-B-1. Suppression des clés

- IV-B-2. Création des clés

- V. Conclusion

- VI. Remerciements

I - Introduction

La base de registre (BDR) est une base de données utilisée par le système d'exploitation Windows. Elle contient les données de configuration des logiciels installés et également du système Windows lui-même. Les données sont faciles d'accès et la manipulation de cette base est faisable via l'outil Windows regedit. Il est possible de la manipuler via un programme écrit en VB, Perl ou autres. Cet article vous donne la possibilité de le faire en Perl.

Pour en savoir plus sur les bases de registre, n'hésitez pas à lire la FAQ Windows sur developpez.com.

La manipulation de la base de registre Windows est très simple sous Perl. Il existe des modules bien écrits qui nous facilitent la vie. Il suffit de bien lire la documentation de ces modules afin de bien les utiliser.

Dans cet article, nous utiliserons le module Win32::TieRegistry et divers exemples.

Dans la base de registre, les données sont organisées dans des HKEY (soit « poignée de clés »). Les données sont stockées dans des « ruches » qui sont des blocs, éventuellement chaînés de 4096 caractères.

Ces HKEY sont au nombre de cinq, leurs noms sont explicites :

- HKEY_CLASSES_ROOT ;

- HKEY_CURRENT_USER ;

- HKEY_LOCAL_MACHINE ;

- HKEY_USERS ;

- HKEY_CURRENT_CONFIG.

Les programmes de cet article vont manipuler les données. Il suffit de connaître le chemin de l'information pour y accéder et/ou les manipuler, c'est ce qui est bien souvent le moins évident !

II - Prérequis

Les programmes que nous utilisons dans cet article manipulent la base de registre. Par sécurité, nous vous recommandons de faire une sauvegarde préalable de cette dernière.

Pour sauvegarder votre base de registre, lancez la commande suivante : regedit. Une fois l'interface graphique ouverte, exportez la base.

Pour tester les programmes de cet article sous Windows Vista, Seven, 8… vous devez installer le module Win32::TieRegistry.

Il est très important de lancer les programmes ou d'ouvrir la console DOS avec les droits d'administrateur, sinon il vous sera impossible de lire entièrement la base de registre pour des raisons de sécurité et il se peut que vous ayez le message « Le système n'a pas trouvé l'option d'environnement spécifiée ».

Pour en savoir plus sur l'installation des modules en Perl, n'hésitez pas à lire cet article : installation des modules CPAN.

III - Lire la base de registre

III-A - Obtenir des informations sur l'installation d'ActivePerl

Si comme moi vous êtes sous Windows (Vista en ce qui me concerne) et utilisez ActivePerl, vous avez certaines informations d'ActivePerl dans votre base de registre suite à son installation que nous allons lister :

- lieu de location ;

- date d'installation ;

- version ;

- …

Les informations d'installation des logiciels sous Windows se trouvent dans la base de registre à ce niveau : HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall.

Sous certains postes comme Windows Seven 64 bits, le chemin peut être : HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\. Pour en savoir plus, lisez cette note Microsoft : 32-bit and 64-bit Application Data in the registry.

Ensuite, dans le niveau du dessous, vous avez le nom du logiciel ou un code. Il va donc falloir parcourir la liste des noms et pour chacun d'eux, on recherche une clé se nommant « DisplayName ». Cela permet de s'assurer qu'il s'agit bien du logiciel recherché. Voici une capture d'écran montrant les informations à trouver et un programme pour rechercher les informations sur ActivePerl.

ActivePerl : base de registre

1. #!/usr/bin/perl

2. use strict;

3. use warnings;

4. use Win32::TieRegistry;

6. my $nom_logiciel = 'ActivePerl';

7. if ( my $RefInfoPerl = GetProductCode($nom_logiciel) ) {

8. foreach my $cle ( keys %{$RefInfoPerl} ) {

9. print "$cle : $RefInfoPerl->{$cle}\n";

10. }

11. }

13. sub GetProductCode {

14. my $Name         = shift;

15. my $RegistryPath = 'HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall';

16. my %InfoProduct;

18. $Registry->Delimiter('/');

20. my $SubKey = $Registry->{$RegistryPath} or die "Lecture impossible : $RegistryPath\n$^E\n";

22. foreach my $key ( keys %{$SubKey} ) {

23. my $RefName = $SubKey->{$key}{DisplayName};

25. if ( $RefName and $RefName =~ m{$Name}i ) {

26. $InfoProduct{Code} = $key;

27. if ( exists $SubKey->{$key}{DisplayName} ) {

28. $InfoProduct{DisplayName} = $SubKey->{$key}{DisplayName};

29. }

30. if ( exists $SubKey->{$key}{InstallLocation} ) {

31. $InfoProduct{InstallLocation} = $SubKey->{$key}{InstallLocation};

32. }

33. if ( exists $SubKey->{$key}{DisplayVersion} ) {

34. $InfoProduct{DisplayVersion} = $SubKey->{$key}{DisplayVersion};

35. }

36. if ( exists $SubKey->{$key}{InstallDate} ) {

37. $InfoProduct{InstallDate} = $SubKey->{$key}{InstallDate};

38. }

39. last;

40. }

41. }

43. return \%InfoProduct;

44. }

J'obtiens sur mon ordinateur le résultat suivant :

Résultat

Code : {02BFF1A3-A0D5-4F64-8558-A22682BCDA58}/
DisplayVersion : 5.14.1402
InstallDate : 20111124
DisplayName : ActivePerl 5.14.2 Build 1402
InstallLocation : C:\Perl\

Le programme contient une procédure nommée « GetProductcode » qui nous permet de lister certaines informations. Le nom de logiciel que nous cherchons est passé en argument. Dans le cas ci-dessus, c'est « ActivePerl », mais ça aurait pu être Adobe, Gimp…

En ligne 15, la variable contient le chemin dans la base de registre qui permet d'accéder à la plupart des logiciels installés. Les données récupérées sont stockées dans un hash qui est renvoyé par la procédure.

En ligne 18, nous précisons que le délimiteur est un slash « / ».

La ligne 20 permet de récupérer la base de registre au niveau de l'arborescence voulue. Ensuite, on parcourt ce hash pour extraire ce dont on a besoin.
N.B. La variable est une référence de hash.

En ligne 23, on récupère la valeur de la clé « DisplayName », ce qui nous permet de trouver réellement notre logiciel. Une fois trouvé, nous récupérons les valeurs des clés « InstallLocation », « DisplayVersion », et « InstallDate ». Exemple :

if ( exists $SubKey->{$key}{InstallLocation} ) {
$InfoProduct{InstallLocation} = $SubKey->{$key}{InstallLocation};
}

Comme vous pouvez le constater, c'est très simple. Le plus compliqué, c'est de connaître un peu l'arborescence de la base de registre pour savoir où chercher. Nous aurions pu écrire notre code différemment. Si vous voulez en savoir plus, lisez la documentation du module Win32::TieRegistry.

IV - Modifier la base de registre

Le but est maintenant de modifier notre base de registre. Pour cela, nous allons définir un exemple simple à réaliser.

Nous avons des fichiers d'extension « .dvp » et souhaitons que ces fichiers soient ouverts systématiquement (après un double-clic) via notre éditeur de texte Notepad++.
De plus, nous souhaitons que tous les fichiers « .dvp » de notre ordinateur aient une icône de notre choix qui est la suivante : . Nous allons voir comment le faire manuellement et en Perl.

Avant de faire quoi que ce soit, je vous recommande de faire une sauvegarde de votre base de registre (une exportation) !

IV-A - Manuellement

Nous souhaitons travailler sur les extensions de type « .dvp ». Créons une clé .dvp dans l'HKEY « HKEY_CLASSES_ROOT ». À l'intérieur, attribuons à la clé « par défaut » une valeur de notre choix : FichierDVP.

Il est important de choisir un nom sans espace.

Pour créer la clé .dvp, vous faites un clic droit sur HKEY_CLASSES_ROOT, puis Nouveau → Clé.

Maintenant, il faut créer une clé du même nom choisi ci-dessus « FichierDVP » dans laquelle on crée deux clés :

- Une sous-clé « DefaultIcon ». Sa valeur par défaut aura le nom du fichier developpez.ico (chemin complet), c'est cette icône qui sera affichée dans l'explorateur Windows pour tous les fichiers d'extension .dvp. Pour l'article, l'icône se trouve dans le répertoire Temp : C:\Temp\developpez.ico. Nous aurions pu indiquer le nom d'un fichier .exe ou .dll suivi d'une virgule et du rang de l'icône voulue dans ce fichier (0, 1, 2… ) ;

- Une sous-clé « shell » pour action dans laquelle on crée une sous-clé « open », puis à l'intérieur une sous-clé « command ». Sa valeur par défaut contient la commande à exécuter (Notepad++). Dans la commande, on précisera l'argument %1 qui contient le nom du fichier. Pensez aux guillemets afin d'éviter les mauvaises surprises des noms de fichiers avec espaces.
On aura donc shell → open → command et « C:\Program Files\Notepad++\notepad++.exe "%1" » en commande.

À ce stade, tout double-clic sur un fichier d'extension « .dvp » lancera Notepad++ avec en argument le nom du fichier. Le fichier sera ainsi ouvert dans Notepad++.
Pour voir vos fichiers .dvp avec l'icône dvp, vous devez redémarrer votre ordinateur ou au moins, fermer et relancer votre session.

Voyons maintenant comment faire cette modification de la base de registre en Perl.

IV-B - Programme Perl

Programme de création des clés

1. #!/usr/bin/perl

2. use strict;

3. use warnings;

4. use Win32::TieRegistry;

6. $Registry->Delimiter('/');

7. my $NomExtension = 'FichierDVP';

9. # Suppression des clés si présentes

10. $Registry->FastDelete(1);

11. delete $Registry->{"HKEY_CLASSES_ROOT/$NomExtension/DefaultIcon/"};

12. delete $Registry->{"HKEY_CLASSES_ROOT/$NomExtension/shell/open/command/"};

13. delete $Registry->{"HKEY_CLASSES_ROOT/$NomExtension/shell/open/"};

14. delete $Registry->{"HKEY_CLASSES_ROOT/$NomExtension/shell/"};

15. delete $Registry->{"HKEY_CLASSES_ROOT/$NomExtension/"};

16. delete $Registry->{"HKEY_CLASSES_ROOT/.dvp/"};

18. # Création des nouvelles clés

19. # Clé .dvp

20. $Registry->{"HKEY_CLASSES_ROOT/.dvp/"} = { '/' => $NomExtension };

22. # Clé FichierDVP

23. $Registry->{"HKEY_CLASSES_ROOT/$NomExtension/"} = {

24. 'DefaultIcon' => {

25. '/' => 'C:\Temp\developpez.ico',

26. },

27. 'shell' => {

28. 'open' => {

29. 'command' => {

30. '/' => 'C:\Program Files\Notepad++\notepad++.exe "%1"'

31. }

32. },

33. }

34. };

La ligne 6 permet de définir le délimiteur.
La ligne 7 définit la variable qui contient le nom de notre nouvelle extension.

IV-B-1 - Suppression des clés

De la ligne 10 à 16, on supprime les clés au cas où elles existeraient. La méthode FastDelete permet d'économiser de la mémoire pendant la suppression des clés. En fait, si la méthode est appelée avec la valeur 1. La suppression des clés dans le hash se fait sans aucune copie. La mémoire n'est pas plus sollicitée. En appelant la méthode avec la valeur 0, la méthode delete retourne une copie de la portion de hash (une référence de hash) qui est supprimée.

$ref_copie = delete $Registry->{"HKEY_CLASSES_ROOT/.dvp/"};

0 : $ref_copie = référence de hash (si succès)
1 : $ref_copie = 1 (si succès)

Les lignes 11 à 16 ont un ordre à respecter. Une clé ne sera pas supprimée si cette dernière contient des sous-clés. Il faut donc supprimer en premier les sous-clés les plus basses dans l'arborescence. Ainsi, sachant que nous avons l'arborescence suivante : HKEY_CLASSES_ROOT → FichierDVP → DefaultIcon et HKEY_CLASSES_ROOT → FichierDVP → shell → open → command

Commençons par supprimer les clés DefaultIcon, command, open, shell et FichierDVP.

IV-B-2 - Création des clés

À partir de la ligne 20, nous créons nos clés. C'est assez simple, Il suffit de passer à la variable $Registry notre clé à créer $Registry->{"HKEY_CLASSES_ROOT/$NomExtension/"} puis on lui affecte une référence de hash qui contient toutes les sous-clés et valeurs. Pour renseigner les clés « par défaut », la clé du hash est un slash « / » ou une chaîne vide «  ».

Valeur par défaut

'DefaultIcon' => {
'/' => 'C:\Temp\developpez.ico',
},

ou

Valeur par défaut

'DefaultIcon' => {
'' => 'C:\Temp\developpez.ico',
},

Vous avez maintenant toutes les clés en main pour vous amuser avec les bases de registre.

V - Conclusion

Cet article vous a montré les méthodes simples pour manipuler une base de registre Windows en utilisant le module Win32::TieRegistry.

Vous pouvez télécharger les sources de cet article.

Je vous recommande de lire la documentation officielle du module afin d'en apprendre plus.

Si vous avez des idées d'améliorations, des suggestions, corrections ou commentaires, n'hésitez pas à me donner vos avis : Commentez .

VI - Remerciements

Je tiens à remercier Michel DUFOUR qui m'a mis la puce à l'oreille pour rédiger cet article et ClaudeLELOUP pour la relecture orthographique.