LIRE ET ECRIRE DES CLÉS DANS LA BASE DE REGISTRE

reivon Messages postés 81 Date d'inscription lundi 18 février 2002 Statut Membre Dernière intervention 4 février 2005 - 2 mai 2002 à 22:55
kronemburg Messages postés 15 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 3 décembre 2005 - 16 août 2005 à 05:59
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/3166-lire-et-ecrire-des-cles-dans-la-base-de-registre

kronemburg Messages postés 15 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 3 décembre 2005
16 août 2005 à 05:59
Cool les commentaires... Swman0 t'as oublié de relire deux fois (il le fallait pour censurer ^^)
C'est vrai qu'il y a beaucoup de sources la dessus, mais pour l'instant j'ai pas vu de truc clair (dans le vocabulaire) pour les pures débutants débiles !
sman0 Messages postés 39 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 3 novembre 2005
5 déc. 2004 à 18:11
ouais mais Multiprise, regarde ici

http://www.vbfrance.com/code.aspx?ID=133

et leve la tete

Moi j'apelle ca ripper, le gars s'est meme pas donné la peine de changer les commentaires
regarde bien, apres on verra qui est le con.
thx
cs_Multiprise Messages postés 63 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 23 avril 2013
5 déc. 2004 à 11:58
C'est vrai qu'il y a des dizaines de sources sur le même sujet. Et alors!, un éventail de choix n'est pas réducteur me semble-t'il. Chacun peut à sa guise tester et choisir la source qui correspond le mieux à ses besoins.
Ce site est créé pour échanger de manière constructive. Descendre en permanence ceux qui essaient d'y contribuer n'a aucun intérêt. Mais un con obtu restera toujours un con et il faut faire avec pusqu'on ne peut faire sans.
Ceci dit toute critique est bonne si elle est pertinente.
-----
Voici un autre code équivalent pour manipuler la base de registres:
'---------------------------------------------------------------------
Option Explicit
Dim lng As Long
Dim Buff As Long
'Constantes Types de clefs ClefRacine de la base de registres
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const HKEY_CURRENT_USER = &H80000001
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_USERS = &H80000003
Private Const HKEY_DYN_DATA = &H80000004
'
'Type de données des valeurs de la base de registres
Private Const REG_SZ = 1 ' chaîne Unicode terminée par nul
Private Const REG_EXPAND_SZ = 2 ' chaîne Unicode terminée par nul
Private Const REG_DWORD = 4 ' nombre 32-bit (mot sur 4 octets)
'
' Valeurs de type de création
Private Const REG_OPTION_NON_VOLATILE = 0 'clef préservée lorsque le système est redémarré
'
'- Type Security_Attributes de la base de registres...
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Boolean
End Type
' Options de sécurité de clef de la base de registres.
Private Const READ_CONTROL = &H20000
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
Private Const KEY_CREATE_SUB_KEY = &H4
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_CREATE_LINK = &H20
Private Const KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + READ_CONTROL
Private Const KEY_WRITE = KEY_SET_VALUE + KEY_CREATE_SUB_KEY + READ_CONTROL
Private Const KEY_EXECUTE = KEY_READ
Private Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL
'
' Valeurs renvoyées lors des opérations (écriture, lecture, suppression, création, actualisation)
Private Const ERROR_NONE = 0
Private Const ERROR_BADKEY = 2
Private Const ERROR_ACCESS_DENIED = 8
Private Const ERROR_SUCCESS = 0
'
'****************************************************
'**** API Windows de Gestion des REGISTRES ****
'****************************************************
'Créer ou ouvrir une clef
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String, _
phkResult As Long) As Long

'Supprimer une clef
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String) As Long

'Supprimer une valeur et les données correspondantes dans une clef
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String) As Long

'Lire une valeur et les données correspondantes
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
(ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal lpReserved As Long, _
lpType As Long, _
lpData As Any, _
lpcbData As Long) As Long

'Fixer ou créer une valeur avec données ou modifier les données d'une Valeur string
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _
(ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal Reserved As Long, _
ByVal dwType As Long, _
ByVal lpData As Any, _
ByVal cbData As Long) As Long
'
Private Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" _
(ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal Reserved As Long, _
ByVal dwType As Long, _
lpValue As Long, _
ByVal cbData As Long) As Long


