Modification de la base de registre
Dernière réponse : dans Programmation
Bonjour à toutes et à tous,
Je suis en stage, et je dois faire un programme qui permet la modification d'une clé dans la base de registre, car un simple .reg ne suffis pas. Le problème est que le chemin pour arriver jusqu'a cette clé est différent en fonction du profil utilisateur...
Il faut donc que je fasse un programme en C++ pour modifier la base de registre.
Le chemin est le suivant:
Poste de travail/HKEY_CURRENT_USER/Software/Funk Software, Inc./Odyssey/client/profiles/profiles#XXXX/authentification/
et dedans, on y trouve la clé: "primaryEAP"
XXXX étant une chaine qui varie suivant le profil.
j'avais pensé me placer sur le chemin : "Poste de travail/HKEY_CURRENT_USER/Software/Funk Software, Inc./Odyssey/client/profiles" et faire la manipulation pour à tous les profils existant.
J'ai un lien vers l'API Windows, mais je ne sais pas par où commencer.
Je cherche de quoi modifier le chemain courant pour arriver à ma clé, la valeur de la clé et toutes autres informations qui pourraient être utile...
Merci de votre aide.
Je suis en stage, et je dois faire un programme qui permet la modification d'une clé dans la base de registre, car un simple .reg ne suffis pas. Le problème est que le chemin pour arriver jusqu'a cette clé est différent en fonction du profil utilisateur...
Il faut donc que je fasse un programme en C++ pour modifier la base de registre.
Le chemin est le suivant:
Poste de travail/HKEY_CURRENT_USER/Software/Funk Software, Inc./Odyssey/client/profiles/profiles#XXXX/authentification/
et dedans, on y trouve la clé: "primaryEAP"
XXXX étant une chaine qui varie suivant le profil.
j'avais pensé me placer sur le chemin : "Poste de travail/HKEY_CURRENT_USER/Software/Funk Software, Inc./Odyssey/client/profiles" et faire la manipulation pour à tous les profils existant.
J'ai un lien vers l'API Windows, mais je ne sais pas par où commencer.
Je cherche de quoi modifier le chemain courant pour arriver à ma clé, la valeur de la clé et toutes autres informations qui pourraient être utile...
Merci de votre aide.
Autres pages sur : modification base registre
Lassé par la pub ? Créez un compte
Ba nan, pas vraiment... :s Pour ma défense, j'ai pas encore eu de quoi me mettre à coder (ça arrivera lundi), et le bloc note ne me disait rien...
par contre, j'ai commencé a cherché;
Je dois créer mon objet pour pouvoir manipuler la base de registre,
TRegistry *registre = new TRegistry();
Et après, avant d'accéder à la clé, il faut en spécifier la clé racine dans le registre:
registre->RootKey = HKEY_CLASSES_ROOT;
Au lieu d'affecter HKEY_CLASSES_ROOT est-ce que je peux mettre une chaine de caractère, à savoir ici en l'occurence:
"/HKEY_CURRENT_USER/Software/Funk Software, Inc./Odyssey/client/profiles" ?
Ou est-ce qu'il est d'abord conseillé de vérifier l'existance de chaque clé? (Bien qu'en théorie, ces clés devraient exister puisque que le client Odyssey est installé sur tous les portables.)
par contre, j'ai commencé a cherché;
Je dois créer mon objet pour pouvoir manipuler la base de registre,
TRegistry *registre = new TRegistry();
Et après, avant d'accéder à la clé, il faut en spécifier la clé racine dans le registre:
registre->RootKey = HKEY_CLASSES_ROOT;
Au lieu d'affecter HKEY_CLASSES_ROOT est-ce que je peux mettre une chaine de caractère, à savoir ici en l'occurence:
"/HKEY_CURRENT_USER/Software/Funk Software, Inc./Odyssey/client/profiles" ?
Ou est-ce qu'il est d'abord conseillé de vérifier l'existance de chaque clé? (Bien qu'en théorie, ces clés devraient exister puisque que le client Odyssey est installé sur tous les portables.)
Tu utilises une classe toute faite, TRegistry. Il faut donc te plier à sa façon de faire.
--> RTFM.
Donc non, tu ne dois pas ajouter HKEY_XXXX au chemin, mais d'abord le mettre dans RootKey.
Utilise la méthode OpenKeyReadOnly avec le chemin complet (Software/.../profiles), et vérifie que la clef est bien ouverte.
Si la clef n'est pas ouverte, tu peux en conclure que le logiciel n'est pas installé et quitter.
--> RTFM.
Donc non, tu ne dois pas ajouter HKEY_XXXX au chemin, mais d'abord le mettre dans RootKey.
Utilise la méthode OpenKeyReadOnly avec le chemin complet (Software/.../profiles), et vérifie que la clef est bien ouverte.
Si la clef n'est pas ouverte, tu peux en conclure que le logiciel n'est pas installé et quitter.
bon, j'ai commençais, mais j'avais une question par rapport à l'OpenKeyReadOnly()
si j'ai une string, auquel j'affecte le chemin de ma clé, est-ce que ça peut marcher ou alors il faut un type spécial?
String tmp = "Software/Funk Software, Inc./Odyssey/client/profiles";
registre->OpenKeyReadOnly(tmp);
parce qu'après, ce que je voudrais, c'est ajouter à ma chaine le nom de la 1er clé faire mon traitement cad:
aller dans profiles#XXXX/authentification/
et changer ma clé "primaryEAP"
puis retourner dans le dossier précédent profiles#XXXX et passer au second dossier s'il existe.
alors est ce qu'il y a une méthode pour dire de retourner au dossier parent ou alors c'est pas utile que je cherche?
si j'ai une string, auquel j'affecte le chemin de ma clé, est-ce que ça peut marcher ou alors il faut un type spécial?
String tmp = "Software/Funk Software, Inc./Odyssey/client/profiles";
registre->OpenKeyReadOnly(tmp);
parce qu'après, ce que je voudrais, c'est ajouter à ma chaine le nom de la 1er clé faire mon traitement cad:
aller dans profiles#XXXX/authentification/
et changer ma clé "primaryEAP"
puis retourner dans le dossier précédent profiles#XXXX et passer au second dossier s'il existe.
alors est ce qu'il y a une méthode pour dire de retourner au dossier parent ou alors c'est pas utile que je cherche?
Voici mon code:
Je peux créer des clés comme sur l'exemple suivant, mais je ne peux pas ouvrir de clé... est ce que qlq'1 aurait une idée?
Pq que je fasse un OpenKeyReadOnly ou un OpenKey; les deux ne fonctionnent pas...
Et où est-il possible de trouver une doc correcte sur TRegistry?
Merci d'avance.
TRegistry *registre = new TRegistry();
TStringList *Liste = new TStringList();
int taille;
AnsiString Chaine, tmp, chemin,ajout;
try
{
//on se place dans la racine 'HKEY_CURRENT_USER'
registre->RootKey = HKEY_CURRENT_USER;
}
__finally
{
delete registre;
}
chemin="SOFTWARE/Funk Software, Inc./Odyssey/client/profiles";
ajout="/authentification";
//on regarde si la clé jusqu'au profiles existe
if(registre->OpenKeyReadOnly(chemin))
{
registre->GetKeyNames(Liste);
taille = Liste->Count;
for(int i=0; i<taille;i++)
{
// On recupère la 1er valeur de la liste.
Chaine = Liste->Strings[i];
//on concatène tout pour aller jusqu'au chemin voulu!
tmp=chemin+"/"+Chaine; //+ajout;
//Est-ce qu'il faut fermer la clé avant de lui
//affecter une nouvelle valeur?
if(registre->OpenKeyReadOnly(tmp))
{
//Voir quelle clé il faut ouvrir
//s'il faut ouvrir authentification et
//ouvrir "primary EAP" ou s'il faut ouvrir
//seulement "primary EAP"
registre->OpenKey("authentification",false);
registre->WriteString("primary EAP", "PEAP");
}
}
//Ferme et supprime la clé 'registre'
delete registre;
delete Liste;
}
else
{
ShowMessage("La clé n'existe pas!");
}
//----------------------------------------------------------------------------
Je peux créer des clés comme sur l'exemple suivant, mais je ne peux pas ouvrir de clé... est ce que qlq'1 aurait une idée?
if(registre->CreateKey("\\Software\\Essai"))
{
ShowMessage("créé");
}
else
{
ShowMessage("pas créé");
}
Pq que je fasse un OpenKeyReadOnly ou un OpenKey; les deux ne fonctionnent pas...
Et où est-il possible de trouver une doc correcte sur TRegistry?
Merci d'avance.
Citation :
et puis supprimer l'objet juste avant de l'utiliser c'est pas vraiment une bonne idée
Ouais, c'est sur que c'est pas terrible... grosse erreur de ma part, par manque d'attention je dirais.
Sinon, je suppose qu'il faut utiliser la "class std::auto_ptr< _Tp >" mais je connais pas, qlq'1 aurait de quoi me guider?
pq en plus, moi et les templates... on est pas super pôte...
Et après avoir "réglé" le problème de la suppression, j'ai testé ça:
chemin="SOFTWARE\\Funk\ Software,\ Inc.\\Odyssey\\client\\profiles";
ajout="\\authentification";
if(registre->OpenKeyReadOnly(chemin))
{
ShowMessage("test2");
registre->GetKeyNames(Liste);
taille = Liste->Count;
for(int i=0; i<taille;i++)
{
ShowMessage("test"+i);
// On recupère la 1er valeur de la liste.
Chaine = Liste->Strings[i];
//on concatène tout pour aller jusqu'au chemin voulu!
tmp=chemin+"\\"+Chaine; //+ajout;
registre->CloseKey();
//Est-ce qu'il faut fermer la clé avant de lui
//affecter une nouvelle valeur? [color=#ff0e00]La réponse est "oui"[/color]
if(registre->OpenKeyReadOnly(tmp))
{
//Voir quelle clé il faut ouvrir
//s'il faut ouvrir authentification et //ouvrir "primary EAP" ou s'il faut ouvrir //seulement "primary EAP"
ShowMessage("test3");
registre->OpenKey("authentification",false);
registre->WriteString("primary EAP", "PEAP");
}
}
//Ferme et supprime la clé 'registre'
delete registre;
delete Liste;
}
else
{
ShowMessage("La clé n'existe pas!");
}
Et forcement, il me dit que la clé n'existe pas... si non, ça aurait été trop beau...
donc, ça veut dire que le "if(registre->OpenKeyReadOnly(chemin))" ne fonctionne pas... donc je réfléchis, mais si encore une fois quelqu'un peut m'aider, ça serait fort aimable ^^
Merci.
edit: pour le chemin, faut l'écrire comme ça:
chemin="SOFTWARE\\Funk\ Software,\ Inc.\\Odyssey\\client\\profiles";
ajout="\\authentification";
Ce qui règle une partie de mes pbl... mais pas tous, pq mtn, il m'affiche "test2", et "test" mais pas la valeur du i... et il m'affiche aussi "test3" et plus de "La clé n'existe pas"
ah ok, je pensais que ça allait marcher comme en java... que ça allait concaténer tout le truc et tout caster.
enfin là, j'ai bien avancé, il me manque plus qu'a modifier la valeur de la clé, mais là ça merdouille pas mal...a cause d'une exception...
Comment ça marche pour la modif'?
Pq là, il me dit bien que la clé existe et qu'elle est ouverte, mais problème avec le "registre->WriteString("primary\ EAP", "PEAP");"
est-ce que la méthode que j'utilise est bonne ou alors c'est pas ça?
PS: Le "test"+i est pas important,c 'était juste pour mes testes de boucles etc...
en tout cas, merci pour les infos
enfin là, j'ai bien avancé, il me manque plus qu'a modifier la valeur de la clé, mais là ça merdouille pas mal...a cause d'une exception...
Comment ça marche pour la modif'?
tmp=chemin+"\\"+Chaine+ajout; // je suis donc dans le dossier authentification
if(registre->OpenKeyReadOnly(tmp))
{
registre->CloseKey();
//if(registre->OpenKey("authentification",false))
if (registre->OpenKey("primary\ EAP", false))
{
ShowMessage("ouvert");
registre->WriteString("primary\ EAP", "PEAP");
}
else
{
ShowMessage("pas ouvert");
}
/*if (registre->KeyExists("primary\ EAP"))
{
ShowMessage("clé primary EAP existe");
}
else
{
ShowMessage("clé primary EAP n'existe pas");
} */
registre->CloseKey();
}
Pq là, il me dit bien que la clé existe et qu'elle est ouverte, mais problème avec le "registre->WriteString("primary\ EAP", "PEAP");"
est-ce que la méthode que j'utilise est bonne ou alors c'est pas ça?
PS: Le "test"+i est pas important,c 'était juste pour mes testes de boucles etc...
en tout cas, merci pour les infos
Citation :
Ligne 2 : OpenKeyReadOnly
Ne me dis pas que tu mauvais à ce point en anglais !!
if(registre->OpenKeyReadOnly(tmp))
/* Ne t'en fais pas pour mon niveau d'anglais, je suis pas si mauvais que ça, mais sachant
que je ferme la clé juste après et que j'en ouvre une nouvelle qui n'est pas en ReadOnly
je pensais que ça passait vu que la clé ouverte en ReadOnly ne me servait plus par la suite */
{
registre->CloseKey();
[...]
if (registre->OpenKey("primary\ EAP", false))
[...]
J'ai testé, j'ai remplacé le "if(registre->OpenKeyReadOnly(tmp))" en "if(registre->OpenKey(tmp))" la suite du programme se déroule normalement, mais le problème survient qd mm lors de la modification de la valeur de la clé.
Voila le message d'erreur:
"Le projet Project2.exe a provoqué une classe d'exception ERegistryException avec le message 'Echec à la définition des données pour 'primary EAP". Processus stoppé. Utilisez Pas-à_pas ou Exécuter pour continuer."
Même si je capture pas l'erreur, bah ça marche pas qd mm
sachant que mon chemin est:
[...]/profiles#XXXX/authentification. Ici, ma clé est bien authentification et ma valeur est "primary EAP"?
est-ce qu'il faut que j'ouvre "authentification" ou "primary EAP"?
Si non, dans ma base de registre, le type de ma valeur est "REG_SZ" est-ce que ça a une importance? du moins, est-ce que REG_SZ est bien de type "String"
Pq REG_SZ est une chaîne de texte de longueur fixe d'après ce que j'ai lu.
Voila le message d'erreur:
"Le projet Project2.exe a provoqué une classe d'exception ERegistryException avec le message 'Echec à la définition des données pour 'primary EAP". Processus stoppé. Utilisez Pas-à_pas ou Exécuter pour continuer."
Même si je capture pas l'erreur, bah ça marche pas qd mm
sachant que mon chemin est:
[...]/profiles#XXXX/authentification. Ici, ma clé est bien authentification et ma valeur est "primary EAP"?
est-ce qu'il faut que j'ouvre "authentification" ou "primary EAP"?
Si non, dans ma base de registre, le type de ma valeur est "REG_SZ" est-ce que ça a une importance? du moins, est-ce que REG_SZ est bien de type "String"
Pq REG_SZ est une chaîne de texte de longueur fixe d'après ce que j'ai lu.
Attention à ce que tu fais !!!
Relis la doc de TRegistry.
Ne confonds pas clé (Key) et valeur (Value)
Quand tu utilises OpenKey, mets le second paramètre à FAUX. Par défaut il est à VRAI, c'est à dire que si la clef n'existe pas, elle est créée, ce qui n'est pas ce que tu cherches.
OpenKey ouvre des clefs, pas des valeurs. Quand tu es dans le bon chemin, pour écrire le texte "TOTO", dans la valeur "TITI" de la clef "HKEY_CURRENT_USER\Software\Bidon", il faut faire :
Fais des tests et regarde le résultat avec RegEdit.
Relis la doc de TRegistry.
Ne confonds pas clé (Key) et valeur (Value)
Quand tu utilises OpenKey, mets le second paramètre à FAUX. Par défaut il est à VRAI, c'est à dire que si la clef n'existe pas, elle est créée, ce qui n'est pas ce que tu cherches.
OpenKey ouvre des clefs, pas des valeurs. Quand tu es dans le bon chemin, pour écrire le texte "TOTO", dans la valeur "TITI" de la clef "HKEY_CURRENT_USER\Software\Bidon", il faut faire :
reg->RootKey=HKEY_CURRENT_USER;
if (reg->OpenKey("Software\\Bidon", False))
{
reg->WriteString("TITI", "TOTO");
reg->CloseKey();
}
Fais des tests et regarde le résultat avec RegEdit.
ouais, c'est ce que j'ai fait:
il me créé "testouille" dans authentification, donc c'est qu'il est bien dans la bonne clé. Ensuite, il m'affiche "test3" et c'est après qu'il fait des siennes.(j'ai créé et appellé ma clé "test" pour tester si ça pouvait être à cause de l'espace et du '\' )
//tmp étant mon chemin (il est correct, je l'ai vérifié)
if(registre->OpenKey(tmp,false))
{
registre->CreateKey("testouille");
ShowMessage("test3");
registre->WriteString("test", "PEAP");
registre->CloseKey();
}
il me créé "testouille" dans authentification, donc c'est qu'il est bien dans la bonne clé. Ensuite, il m'affiche "test3" et c'est après qu'il fait des siennes.(j'ai créé et appellé ma clé "test" pour tester si ça pouvait être à cause de l'espace et du '\' )
ba c'est pas a cause du '\' pq ça marche tjs pas... je vois pas ce que je pourrais faire d'autre, pq l'erreur, je pense être sûr que ça vient du WriteString, mais là, je sais pas quoi faire. quelqu'un pour m'inspirer?
edit:
en ajoutant ceci:
Il m'affiche bien la valeur associé à primary EAP à savoir "TTLS" (pour le moment) donc c'est qu'il trouve la clé, il arrive même à la lire, mais je ne sais toujours pas pourquoi il ne veut pas la modifier...
Autre question, qu'elle est la méthode pour ajouter une valeur? pq j'aurais bien envie de supprimer la valeur "primary EAP" de la clé "Authentification" et de la recréer avec la nouvelle valeur... au moins pour savoir si ça marche comme ça!
re edit:
Je me sers de ça pour la création d'une valeur après avoir testé leur existance et les avoir supprimer.
C'est pas très propre mais bon... je vais essayer de faire qlq'ch de clair, et je verrai par la suite pour avoir la modif et non la création.
edit:
en ajoutant ceci:
AnsiString maChaine;
maChaine = registre->ReadString("primary\ EAP");
ShowMessage("primary EAP= " + maChaine);
Il m'affiche bien la valeur associé à primary EAP à savoir "TTLS" (pour le moment) donc c'est qu'il trouve la clé, il arrive même à la lire, mais je ne sais toujours pas pourquoi il ne veut pas la modifier...
Autre question, qu'elle est la méthode pour ajouter une valeur? pq j'aurais bien envie de supprimer la valeur "primary EAP" de la clé "Authentification" et de la recréer avec la nouvelle valeur... au moins pour savoir si ça marche comme ça!
re edit:
Je me sers de ça pour la création d'une valeur après avoir testé leur existance et les avoir supprimer.
C'est pas très propre mais bon... je vais essayer de faire qlq'ch de clair, et je verrai par la suite pour avoir la modif et non la création.
registre->WriteString("nom_de_la_valeur", "valeur");
Et bien voila, a priori, ça fonctionne.
je n'ai juste pas géré la modification, mais j'ai fait une suppression puis une création.
Voila le code, si jamais ça peut servir a quelqu'un d'autre.
Et oui... beaucoup de recherche pour au final peu de ligne de code, mais bon, ça marche
alors je vais pas raler non plus
En tout cas, merci à zeb, KangOl et boubpopsyteam pour leur aide.
bonne continuation à tous.
je n'ai juste pas géré la modification, mais j'ai fait une suppression puis une création.
Voila le code, si jamais ça peut servir a quelqu'un d'autre.
/*Le problème est qu'entre les clés 'profiles' et 'authentification'
il y a une clé dont le nom change en fonction du profil utilisateur.
( profile#6cd640b.... ), il n'est donc pas possible de faire un .reg.
D'où la création d'un exécutable dans lequel on concatènera donc le chemin,
le(les) dossier(s) et la suite du chemin.
note: ne pas oublier d'inclure la bibliothèque registry.hpp
*/
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//création du registre et d'une liste (pour récuperer une liste de clé
TRegistry *registre = new TRegistry();
TStringList *Liste = new TStringList();
//création des variables.
int taille;
AnsiString Chaine, tmp, chemin,ajout;
try
{
//on se place dans la racine 'HKEY_CURRENT_USER'
registre->RootKey = HKEY_CURRENT_USER;
}
__finally
{
// les '\' sont doublés car il s'agit ici du caractère de "protection".
chemin="SOFTWARE\\Funk\ Software,\ Inc.\\Odyssey\\client\\profiles";
ajout="\\authentification";
//on regarde si la clé jusqu'au profiles existe
if(registre->OpenKey(chemin, false))
{
registre->GetKeyNames(Liste);
taille = Liste->Count;//permet de savoir le nombre de clé a traiter.
for(int i=0; i<taille;i++)
{
// On recupère la/les valeurs de la liste.
Chaine = Liste->Strings[i];
//on concatène tout pour aller jusqu'au chemin voulu!
tmp=chemin+"\\"+Chaine+ajout;
//On ne peut utiliser qu'une seule clé à la fois
//il faut donc la fermer
registre->CloseKey();
if(registre->OpenKey(tmp,false))
// false car a true, on force la création de la clé si elle n'existe pas
{
//on vérifi si la valeur existe
if(registre->ValueExists("primary\ EAP"))
{
//Ne pouvant la modifier, j'ai décidé de
//la supprimer puis de la recréer
if(registre->DeleteValue("primary\ EAP"))
{
registre->WriteString("primary\ EAP", "PEAP");
}
}
/*Si on arrive jusqu'ici dans le programme,
c'est que le chemain est correct et qu'on se
retrouve ici sans clé, donc pas mesure de sécurité,
on la créé*/
else
{
registre->WriteString("primary\ EAP", "PEAP");
}
}
}
//Ferme et supprime la clé 'registre' ainsi que supprime la liste.
delete registre;
delete Liste;
ShowMessage("La modification a été effectuée");
}
}
//Fermeture du programme.
exit(0);
}
Et oui... beaucoup de recherche pour au final peu de ligne de code, mais bon, ça marche
alors je vais pas raler non plus
En tout cas, merci à zeb, KangOl et boubpopsyteam pour leur aide.
bonne continuation à tous.
Citation :
il y a encore des problèmes : le __finally n'as rien a faire la
et il y a un memory leak si tu arrive pas a ouvrir la clé
(utilise les auto_ptr)ouais, c'est ce qu'il me semblait... mais j'ai cherché pour utiliser le std::auto_ptr, mais je vois pas comment m'en servir...
tu n'aurais pas un exemple ou un lien pour m'aider plz
Et le problème du memory leak peut etre gérer avec le auto_ptr?
Thx!
std::auto_ptr< TRegistry > reg (new TRegistry()); // lors de la desctruction de cet objet (a la fin du scope) un delete est fait sur le Registry qu'il contient
reg->RootKey = "...";
et voila plus besoin de faire de delete, c'est l'objet auto_ptr qui s'en occupe
de plus, tu peux :
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumBase de registre
- ForumRã cuperer la base de registre
- ForumSouris base de registre
- ForumAutoit et base de registre
- ForumUne base de registre pour linux
- ForumNettoyage base de registre
- ForumWindows 7 base de registre
- ForumCoolbits et base de registre
- ForumC stocker base registre
- ForumModifier base de registre
- Voir plus
![[:spamafote] [:spamafote]](http://m.bestofmedia.com/sfp/design/usr/fr/smilies/3e/46/spamafote.gif)