web-dev-qa-db-fra.com

L'accès au registre demandé n'est pas autorisé

J'écris un utilitaire Tweak qui modifie certaines clés sous HKEY_CLASSES_ROOT.

Tout fonctionne bien sous Windows XP, etc. Mais je reçois une erreur Requested registry access is not allowed sous Windows 7. Vista et 2008 également.

Comment dois-je modifier mon code pour ajouter le support UAC?

42
abatishchev

app.manifest devrait être comme 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>
56
abatishchev

Vous ne pouvez pas écrire sur les ruches HKCR (ou HKLM) sous Vista et les versions plus récentes de Windows, à moins que vous ne possédiez des privilèges d'administrateur. Par conséquent, vous devez soit être connecté en tant qu'administrateur avant d'exécuter votre utilitaire, lui donner un manifeste indiquant que celui-ci nécessite un niveau administrateur (qui invite l'utilisateur à fournir ses informations de connexion admin), ou bien cesser de modifier -Les administrateurs ne devraient pas jouer. :-)

17
Ken White

Si vous n'avez pas besoin des privilèges d'administrateur pour l'ensemble de l'application ou seulement pour quelques modifications peu fréquentes, vous pouvez effectuer les modifications dans un nouveau processus et le lancer à l'aide de:

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

qui lancera le processus en tant qu’administrateur pour faire tout ce dont vous avez besoin avec le registre, mais reviendra dans votre application avec les privilèges normaux. De cette façon, il ne demande pas à l'utilisateur de créer une boîte de dialogue UAC à chaque lancement.

17
Davy8

En tant que solution temporaire, les utilisateurs peuvent cliquer avec le bouton droit sur l'utilitaire et sélectionner "Exécuter en tant qu'administrateur". 

5
Brian

J'essayais le verb = "runas", mais je recevais toujours UnauthorizedAccessException lorsque j'essayais de mettre à jour la valeur de registre. En fin de compte, cela était dû au fait que la sous-clé n’avait pas été ouverte avec le droit d’inscription défini sur true.

Registry.OpenSubKey("KeyName", true);

Impossible d'écrire sur la clé de registre, obtention de UnauthorizedAccessException

2
Despertar

Ce problème concerne l’octroi de l’autorisation nécessaire au compte d’utilisateur sur lequel l’application s’exécute. Pour lire une situation similaire et obtenir une réponse détaillée concernant la solution correcte, documentée par Microsoft, n'hésitez pas à consulter le message suivant: http://rambletech.wordpress.com/2011/17/requested-registry-access- n'est pas autorisé/

1
Ozzie

Vous pourriez faire la même chose que abatishchev mais sans l'UAC 

<Assembly manifestVersion="1.0" xmlns="urn:schemas-Microsoft-com:asm.v1">
<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">
    </requestedPrivileges>
    </security>
  </trustInfo>
</Assembly>
0
Last Resort