'*****************************************************************
'**** FONCTIONS ET PROCEDURES DE MANIPULATION DES REGISTRES ****
'*****************************************************************
'
'
'Convertis le nom de la ClefRacine (String ou entier) en entier long
'La valeur de la ClefRacine Pouvant être saisie en Numérique ou Alphanumérique
'-----------------------------------------------------------------------------
Private Function ConvertClef(ClefRacine As Variant) As Long
On Error Resume Next
If ClefRacine 0 Or ClefRacine "HKEY_LOCAL_MACHINE" Then ConvertClef = HKEY_LOCAL_MACHINE
If ClefRacine 1 Or ClefRacine "HKEY_CURRENT_USER" Then ConvertClef = HKEY_CURRENT_USER
If ClefRacine 2 Or ClefRacine "HKEY_CLASSES_ROOT" Then ConvertClef = HKEY_CLASSES_ROOT
If ClefRacine 3 Or ClefRacine "HKEY_USERS" Then ConvertClef = HKEY_USERS
If ClefRacine 4 Or ClefRacine "HKEY_DYN_DATA" Then ConvertClef = HKEY_DYN_DATA
End Function
'

'----------------------------------------------------------------
'Créer une nouvelle Clef (Subkey)
'----------------------------------------------------------------
Public Function RegCreateClef(ClefRacine As Variant, Chemin As String) As Long
Dim RetVal As Long
On Error Resume Next
'Suppression éventuelle de l'Anti-Slash (\) qui précède le chemin
If Mid(Chemin, 1, 1) "" Then Chemin Mid(Chemin, 2)
'Ajout éventuel d'un Anti-Slash (\) pour terminer le chemin
If Mid(Chemin, Len(Chemin), 1) <> "" Then Chemin = Chemin & ""
RetVal = RegCreateKey(ConvertClef(ClefRacine), Chemin, lng)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
RegCreateClef = lng
End Function
'

'-----------------------------------------------------------------
'Supprimer une Clef
'-----------------------------------------------------------------
Public Function RegDeleteClef(ClefRacine As Variant, Chemin As String)
Dim RetVal As Long
On Error Resume Next
'Suppression éventuelle de l'Anti-Slash (\) qui précède le chemin
If Mid(Chemin, 1, 1) "" Then Chemin Mid(Chemin, 2)
'Ajout éventuel d'un Anti-Slash (\) pour terminer le chemin
If Mid(Chemin, Len(Chemin), 1) <> "" Then Chemin = Chemin & ""
RetVal = RegDeleteKey(ConvertClef(ClefRacine), Chemin)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
End Function
'

'--------------------------------------------------------------------
'Ajouter une Valeur (String)
'--------------------------------------------------------------------
Public Function RegWriteVal(ClefRacine As Variant, Chemin As String, Valeur As String, Donnee As String)
Dim RetVal As Long
On Error Resume Next
If Trim(Donnee) "" Then Donnee " "
'Suppression éventuelle de l'Anti-Slash (\) qui précède le chemin
If Mid(Chemin, 1, 1) "" Then Chemin Mid(Chemin, 2)
'Ajout éventuel d'un Anti-Slash (\) pour terminer le chemin
If Mid(Chemin, Len(Chemin), 1) <> "" Then Chemin = Chemin & ""
RetVal = RegCreateKey(ConvertClef(ClefRacine), Chemin, lng)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
RetVal = RegSetValueEx(lng, Valeur, 0&, 1, Donnee, Len(Donnee) + 1)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
RegWriteVal = Donnee
End Function
'
'--------------------------------------------------------------------
'Ajouter une Valeur (Reg DWord)
'--------------------------------------------------------------------
Public Function RegWriteValDW(ClefRacine As Variant, Chemin As String, Valeur As String, Donnee As Long)
Dim RetVal As Long
On Error Resume Next
If Trim(Donnee) "" Then Donnee " "
'Suppression éventuelle de l'Anti-Slash (\) qui précède le chemin
If Mid(Chemin, 1, 1) "" Then Chemin Mid(Chemin, 2)
'Ajout éventuel d'un Anti-Slash (\) pour terminer le chemin
If Mid(Chemin, Len(Chemin), 1) <> "" Then Chemin = Chemin & ""
RetVal = RegCreateKey(ConvertClef(ClefRacine), Chemin, lng)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
Err.Clear
RetVal = RegSetValueExLong(lng, Valeur, 0&, 4, Donnee, 4)
If Err.Number <> 0 Then Debug.Print Err.Description; Err.Source
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
RegWriteValDW = Donnee
End Function
'

