2017-10-12 65 views
0

Je voudrais ajouter une nouvelle entrée "Partager" dans le menu contextuel, donc avec le clic droit sur un fichier je verrais cette nouvelle entrée "Partager" dans le menu contextuel. J'ai essayé comme dans le code ci-dessous, mais la méthode CreateSubKey() throw e exception System.UnauthorizedAccessException disant refuser l'accès à la clé HKEY_CLASSES_ROOTComment obtenir un accès par programme pour ajouter une nouvelle entrée dans le menu contextuel?

const string MenuName = "*\\shell\\NewMenuOption"; 
const string Command = "*\\shell\\NewMenuOption\\command"; 
RegistryKey key = null; 
key = Registry.ClassesRoot.CreateSubKey(MenuName, RegistryKeyPermissionCheck.ReadWriteSubTree); 
key = Registry.ClassesRoot.CreateSubKey(Command, RegistryKeyPermissionCheck.ReadWriteSubTree); 
key.SetValue("Share", ObjectToStore); 

j'ai vu quelque chose sur ce guide mais je pense que le .NET2.0 était différent

+0

J'ai résolu le probem exécutant un exe séparé avec les droits d'administrateur qui définissent la clé. De cette façon, la demande de droit est posée une seule fois @Michael –

Répondre

1

Je pense que vous avez besoin d'autorisations d'administrateur (locales?) Pour cela. Essayez d'exécuter votre application en tant qu'administrateur.
Si cela fonctionne, vous avez deux choix:

d'une méthode est d'exiger des droits d'administrateur pour exécuter votre application - pas la meilleure idée.
La méthode deux serait un deuxième projet (ligne de commande) qui n'a qu'un seul but, la création de ces clés de registre. Cette application nécessite des autorisations d'administrateur. Et vous pouvez exécuter cette application (Process.Start(...)) à partir de votre application principale.

Pour forcer admin-permissons dans votre application ajouter un fichier manifeste app.manifest/à votre projet studio visuel et décommentez cette ligne <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Le fichier trou doit être ressembler à ceci (il y a plus d'entrées par défaut dans l'application Visual studio .manifest génère pour vous)

<?xml version="1.0" encoding="utf-8"?> 
<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"> 
     <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
     <!-- <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> --> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
</assembly> 

Ensuite, allez aux paramètres du projet, l'application et dans l'écran inférieur sous manifeste vous choisissez votre fichier app.manifest. Reconstruire. Terminé.

+0

Si possible, la création d'applications nécessitant des privilèges élevés doit être évitée. Dans ce cas, l'ajout à HK_USERS serait probablement plus approprié. – DiskJunky

+1

@DiskJunky Vous avez raison. J'ai mis à jour mon poste :) – Michael

+0

@FedericoRizzo Quelques détails supplémentaires seraient bien ... Qu'avez-vous essayé et que se passe-t-il? – Michael

0

Si vous ajoutez à HK_CLASSES_ROOT, votre application devra être exécutée avec des privilèges élevés. Idéalement, vous devriez conserver les modifications de HK_USERS qui doivent avoir les mêmes sous-clés

+0

Merci. Cela fonctionne –

+0

S'il vous plaît un instant. Êtes-vous sûr qu'avec HK_USER je peux éditer le menu contextuel? @DiskJunky –

+0

Ce message a un guide détaillé Comment faire; https://stackoverflow.com/a/2124396/1838819 – DiskJunky