2009-11-12 2 views
10

Pendant un certain temps maintenant le programme d'installation pour mon programme a utilisé le code ci-dessous pour faire mon application avec les privilèges de administrez. Mais il semble n'avoir aucun effet sous Windows 7. Dans Vista ça a fonctionné à merveille. Si je clique avec le bouton droit de la souris sur le raccourci et lui demande de lancer Administer, le programme démarrera correctement. Mais en utilisant le code ci-dessous, il devrait être fait pour exécuter le programme de cette façon tout le temps. Ce n'est plus le cas. Est-ce que quelqu'un sait si Win 7 utilise encore cette clé? L'UAC est également en route.RunAsAdmin dans le registre ne marche pas semblent fonctionner dans Windows 7

Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows NT\ 
CurrentVersion\AppCompatFlags\Layers", "C:\App\app.exe", "RUNASADMIN"); 

Merci.

Répondre

6

J'utilise Windows 7 et je peux voir ces clés. Cependant, je ne pense pas que ce soit une bonne façon de configurer votre application et votre programme d'installation.

Ma recommandation est que vous diffusez un fichier manifeste avec votre application (app.exe). Le fichier manifeste peut même être intégré facilement dans l'exécutable si vous utilisez Visual Studio 2008. Ensuite, dans le fichier manifeste, vous pouvez exiger des droits d'administrateur.

http://msdn.microsoft.com/en-us/library/bb756929.aspx

http://blogs.msdn.com/shawnfa/archive/2006/04/06/568563.aspx

http://channel9.msdn.com/posts/jmazner/How-To-Tell-Vistas-UAC-What-Privelege-Level-Your-App-Requires/

+0

Merci lextm. Je ne savais pas qu'un fichier manifeste pouvait être créé pour les fichiers exe que je n'ai pas créés. Ou qu'ils n'ont pas à être intégrés non plus. Merci pour les liens. – JimDel

+0

@JimDel: Tous ces liens semblent concerner l'intégration du manifeste. Où avez-vous vu comment je le ferais "pour les fichiers exe que je n'ai pas créés?" – Pete

1

dans win7, RUNASADMIN EST SITUÉ DANS CLÉ: lorsque HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers utilisant bouclier d'installation 5.1, les valeurs sont copiées dans le appcpmctflgsin wow6432node et exe actualy Fali pour fonctionner comme admin.

+0

et comment y remédier ?! –

1

This answer by RobeN fonctionne "pour un fichier EXE que je n'ai pas créé", ce que vous avez exprimé comme un intérêt pour votre commentaire sur Lex Li's answer. Il utilise votre idée de registre d'origine.

Deux peut-être des différences importantes:

  1. Avec un système d'exploitation 32 bits, je n'a pas besoin de vous soucier de la Wow6432Node (a concern mentioned by "uss")
  2. En utilisant HKLM au lieu de HKCU, je besoin de vous inquiétez pas pour quel utilisateur est l'exécution de l'application (a concern mentioned by Leo).
8

J'ai une réponse/solution de contournement pour cette question. Tout d'abord, je ne suis pas d'accord (respectueusement) avec le commentaire que l'utilisation de AppCompatFlags n'est pas une "bonne façon de configurer votre application et votre programme d'installation." La modification de cette section du Registre est simplement mise en miroir à l'aide de l'interface graphique de Windows pour modifier le niveau de privilège de l'exécutable. Je trouve cette méthode plus facile à implémenter que d'ajouter un fichier manifeste. Si l'utilisateur souhaite ou doit modifier le niveau de privilège pour ne pas l'exécuter en tant qu'administrateur, il peut le faire facilement avec l'interface graphique.

Quoi qu'il en soit, j'ai eu ce même problème d'essayer de définir le niveau de privilège de l'exécutable à exécuter en tant qu'administrateur. Nous savons que nous pouvons le définir avec l'interface graphique:

  • Cliquez avec le bouton droit sur le raccourci ou.fichier EXE et sélectionnez Propriétés
  • Cliquez sur l'onglet Compatibilité
  • (À ce stade, vous pouvez définir le niveau de privilège pour seulement vous ou pour tous les utilisateurs, je préfère le faire pour tous les utilisateurs)
  • Cliquez sur le bouton, le changement paramètres pour tous les utilisateurs
  • Une nouvelle fenêtre Propriétés est ouverte avec un onglet intitulé «Compatibilité pour tous les utilisateurs»
  • Sous Niveau de privilège cochez «Exécuter ce programme en tant qu'administrateur», cliquez plusieurs fois sur OK pour enregistrer les modifications .

Lorsque les modifications sont enregistrées, vous trouverez le paramètre dans le Registre:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers] 
"C:\\Program Files (x86)\\My Program\\My Program.exe"="RUNASADMIN" 

Quand je mets le .exe à exécuter en tant qu'administrateur à l'aide de l'interface graphique de cette façon, cela fonctionne toujours.

Cependant, chaque fois que j'ai essayé de changer le registre directement sans passer par l'interface graphique, le programme ne fonctionnera pas en tant qu'administrateur. Le registre montre que j'ai fait la modification et quand je regarde le niveau de privilège pour l'exécutable, exécuter en tant qu'administrateur est vérifié comme sur.

J'ai essayé plusieurs façons de faire fonctionner .exe en tant qu'administrateur en changeant simplement le Registre:

  • manuellement modifié le registre avec regedit
  • importé les modifications d'un fichier .reg
  • utilisé la outil de ligne de commande reg.exe pour changer le registre
  • Utilisé l'outil maintenant Wise Script
  • Utilisé AutoIT Scripting

Toutes ces méthodes ont fait la même chose. Le registre a été modifié et l'interface graphique a montré que ce programme devrait fonctionner en tant qu'administrateur, mais le programme ne fonctionne jamais en tant qu'administrateur.

La solution pour ce problème que j'ai trébuché est d'aller de l'avant et de modifier la fois la clé HKCU et la clé HKLM avec le paramètre.

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers] 
"C:\\Program Files (x86)\\My Program\\My Program.exe"="RUNASADMIN" 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers] 
"C:\\Program Files (x86)\\My Program\\My Program.exe"="RUNASADMIN" 

Si vous changez ces deux sections de registre, le .exe fonctionnera en tant qu'administrateur. Plus important encore, si un utilisateur différent se connecte au PC, le programme s'exécutera en tant qu'administrateur. Ceci est en dépit du changement de registre n'étant pas fait section HKCU pour l'utilisateur suivant.

Je ne sais pas ce qui se passe ici, mais ça marche.

1

I utilisé CMD pour ajouter cette entrée dans le registre en utilisant la commande suivante:

reg ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /t REG_SZ /f /v "C:\Program Files (x86)\MyApp\myapp.exe" /d RUNASADMIN 

Cela fonctionne bien dans Win8Pro-32Bit, mais pas de travaux sur la version 64 bits!
J'ai trouvé que l'exécution de cette commande sur un 64Bit Win (exécute un programme d'installation 32 bits comme étape d'installation finale), provoque la création d'une entrée sur HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers!
Après quelques recherches (merci à mon ami MH.Toosi), nous avons trouvé la bonne solution.
/reg:64 AJOUTER JUSTE À LA FIN DE LA ANTERIEURE commande comme ceci:

reg ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /t REG_SZ /f /v "C:\Program Files (x86)\MyApp\myapp.exe" /d RUNASADMIN /reg:64 

et tout est normal dans les deux systèmes d'exploitation 32 et 64 bits (Win 7 32bit, Win 8 32Bit, Win 8.1 64Bit).

Questions connexes