'----------------------------------------------------------------
'Lire une Valeur
'----------------------------------------------------------------
Public Function RegReadVal(ClefRacine As Variant, Chemin As String, Valeur As String) As String
Dim RetVal As Long
On Error Resume Next
'Suppression éventuelle de l'Anti-Slash (\) qui précède le chemin
If Mid(Chemin, 1, 1) "" Then Chemin Mid(Chemin, 2)
'Ajout éventuel d'un Anti-Slash (\) pour terminer le chemin
If Mid(Chemin, Len(Chemin), 1) <> "" Then Chemin = Chemin & ""
Buff = 0
Buff = RegCreateKey(ConvertClef(ClefRacine), Chemin, lng)
If Buff 0 Then RetVal RegQueryValueEx(lng, Valeur, 0&, 1, 0&, Buff)
If Buff < 2 Then 'Si chaine vide
RegReadVal = ""
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
Exit Function
End If
RegReadVal = String(Buff + 1, " ")
RetVal = RegQueryValueEx(lng, Valeur, 0&, 1, ByVal RegReadVal, Buff)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
RegReadVal = Left(RegReadVal, Buff - 1)
End Function
'

'----------------------------------------------------------------
'Supprimer une Valeur
'----------------------------------------------------------------
Public Function RegDeleteVal(ClefRacine As Variant, Chemin As String, Valeur As String)
Dim RetVal As Long
On Error Resume Next
'Suppression éventuelle de l'Anti-Slash (\) qui précède le chemin
If Mid(Chemin, 1, 1) "" Then Chemin Mid(Chemin, 2)
'Ajout éventuel d'un Anti-Slash (\) pour terminer le chemin
If Mid(Chemin, Len(Chemin), 1) <> "" Then Chemin = Chemin & ""
Buff = 0
Buff = RegCreateKey(ConvertClef(ClefRacine), Chemin, lng)
If Buff 0 Then RetVal RegDeleteValue(lng, ByVal Valeur)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
End Function
'

'--------------------------------------------------------------------------------
'Activer l'Autorun de l'application en Cours avec passage de paramètres optionnel
'--------------------------------------------------------------------------------
Public Sub RegAutoRunWrite(Optional Parametres As String)
Dim RetVal As Long
On Error Resume Next
'RegWriteVal ConvertClef(ClefRacine), Chemin, Valeur, Donnees
RetVal = RegWriteVal("HKEY_LOCAL_MACHINE", "Software\Microsoft\Windows\CurrentVersion\Run", App.EXEName, App.Path & "" & App.EXEName & ".exe" & " " & Parametres)
If RetVal = 2 Then Debug.Print "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print "Accès Refusé (ERROR_ACCES_DENIED)"
End Sub
'

'----------------------------------------------------------------
'Vérifier si l'Autorun est activé pour l'application en cours
'----------------------------------------------------------------
Public Function RegAutoRunIsActif() As Boolean
On Error Resume Next
'
If RegReadVal("HKEY_LOCAL_MACHINE", "Software\Microsoft\Windows\CurrentVersion\Run", App.EXEName) <> "" Then RegAutoRunIsActif = True Else RegAutoRunIsActif = False
End Function
'

'----------------------------------------------------------------
'Supprimer l'Autorun de l'application en cours
'----------------------------------------------------------------
Public Sub RegAutoRunDelete()
Dim RetVal As Long
On Error Resume Next
RetVal = RegDeleteVal("HKEY_LOCAL_MACHINE", "Software\Microsoft\Windows\CurrentVersion\Run", App.EXEName)
If RetVal = 2 Then Debug.Print "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print "Accès Refusé (ERROR_ACCES_DENIED)"
End Sub

