Base de registre avec utilisateur non-administrateur

[Résolu]
Signaler
Messages postés
3
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
23 septembre 2006
-
Messages postés
3
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
23 septembre 2006
-
Bonjour à tous
Voilà j'ai un problème d'accès à la base registre avec les systèmes multi-utilisateur, genre WIN2000 ou WIN XP pro.
Voici le code que j'utilise

//**************************
#define Clef_Local "Software\\NOM\\Capture"

//**************************

HKEY hkey;
DWORD Type=REG_DWORD, D=4;
DWORD Valeur=0;
char Port[10];

if (!RegCreateKeyEx(HKEY_CURRENT_USER, Clef_Local, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &D)) {
    D=10;
    if (RegQueryValueEx(hkey,"Port",0,&Type,(unsigned char*)Port,&D)) {
      strcpy (Port,"");
      RegSetValueEx(hkey,"Port",0,REG_SZ,(unsigned char*)Port,10);
    }
...
}

//**************************

Ce morceau de code me permet de sauvegarder des paramètres de mon application dans la base de registre.
Ce code fonctionne très bien lorsque je suis administrateur, mais lorsque je suis utilisateur l'accès aux clefs est refusé, du moins impossible de les modifier. Que j'utilise HKEY_CURRENT_USER ou HKEY_LOCAL_MACHINE c'est pareil.

Comment puis-je créer ou modifier une clef quelque soit l'utilisateur?

Je veux bien que le programme créé une nouvelle clef pour chaque utilisateur. Mais je veux surtout que mon programme puisse modifié (voir créer) les clefs.

Merci pour vos réponses.
Leonel

4 réponses

Messages postés
3
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
23 septembre 2006

Salut
La variable Port est initialisée avant l'exécution de mes quelques lignes.
En cherchant dans les archives des codes j'ai trouvé ce qui me manquait. Il faut rajouter une variable de sécurité à l'instruction RegCreateKeyEx:

//**************************
HKEY hkey;
DWORD Type= REG_DWORD, D=4;
DWORD Valeur=0;
char Port[10];
SECURITY_ATTRIBUTES SecAtt;

SecAtt.nLength = sizeof (SECURITY_ATTRIBUTES);
SecAtt.lpSecurityDescriptor = NULL;
SecAtt.bInheritHandle = TRUE;

if (!RegCreateKeyEx(HKEY_CURRENT_USERLeo0512, Clef_Local, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, &SecAtt , &hkey, &D)) {
    D =10;
    if (RegQueryValueEx(hkey,"Port",0,&Type,(unsigned char*)Port,&D)) {
      strcpy (Port,"");
      RegSetValueEx(hkey,"Port",0,REG_SZ,(unsigned char*)Port,10);
    }
...

Avec cette modification l'utilisation de la base de registre se fait correctement. Mon problème de droit d'accès est corrigé... Le code fonctionne sous Win 98, Win2000 et WinXP en mono et multi-utilisateur.
Merci
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,

Normalement, une application lancée en mode utilisateur a tous les droits sur la clé HKEY_CURRENT_USER. Elle peut donc ajouter ou supprimer des sous-clés, lire ou changer des valeurs etc.

Dans ton code je vois une petite erreur qui empêche la modification de la valeur. En cas de succès, RegQueryValueEx() retourne 0. Il faudra donc faire:
 if (!RegQueryValueEx(hkey,"Port",0,&Type,(unsigned char*)Port,&D))

{

    strcpy (Port,"");

    RegSetValueEx(hkey,"Port",0,REG_SZ,(unsigned char*)Port,10);

}
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Tu viens simplement d'ajouter une nouvelle clé dans la base de registre et essayé de la partager pour tous les utilisateurs. HKEY_CURRENT_USER est faite pour cela car cette clé existe pour chaque compte utilisateur. Elle contient les sous-clés qui correspondent à l'utilisateur courant. On a donc autant de HKEY_CURRENT_USER qu'il y'a d'utilisateurs mais chacun ne voit que la sienne. C'est la solution la plus propre.
Ton code ne fonctionnera pas car tu n'as pas encore corrigé l'erreur. Tu as oublié le !
devant RegQueryValueEx():
if ( !RegQueryValueEx(.....
Messages postés
3
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
23 septembre 2006

Si, ça fonctionne comme je veux:

if (RegQueryValueEx(hkey,"Port",0,&Type,(unsigned char*)Port,&D)) {      // (1)
      strcpy (Port,"");
      RegSetValueEx(hkey,"Port",0,REG_SZ,(unsigned char*)Port,10);             // (2)
}

En (1) je veux lire la valeur de la clé.
Si elle n'existe pas alors je créé la clé en (2) avec une valeur par défaut.

J'enregistre mes clés dans HKEY_CURRENT_USER, ainsi chaque utilisateur pourra faire le réglage qui lui convient.

[javascript:Insert_Emoticon('/imgs2/smile.gif'); ]