IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Copier une clé de registre d'une ruche vers une autre


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut Copier une clé de registre d'une ruche vers une autre
    Bonjour,

    Je voudrais déplacer une clé de ma base de registre de la ruche 'HKEY_CURRENT_USER' vers 'HKEY_LOCAL_MACHINE'.

    Je viens d'apprendre ce terme "ruche". D'où ça vient ?? peut-être parce que cela contient plein plein de choses ?

    Il y a bien un procédure pour copier/déplacer une clé (et les sous-clés) d'un endroit à un autre
    https://docwiki.embarcadero.com/Libr...gistry.MoveKey.
    Mais cela ne se fait qu'à l'intérieur de la même ruche.

    Quelqu'un aurait-il un truc pour l'étendre d'une ruche à une autre ?

    Cordialement
    Olivier

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Suffit de faire une boucle récursive avec deux objets TRegistry, chacun ouvert sur la bonne racine et chacune sur le clé adéquate.

    Je dois avoir ce code en D4 chez moi.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut
    Bonjour ShaiLeTroll et merci beaucoup

    J'esperais un truc plus simple 😉

    Je veux bien les sources, si ce n'est pas trop demande ET surtout trop de travail.



    J'ai commencé de mon mon côté.

    Sans difficulté pour la lecture du côté : HKEY_CURRENT_USER

    Par contre, et je ne comprends pas pourquoi, du côté HKEY_LOCAL_MACHINE, je peux lire les clés déjà existantes (voir exemple ci-dessous) impossible de lire quoique ce soit sur les clés ou les valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    VAR
          Reg_Machine : TRegistry;
     
    begin
        Reg_Machine := TRegistry.Create;
        Reg_Machine.RootKey := HKEY_LOCAL_MACHINE;
        Reg_Machine.Access := KEY_ALL_ACCESS;
     
    TRY
             if  Reg_Machine.KeyExists('SOFTWARE\DELL\FirmwareUpdate') then
                 Reg_Machine.OpenKeyReadOnly('SOFTWARE\DELL\FirmwareUpdate') ;
    FINALLY
    Reg_Machine.CloseKey;
    Reg_Machine.Free;
    END  
     
    end

    Par contre, lorque j'indique une clé que j'ai créée moi-même (Gege) en direct dans la base de registre (en mode administrateur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    VAR
          Reg_Machine : TRegistry;
     
    begin
        Reg_Machine := TRegistry.Create;
        Reg_Machine.RootKey := HKEY_LOCAL_MACHINE;
        Reg_Machine.Access := KEY_ALL_ACCESS;
     
    TRY
             if  Reg_Machine.KeyExists('SOFTWARE\Gege') then
                 Reg_Machine.OpenKeyReadOnly('SOFTWARE\Gege') ;
    FINALLY
    Reg_Machine.CloseKey;
    Reg_Machine.Free;
    END  
     
    end
    Cette fois la clé n'est pas détéctee. Y aurait-il des droits spécifiques ?


    encore merci

    Olivier

    PS : j'ai essayé avec SaveKey. Mais ca ne marche pas, je n'arrive pas à obtenir les privilèges "SE_BACKUP_NAME"

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Alors, attention avec ce que l'on croit voir dans le base de registre via Regedit !

    Registry Virtualization est cherchant juste "HKEY_LOCAL_MACHINE VirtualStore" sur Google, comme pour les fichiers ini qui subissait une isolation par l'UAC plus que pénible.

    J'ai abandonné toute utilisation de la BDR depuis Vista, qui compliquait aussi les fichiers ini (emplacement altéré, une copie dans le VirtualStore aussi)

    Tu aurais une différence entre exe D7 et un exe D11, le manifest généré par les Delphi récent évite cette Virtualization.

    Je préfère mettre le minimum dans un fichier CFG maison (XML, JSON, DFM) et tout en BD (je travaille à 99% avec une DB)


    Pense qu'il y a DEUX BDR, la 32 et 64Bits, donc tu ne vois pas les mêmes clés !

    Si ton programme est en 32bits, HKEY_LOCAL_MACHINE\SOFTWARE = HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node dans Regedit !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Pour SE_BACKUP_NAME : A lire : SeBackupPrivilege mais ça date de 2007 en D7, donc surement a retravailler.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    Citation Envoyé par ShaiLeTroll Voir le message
    Suffit de faire une boucle récursive avec deux objets TRegistry, chacun ouvert sur la bonne racine et chacune sur le clé adéquate.

    Je dois avoir ce code en D4 chez moi.
    J'esperais un truc plus simple 😉

    Je veux bien les sources, si ce n'est pas trop demande ET surtout trop de travail.
    Je n'ai que le Scan de la BDR, un outil de recherche plus pratique que Regedit, j'ai du écrire ce code sur Phidels qui n'existe plus.

    D'ailleurs écrit en D4 sous W98, je te confirme avec MoveKey, on pouvait tout déplacer d'un coup, j'ai du écrire un code spécifique à NT4
    Comme le windows actuels sont des NT, faut donc le faire manuellement

    Désolé, je n'ai conservé que la suppression ... c'est un code écrit quand j'étais apprenti alors je ne doute pas que tu puisses écrire une fonction Clone recursive assez rapidement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    function Tfrmclean.DeleteKeyNT(PathKey :string): boolean;
    var
       RegNT: Tregistry;
       UnderKeyList: TStringList; //est la liste recensant les cle du niveau actuel
       indexList: integer; //position dans UnderKeylist
    begin
         RegNT:= Tregistry.Create;
         try
            RegNT.RootKey:= NumHKEY;
            result:= true;
            if not RegNT.KeyExists(PathKey) then exit;
            if not RegNT.OpenKeyReadOnly(PathKey) then exit;
            if RegNT.HasSubKeys then begin
               UnderKeyList:= TStringList.Create;
               try
                  UnderKeyList.Clear;
                  GetKeyNamesEx(RegNT, UnderKeyList);
                  for indexlist:=0 to UnderKeyList.count -1 do
                    if UnderKeyList[indexlist] <> '' then
                      result:= DeleteKeyNT(PathKey + '\' + UnderKeyList[indexlist])
                    else
                     lblMsgError.Caption := 'Nom de Clé Enfant Vide : '+ PathKey;
                  RegNT.CloseKey;
                  result:= RegNT.DeleteKey(PathKey);
               finally
                      UnderKeyList.Free;
               end;
             end else begin
                 RegNT.CloseKey;
                 result:= RegNT.DeleteKey(PathKey);
             end;
         finally
                RegNT.free;
         end;
     
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 936
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 936
    Par défaut
    Pourquoi ne pas simplement invoquer reg copy ?

    En faisant cela soit-même, outre la récupération des clés, il faudra déterminer les types de valeur pour savoir comment les écrire, tout en sachant que TRegistry ne les gère pas tous (pas de multi-string).

    Après ce qui m'interpelle le plus est que ces clés ne concernent manifestement pas une app développée par tes soins (DELL). Si ces clés ne sont pas trouvées sous HKCU, il n'y a pas de fallback sous HKLM. Penses-tu que ça fonctionnera ?

  8. #8
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut
    Bonjour et merci à tous les deux

    Andnotor, merci la copie c'est faite parfaitement en HKCU vers HKLM (en tout cas visuelement)


    Par contre, impossible de lire quoique ce soit


    comme ShaiLeTroll, j'ai déjà positionné la pluspart des paramètres dans un BDD, mais ne serait ce que la localisation de cette base est dans la base de registre.


    Je crois que je vais faire une pause, afin de réfléchir à une solution. A moins que vous ayez une solution évidente 😉

    Merci encore (on ne le dis pas assez sur le forum 😁 )

    olivier

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 936
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 936
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    Par contre, impossible de lire quoique ce soit
    Je pense que LeTroll t'a déjà donné la cause : 32 contre 64 bits.

    Si depuis une application 32 bits tu veux vraiment lire les clés 64 bits, tu dois clairement le définir à l'instanciation par TRegistry.Create(KEY_READ or KEY_WOW64_64KEY).

Discussions similaires

  1. Pas moyen de copier : une autre tare de Windows 10
    Par Gluups dans le forum Windows 10
    Réponses: 7
    Dernier message: 10/08/2023, 19h15
  2. [XL-2016] recherche une valeur et copier une autre valeur de la meme ligne
    Par Fdc_53 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/12/2018, 16h31
  3. [XL-2003] VBA - Recopier vers les bas une formule et copier une autre cellule vers le bas
    Par romzy7887 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/03/2018, 00h42
  4. Réponses: 5
    Dernier message: 23/08/2014, 11h37
  5. [AC-2010] Copier une autre base ouverte d'un répertoire A vers B
    Par JeanYves70 dans le forum VBA Access
    Réponses: 4
    Dernier message: 28/11/2013, 14h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo