RegSaveKeyEx

PriMe2302 Messages postés 39 Date d'inscription mardi 26 août 2008 Statut Membre Dernière intervention 19 août 2012 - 17 juin 2010 à 19:10
PriMe2302 Messages postés 39 Date d'inscription mardi 26 août 2008 Statut Membre Dernière intervention 19 août 2012 - 20 juin 2010 à 01:19
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 juin 2010 à 21:04
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++
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
17 juin 2010 à 21:38
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à.
0
PriMe2302 Messages postés 39 Date d'inscription mardi 26 août 2008 Statut Membre Dernière intervention 19 août 2012
19 juin 2010 à 02:26
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);
}
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
19 juin 2010 à 21:23
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PriMe2302 Messages postés 39 Date d'inscription mardi 26 août 2008 Statut Membre Dernière intervention 19 août 2012
20 juin 2010 à 01:19
merci à tous :)
0
Rejoignez-nous