Base de registre avec utilisateur non-administrateur

Résolu
Leonel67 Messages postés 3 Date d'inscription dimanche 6 février 2005 Statut Membre Dernière intervention 23 septembre 2006 - 22 sept. 2006 à 09:46
Leonel67 Messages postés 3 Date d'inscription dimanche 6 février 2005 Statut Membre Dernière intervention 23 septembre 2006 - 23 sept. 2006 à 15:44
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

Leonel67 Messages postés 3 Date d'inscription dimanche 6 février 2005 Statut Membre Dernière intervention 23 septembre 2006
23 sept. 2006 à 14:57
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
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
22 sept. 2006 à 16:17
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);

}
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
23 sept. 2006 à 15:29
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(.....
0
Leonel67 Messages postés 3 Date d'inscription dimanche 6 février 2005 Statut Membre Dernière intervention 23 septembre 2006
23 sept. 2006 à 15:44
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'); ]
0
Rejoignez-nous