2009-02-18 9 views
37

J'écris un utilitaire de modification qui modifie certaines clés sous HKEY_CLASSES_ROOT.L'accès au registre demandé n'est pas autorisé

Tout fonctionne correctement sous Windows XP et ainsi de suite. Mais je reçois erreur Requested registry access is not allowed sous Windows 7. Vista et 2008 je suppose aussi.

Comment modifier mon code pour ajouter le support UAC?

Répondre

45

app.manifest devrait ressembler à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app" /> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security> 
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
      <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
     </requestedPrivileges> 
     </security> 
    </trustInfo> 
</asmv1:assembly> 
+0

Où se trouve ce app.manifest? –

+3

@Gunner: Mettez-le à la racine d'un projet, comme App.config. (Fichier -> Ajouter un nouvel élément -> Fichier manifeste de l'application) – abatishchev

+0

@abatishchev: Le contenu xml ci-dessus est un contenu générique et devrait suffire pour toute application, non? –

15

Vous ne pouvez pas écrire dans les ruches HKCR (ou HKLM) dans Vista et dans les versions plus récentes de Windows, sauf si vous disposez de privilèges administratifs. Par conséquent, vous devrez soit être connecté en tant qu'administrateur avant d'exécuter votre utilitaire, lui donner un manifeste indiquant qu'il requiert le niveau Administrateur (qui invitera l'utilisateur à entrer des informations de connexion Admin), ou arrêter de modifier des éléments dans des -Les administrateurs ne devraient pas jouer. :-)

+0

merci pour le mot clé 'manifeste' :) – abatishchev

+2

vous êtes les bienvenus. :-) Désolé je ne pouvais pas poster le bon manifeste, mais je n'en avais pas sur cette machine et je me suis dit que si quelqu'un devait en chercher un, ça pourrait aussi bien être vous. –

4

En tant que solution temporaire, les utilisateurs peuvent faire un clic droit l'utilitaire et sélectionnez « Exécuter en tant qu'administrateur. »

17

Si vous n'avez pas besoin pour l'administration privs application entière, ou seulement pour quelques changements peu fréquents que vous pouvez faire les changements dans un nouveau processus et de lancer à l'aide:

Process.StartInfo.UseShellExecute = true; 
Process.StartInfo.Verb = "runas"; 

qui se déroulera le processus en tant qu'administrateur pour faire ce dont vous avez besoin avec le registre, mais revenez à votre application avec les privilèges normaux. De cette façon, il n'invite pas l'utilisateur à ouvrir une boîte de dialogue UAC à chaque lancement.

+0

Voulez-vous dire qu'il nécessite l'implémentation d'une fourche, où une partie du code lance la même application avec le paramètre afin qu'une autre partie du code soit exécutée? – abatishchev

+0

Il pourrait être la même application avec des paramètres ou il pourrait être une petite application sans fenêtre séparée qui écrit ce dont il a besoin. – Davy8

Questions connexes