RegSaveKeyEx

Signaler
Messages postés
39
Date d'inscription
mardi 26 août 2008
Statut
Membre
Dernière intervention
19 août 2012
-
Messages postés
39
Date d'inscription
mardi 26 août 2008
Statut
Membre
Dernière intervention
19 août 2012
-
Bonjour,

Je voudrais sauvegarder un clé registre ainsi que toutes ses sous-clé.
En faisant une recherche sur le site de msdn, j'ai fait ce code :

if(RegOpenKeyEx(HKEY_CURRENT_USER,L"Software\\Microsoft",0,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS)
{
if(RegSaveKeyEx(hKey,L"Save.reg",NULL,REG_STANDARD_FORMAT)==ERROR_SUCCESS)
RegCloseKey(hKey);
}

Le fichier Save.reg est bien créé, mais il fait 0 octet, n'est pas fusionnable avec le registre et est vide lorsque je l'édite avec le bloc note.

une idée d'où vient le problème?
Merci.

5 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Tu as bien mis le privilège SE_BACKUP_NAME sur ton processus ?

RegCloseKey(hKey);
n'a pas a être dépendant de la réussite ou non de RegSaveKeyEx mais de RegOpenKeyEx.

Faut faire gaffe à ne pas recopier nimporte comment les exemples du web, IL FAUT LIRE MSDN !!!
Les fonctions REGxxx réussissent si elles retournent 0 !!!

ciao...
BruNews, MVP VC++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Salut,
Effectivement, MSDN précise bien que le process appelant RegSaveKeyEx() doit avoir le privilège SE_BACKUP_NAME. Voici un exemple simple permettant de donner ce privilège au process courant:
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 
    OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
    LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &tkp.Privileges[0].Luid); 
    tkp.PrivilegeCount = 1;   
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0); 
    CloseHandle(hToken);

RegSaveKeyEx() échoue également quand le fichier donné en 2ème paramètre existe déjà.
Messages postés
39
Date d'inscription
mardi 26 août 2008
Statut
Membre
Dernière intervention
19 août 2012

Merci mon fichier Save.reg fait maintenant quelque kilo mais je ne peux pas le fusionner, et lorsque je l'édite j'ai plein de caractères spéciaux :

Widt ztestÿÿÿ8ÿÿÿsk x x  ¬  €€    l  $ ?    QCsµˆb®úWé  ?     ?               QCsµˆb®úW àÿÿÿvk  €1   1  in @ àÿÿÿvk  €   2idthndiðÿÿÿ@ h h


voici mon nouveau code :
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
LookupPrivilegeValue(NULL,SE_BACKUP_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
CloseHandle(hToken);
HKEY hKey;
if(RegOpenKeyEx(HKEY_CURRENT_USER,L"Software\\Microsoft",0,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS)
{
if(RegSaveKeyEx(hKey,L"Save.reg",NULL,REG_STANDARD_FORMAT)==ERROR_SUCCESS);
RegCloseKey(hKey);
}
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Le format du fichier reg créé avec RegSaveKeyEx() n'est pas fait pour être édité dans le bloc-notes. Ce fichier est utilisable avec RegLoadKey() ou RegRestoreKey(). Je pense que ce n'est pas très dur de faire ce que tu veux simplement en énumérant les sous-clés de ta clé principale puis récupérer toutes les chaines avec leurs types et valeurs pour tout sauvegarder dans un fichier texte conforme au format reg éditable.
Voici la page MSDN sur les fonctions de la base de registres:
http://msdn.microsoft.com/en-us/library/ms724875%28v=VS.85%29.aspx
Messages postés
39
Date d'inscription
mardi 26 août 2008
Statut
Membre
Dernière intervention
19 août 2012

merci à tous :)