Lire et modifier des clés de la base de registres (VBS)
Avant toutes choses, ATTENTION, la manipulation des bases de registres est une opération à haut risque. Une erreur risque de compromettre gravement le bon fonctionnement de votre ordinateur.
Avant toute éventuelle modification de la base, enregistrez ou notez soigneusement la configuration initiale !
Avec VBS, on peut très facilement lire ou modifier la valeur de clés de la base de registres.
Un exemple simple : la modification du délai de mise en service de l'économiseur d'écran.
Pour lire la valeur de ScreenSaveTimeOut :
Set ssh = WScript.CreateObject("WScript.Shell")
delay = ssh.RegRead("HKEY_CURRENT_USER\Control Panel\DeskTop\ScreenSaveTimeOut")
Pour modifier la valeur de la clé :
Set ssh = WScript.CreateObject("WScript.Shell")
ssh.RegWrite "HKEY_CURRENT_USER\Control Panel\DeskTop\ScreenSaveTimeOut",5
La situation est un peu plus compliquée quand la valeur de la clé est un tableau de chiffres en binaire.
RegRead permet toujours de lire les données, mais renvoie un tableau (array).
On peut voir les valeurs du tableau en les éditant au format texte :
Set Sh = WScript.CreateObject("WScript.Shell")
valcle=sh.regread("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\CaptionFont")
txt=""
if isarray(valcle) then
for num=0 to ubound(valcle)
txt=txt & valcle(num) & ","
next
txt=left(txt,len(txt)-1)
end if
msgbox txt
On peut aussi les éditer en tableau hexadecimal, ce qui peut être utile si on veut réinjecter les valeurs dans la base de registres :
Set Sh = WScript.CreateObject("WScript.Shell")
valcle=sh.regread("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\CaptionFont")
txt=""
if isarray(valcle) then
for num=0 to ubound(valcle)
txt=txt & right("0" & hex(valcle(num)),2) & ","
next
txt=left(txt,len(txt)-1)
end if
msgbox txt
Si la valeur hexadécimale peut être lue en clair :
Set Sh = WScript.CreateObject("WScript.Shell")
valcle=sh.regread("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\CaptionFont")
txt=""
if isarray(valcle) then
for num=0 to ubound(valcle)
If valcle(num) <> 0 Then txt = txt & Chr(CInt("&h" & (Right("0" & Hex(valcle(num)), 2))))
next
end if
msgbox txt
Enfin, il peut s'avérer plus simple d'exporter une clé de la base de registre avant d'en extraire les valeurs qui nous intéressent :
Set Sh = WScript.CreateObject("WScript.Shell")
sh.Run "%comspec% /c REGEDIT /E ""c:\mes documents\rien.reg"" ""HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics""",0,true
La commande crée un fichier rien.reg contenant l'édition de la partie de base de registres correspondant
à la clé "HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics".
(Noter l'utilisation de %comspec% plutôt que l'adresse complète de command.com, l'utilisation de doubles guillemets
à l'intérieur de la ligne de commande pour remplacer les guillemets simples ; les guillemets autour de l'adresse du
fichier reg sont utiles pour éviter les problèmes aves les espaces ; on aurait aussi pu utiliser le nom DOS sans guillemet).
Pour extraire les données correspondant à une valeur particulière de la clé, on peut utiliser
les fonctions de texte de VBS :
cle_="HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics"
valeur="CaptionFont"
msgbox lit_reg(cle,valeur)
function lit_reg(cle,valeur)
Set fs = CreateObject("Scripting.FileSystemObject")
Set Sh = WScript.CreateObject("WScript.Shell")
'adresse du fichier dans lequel on inscrit la valeur de la clé
adr=replace(wscript.scriptfullname,wscript.scriptname,"svg_registres.reg")
'exporter la clé (les guillements évitent les pb avec les adresses completes)
sh.Run "%comspec% /c REGEDIT /E """ & adr & """ """ & cle & """",0,true
'ouvrir en lecture
'attendre que le fichier reg soit créé
erro=1
do while erro<>0
on error resume next
'le deuxième true pour lire en ANSI, dépend de la version de regedit !
Set fich = fs.OpenTextFile(adr, 1, False, true)
erro= Err.Number
loop
on error goto 0
'lire le fichier ligne par ligne pour chercher valeur
lit_reg=""
do while instr(lit_reg,"""" & valeur & """=")=0 and not fich.atendofstream
lit_reg=fich.readline
loop
'prendre en compte les lignes des tableaux
if lit_reg<>"" then
do while right(lit_reg,1)="\" and not fich.atendofstream
lit_reg=lit_reg & fich.readline
loop
end if
fich.close
end function
L'avantage de cette méthode est qu'elle renvoie la valeur dans un format directement réexportable vers la base de registres.
Pour modifier la valeur d'une clé de la base de registres, on a vu qu'on pouvait utiliser RegWrite.
Cette technique ne fonctionne pas quand la donnée est un tableau de chiffres.
Dans ce cas, il est préférable d'importer un fichier reg dans la base.
Ce fichier reg peut très bien être créé par VBS :
verdana="hex:f3,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,bc,02,00,00," & _
"00,00,00,00,00,00,00,00,56,00,65,00,72,00,64,00,61,00,6E,00,61,00,00,00,74," & _
"00,20,00,4d,00,53,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00," & _
"00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00"
cle="HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics"
valeur="CaptionFont"
ecrit_reg cle,valeur,verdana
Sub ecrit_reg (key, value, data)
Set sh = CreateObject("Wscript.Shell")
Set fs = CreateObject("Scripting.FileSystemObject")
key = "[" & key & "]"
If value <> "@" then value = chr(34) & value & chr(34)
Set fich = fs.CreateTextFile("C:\rien.reg",true)
fich.WriteLine("REGEDIT4")
fich.WriteLine(key)
fich.WriteLine(value & "=" & data)
fich.Close
'attendre que le fichier reg soit créé
wscript.sleep(1000)
'lancer le fichier reg via regedit (le /s évite les messages de confirmation)
sh.Run "regedit /s ""C:\rien.reg""", 1, true
End Sub