[c] gestion complete de la base de registre

Soyez le premier à donner votre avis sur cette source.

Vue 11 718 fois - Téléchargée 1 103 fois

Description

Ce code permet de gérer la base de registre dans ses options les plus courantes
Il permet de créer des clefs, de les supprimer, de mettre des valeurs dans des clefs... enfin tout le blabla habituel sur la bdr, mais aussi d'enregistrer une clef (et toutes ses sous clefs) sous la forme d'un fichier reg, puis de le charger.
Il y a deux méthodes de sauvegarde:
+ Création du fichier .reg "à la main" par parcours de la clef et de toutes ses sous clefs (le format utilisé est celui de la version 4 de regedit),
+ Appel par création d'un processus de la ligne de commande "REGEDIT /E fichier clef".
La sauvegarde se fait uniquement par création du processus et appelle de la ligne de commande "REGEDIT /S fichier".

Pour l'utiliser, prendre le header et le fichier C et les intégrer à votre programme.

Source / Exemple :


#ifndef __BDR_H_
#define __BDR_H_

#include <windows.h>

#define HKCR				HKEY_CLASSES_ROOT
#define HKCU				HKEY_CURRENT_USER
#define HKLM				HKEY_LOCAL_MACHINE
#define HKU				HKEY_USERS
#define HKCC				HKEY_CURRENT_CONFIG

ULONG bdr_open(HKEY origine, LPCSTR key_name, PHKEY key);
ULONG bdr_create(HKEY origine, LPCSTR key_name, PHKEY key);	
__forceinline VOID bdr_close(HKEY key);
ULONG bdr_delete(HKEY origine, LPCSTR key_name);
ULONG bdr_readDataKey(HKEY key,	LPCSTR value_name, ULONG *value_type, BYTE *value, ULONG *value_len);
__forceinline ULONG bdr_setDataKey(HKEY key, LPCSTR value_name, ULONG value_type, LPCSTR value);
ULONG bdr_save(HKEY root, LPCSTR key2save, int file, BOOL header);
ULONG bdr_save_cmd(LPCSTR key, LPCTSTR file_name);
ULONG bdr_load(LPCSTR file_name);

#endif //__BDR_H_

Conclusion :


Dans un premier temps, j'ai voulu utiliser les fonctions RegSaveKeyEx et RegLoadKey pour la sauvegarde et le chargement des clefs, mais lors des appels à RegLoadKey, j'avais souvent des erreurs. Les clefs sauvegardées n'étaient pas toutes rechargées, les valeurs chargées ne correspondaient pas à celles que j'avais enregistrées... Et ces erreurs étaient "aléatoires", le code marchait en gros 2 fois sur 3. C'est pourquoi j'ai fibnalement conservé la sauvegarde par les fichiers reg.

Si certains ont eu des problèmes similaires avec RegSaveKeyEx et RegLoadKey, pourriez-vous svp m'indiquer comment vous y avez remédier?

Désolé pour ceux qui réclamaient une classe en cpp, je ne suis vraiment pas fan, et je préfère resté avec mon C ;)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

verdy_p
Messages postés
203
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
29 janvier 2019

RegSave et RegLoad ne sauvent pas la base de registre entière, car des entrées sont protégées par des options de sécurité (y compris dans HKEY_CURRENT_USER, où le système insère desclés sécurisés pour les données protégées comme les mots de passe cryptés, accessibles uniquement via l'API)
De plus il faut avoir les droits d'Administrateur de sauvegarde. Sinon seules les clés accessibles sont sauvegardées.

On n'a pas plus de droit avec l'énumération classique des clés et valeurs.

Il faut donc augmenter votre privilège pour acquérir les tokens SE_BACKUP et SE_RESTORE, et alors ça marche si on est admin et habilité...

Concernant HKEY_LOCAL_MACHINE, même l'administrateur local ne peut tout sauvegarder par défaut (tant que les options de sécurité ne sont pas présentes).

Attention aussi: certaines clés de HKEY_LOCAL_MACHINE ont un format très spécial (types de clés et de valeurs différents des types classiques. C'est le cas de SAM et SECURITY (dans lequel on trouve des liens vers SAM).

Enfin la basede registre contients des clés de redirection, montées dynamiquement: deux clés peuvent être identiques à des chemins différents. Si on veut parcourir l'arbre exhaustivement, on va obtenir une sauvegarde au moins deux fois trop grosse, et recharger des clés identiques sans forcément recréer les liens. Il faut gérer les liens et points de montage, ce qui n'est pas évident si on est connecté sur le système.

L'idéal est donc d'utiliser les points de restauration systèmes qui créent des backups corrects et pleinment utilisables: ils sont créés avec les bons privilèges et connaissent tous les formats de clés (tous les formats ne sont pas documentés, notamment pour SAM, SECURITY et les clés de configuration active PlugnPlay pour la gestion des ressources système).
julienbj
Messages postés
458
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
5
pour la classe en c++, je m'y mets des que j'ai fini mon projet (mi-janvier probablement!)
Ca devrait pas etre trop long à faire
cosmobob
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ta source est bien, bravo, maintenant tu pourrais porter ce code vers le C++ et faire une classe qui gere la base de registre, ca serait tres interessant egalement.
a++ ;)
minet03
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
1
très bonne source, bravo. elle est assez bien commenté 7/10 parce que rien n'est parfait !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.