9
votes

Comment éviter le message de confirmation lors de l'exécution d'un fichier .reg avec commande shellexecute

Dans mon programme, je vérifie une clé de registre au démarrage et si cela n'existe pas, j'exécute le fichier REG situé dans le dossier de l'application avec l'aide de la commande shellexecute. Comment puis-je éviter d'obtenir des messages de confince lors de l'exécution de cette commande? Y a-t-il un moyen de faire cela ou selon des raisons de sécurité que ce n'est pas possible?


8 commentaires

Ne pas exécuter le fichier REG. Utilisez directement l'API de registre.


Je suis sûr que le conseil que vous avez donné est précieux, mais pourriez-vous s'il vous plaît expliquer pourquoi je ne devrais pas le faire de cette façon? Et une dernière chose, le fichier de registre que je veux exécuter contient des tonnes d'entrées qui ont été automatiquement insérées par une grille de données de données. Si j'essaie de l'écrire manuellement, ça ne veut pas dire une perte de temps?


Par exemple, comment allez-vous traiter avec le redirecteur de registre sur des systèmes 64 bits?


J'espère que cette clé REG n'est pas dans hklm . Sinon, vous ne pourrez pas l'importer.


En outre, vous aurez besoin de droits d'administration pour exécuter Regedit dans l'environnement UAC. La boîte de dialogue AVERTISSEMENT UAC contemplera certainement, demandant à l'utilisateur de confirmer.


@kobik c'est une autre raison de préférer reg importer


@DavidHeffernan, reg ressemble à un outil désigné pour cette tâche. mais devrait être testé dans le système d'exploitation activé par UAC.


On dirait que votre application permet de définir des clés de registre et des valeurs appartenant à un installateur plutôt que d'exécuter de votre application. Cela évite également les problèmes avec UAC lors de l'appelant regedit.exe ou reg.exe . Si vous avez vraiment besoin de le faire, veuillez utiliser l'API de registre comme souvent Regedit / Reg sont bloquées dans les environnements d'entreprise et même s'ils ne sont pas un moyen de vérifier si cela réussissait ou si vous effectuez une manipulation des erreurs (c'est ce que les API sont pour) .


4 Réponses :


17
votes

Utilisez le commutateur de ligne de commande / S. (Voir http://support.microsoft.com/kb/82821 )


3 commentaires

Et comment puis-je le faire à Delphi? Est-ce que j'utilise toujours Shellexecute? Un exemple serait apprécié


Shellexecute fonctionnerait bien. Moi-même que j'utiliserais reg importation plutôt que regedit .


lien vers MM cassé, comme il l'utilise pour être



16
votes

C'est possible. Deux méthodes sont:

  1. % windir% \ system32 \ regedit.exe / s fichier.reg
  2. % Windir% \ System32 \ Reg.exe Importer fichier.reg

    soit importer silencieusement fichier.reg dans le registre.


1 commentaires

Cela a fonctionné, sauf qu'il incite maintenant que vous devez être dans des privilèges d'administration, donc autant de nombreuses invites.



3
votes

Essayez ceci pour importer le * .reg fichier, xxx pré>

aussi vous pouvez essayer ce lien unitexregistry.pas P>

Cette unité unitexregistry.PAS a des fonctions très utiles pour exporter un fichier de registre et importer silencieusement les exportés *. Fichier REG P>

     procedure TForm1.Button1Click(Sender: TObject);
        var
         texpr : TExRegistry;
        begin
          texpr:=TExRegistry.Create;
          texpr.ImportRegFile('c:\myReg.reg');
          texpr.Free;
       end;


0 commentaires

0
votes

Apparemment, il y a un bogue dans Reg Import - il écrit le message de réussite à STDERR au lieu de stdout.

Le code de référence suivant résout le problème. Le message de réussite est supprimé, mais le message de défaillance est affiché. P>

SET RegError=%TEMP%\RegError.txt
REG IMPORT "%Settings.reg%" 2>"%RegError%" && DEL /Q "%RegError%" || @(ECHO Error importing %Settings.reg%: & TYPE "%RegError%" & PAUSE)
SET RegError=


0 commentaires