Question

Pour ouvrir la boîte de dialogue UAC dans Vista lors de l'écriture dans la ruche de registre HKLM, nous avons choisi de ne pas utiliser l'API de registre Win32, car lorsque les autorisations Vista sont manquantes, nous devons relancer toute notre application avec des droits d'administrateur. Au lieu de cela, nous faisons cette astuce:

ShellExecute(hWnd, "runas" /* display UAC prompt on Vista */, windir + "\\Reg", "add HKLM\\Software\\Company\\KeyName /v valueName /t REG_MULTI_TZ /d ValueData", NULL, SW_HIDE);

Cette solution fonctionne correctement, à part le fait que notre application est une version 32 bits et qu'elle exécute la commande REG.EXE comme s'il s'agissait d'une application 32 bits utilisant le calque de compatibilité WOW! :( Si REG.EXE est exécuté à partir de la ligne de commande, il est correctement exécuté en mode 64 bits. Cela est important, car si elle est exécutée en tant qu'application 32 bits, les clés de registre se retrouveront au mauvais endroit en raison de réflexion du registre .

Existe-t-il un moyen de lancer une application 64 bits par programme à partir d'une application 32 bits sans l'exécuter avec le sous-système WOW64 comme son processus 32 bits parent (c'est-à-dire un suffixe "*" dans la tâche)? Manager)?

Était-ce utile?

La solution

essayez ceci (à partir d'un processus 32 bits):

> %WINDIR%\sysnative\reg.exe query ...

(trouvé que ici ).

Autres conseils

L'exécution d'un programme natif (non géré) 32 bits ou 64 bits dépend uniquement de l'exécutable. Il existe deux copies de reg.exe , dans C: \ Windows \ System32 (64 bits) et C: \ Windows \ SysWOW64 (32 bits). Comme vous ne spécifiez pas de chemin, vous obtenez ce qui apparaît en premier dans la variable d’environnement PATH , qui correspond à la version 32 bits d’un processus 32 bits.

Vous devez vraiment factoriser cette fonction dans un programme ou un objet COM distinct et marquer le programme avec un manifeste, ou lancer l'objet COM à l'aide de la commande Moniker élévation COM .

Avez-vous envisagé de créer un petit " assistant " application pour faire la mise à jour du registre pour vous? Si vous le compilez en 64 bits et incluez un manifeste indiquant que celui-ci nécessite des droits d'administrateur, les deux bases seront alors couvertes pour vous.

Il existe des API pour détecter le & bit; bitness " du système d’exploitation sur lequel vous travaillez afin de compiler à la fois RegistryUpdate32.exe et RegistryUpdate64.exe et appeler celui qui convient.

Une des solutions que j'ai proposées à moi-même consiste à inviter PInvoke à désactiver la redirection:

http: // msdn .microsoft.com / fr-fr / bibliothèque / windows / desktop / aa365744 (v = vs.85) .aspx

Vous pouvez toujours le réactiver.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top