'----------------------------------------------------------------
' Exemples D'utilisation
'----------------------------------------------------------------
' Ecriture d'une Valeur de clef (dans cet exemple on actie l'autorun)
'RegWriteVal "HKEY_LOCAL_MACHINE", "Software\Microsoft\Windows\CurrentVersion\Run", App.EXEName, Application
' Ecriture d'une valeur de clef de type Dword
'RegWriteValDW "HKEY_LOCAL_MACHINE", "SYSTEM\CurrentControlSet\Services" & App.EXEName, "Type", 272
' Lecture d'une valeur de clef
'RegReadVal "HKEY_LOCAL_MACHINE", "SOFTWARE\Data Fellows\F-Secure\Cog-Secure", "ActiveService"
'ou (valclef est de type variant)
'ValClef = RegReadVal("HKEY_LOCAL_MACHINE", "SOFTWARE\Data Fellows\F-Secure\Cog-Secure", "ActiveService")
'Suppression d'une clef
'RegDeleteClef "HKEY_LOCAL_MACHINE", "SYSTEM\CurrentControlSet\Services" & App.EXEName & "\Parameters"
'Suppression d'une Valeur de clef
'RegDeleteVal "HKEY_LOCAL_MACHINE", "SYSTEM\CurrentControlSet\Services" & App.EXEName & "\Parameters", "Application"
'ou (valclef est de type variant)
'ValClef = RegDeleteVal("HKEY_LOCAL_MACHINE", "Software\Microsoft\Windows\CurrentVersion\Run", "Cog-Secure-Client")
sman0 Messages postés 39 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 3 novembre 2005
5 déc. 2004 à 00:12
en effet c'est bien rippé sale boulet

http://www.vbfrance.com/code.aspx?ID=133
cs_Multiprise Messages postés 63 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 23 avril 2013
5 mai 2004 à 22:48
Exact, un très bon code qui rendra service à ceux qui réfléchissent avant de dire des conneries. Superclic, essai d'écrire dans la base de registres si Vbscript est désactivé sur la machine (Voir statégie de sécurité). Avec les API, pas de problème, tu lis et écris sur n'importe quelle bécane et les antivirus ne te posent pas de problème. Pour qu'un code soit universel, ya pas mieux que les API, évidemment c'est un peu plus hard à programmer. C'est pour cela que le site existe, celui qui sait partage et celui qui croit tout savoir devrait partager le silence.
BoulyFamily Messages postés 4 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 27 mars 2004
27 avril 2004 à 21:59
Ce code est très clair et aux personnes qui critiquent en disant que OUI, il y a des tonnes de codes pour la même chose, et bien mieux vaut avoir le choix que de ne pas trouver sa solution...
cs_metos Messages postés 168 Date d'inscription vendredi 18 janvier 2002 Statut Membre Dernière intervention 19 octobre 2009
26 oct. 2002 à 00:12
C'est net SuperClick t'as méthode c'est la plus simple que j'ai trouver. Le seul inconvénient avec j'ai pas réussi a lire et supprimer des clés. Si tu trouve ca m'intersse.
SuperClic Messages postés 48 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 3 octobre 2002
19 août 2002 à 17:25
Un truc beaucoups plus simple :
Set WshShell Wscript.createobject("WScript.Shell")
écrire: WshShell.RegWrite ...
lire: WshShell.RegRead("...")
supprimer: WshShell.RegDelete ...

On économise plusieurs centaines de lignes et on se fait pas chier avec les apis
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
26 juin 2002 à 00:58
Vu revu et reevu ....
y'en a 30 des sources comme çà en plus elle est pas de toi
cs_Tatar Messages postés 46 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 17 février 2003
3 mai 2002 à 19:43
comme le dit logisim, GetSetting et SaveSetting ne permettent pas de travailler sur tous le registre, là si.
logisim Messages postés 49 Date d'inscription mardi 8 mai 2001 Statut Membre Dernière intervention 14 août 2004
3 mai 2002 à 18:13
Il manque les fonctions RegEnumKey et RegEnumValue... je vais les ajouter...
logisim Messages postés 49 Date d'inscription mardi 8 mai 2001 Statut Membre Dernière intervention 14 août 2004
3 mai 2002 à 18:12
Avec GetSetting et SaveSetting, on ne peut pas écrire n'importe où dans le Registre !
cs_reyman Messages postés 148 Date d'inscription mercredi 20 février 2002 Statut Membre Dernière intervention 5 juin 2007
3 mai 2002 à 16:30
Ca m'a lair bien compliqué tout ca!!!

Tu connais pas l'existence des fonctions 'Getsetting' et 'Savesetting' ou c'est juste que tu aimes les codes longs ???
reivon Messages postés 81 Date d'inscription lundi 18 février 2002 Statut Membre Dernière intervention 4 février 2005
2 mai 2002 à 22:55
j'ai pas encore essayer, mais c good, pratique pour sauver une config logiciel