【问题标题】:How to get programmatically access to add a new entry in Context Menu?如何以编程方式访问以在上下文菜单中添加新条目?
【发布时间】:2017-10-12 14:30:33
【问题描述】:

我会在上下文菜单中添加一个新条目“共享”,因此右键单击文件我会在上下文菜单中看到这个新条目“共享”。我在下面的代码中尝试过,但是方法 CreateSubKey() 抛出异常 System.UnauthorizedAccessException 说拒绝访问密钥 HKEY_CLASSES_ROOT

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);

我在 guide 上看到了一些东西,但我认为在 .NET2.0 上有所不同

【问题讨论】:

  • 我解决了运行具有管理员权限的单独 exe 设置密钥的问题。这样,权利请求只被问一次@Michael

标签: c# visual-studio c#-4.0 .net-4.0 registry


【解决方案1】:

我认为您需要(本地?)管理员权限。尝试以管理员身份执行您的应用。
如果这可行,您有两个选择:

方法一是要求管理员权限来运行您的应用程序 - 不是最好的主意
方法二将是第二个(命令行)项目,它只有一个目的,即创建这些注册表项。此应用程序需要管理员权限。您可以从您的主应用程序运行此应用程序 (Process.Start(...))。

要在您的应用程序中强制管理权限,请将 app.manifest / manifest-file 添加到您的 Visual Studio 项目并取消注释此行 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

hole 文件应该是这样的(在 app.manifest Visual Studio 为您生成的默认条目更多)

<?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>

然后转到项目设置、应用程序,然后在清单下方的屏幕下方选择您的 app.manifest 文件。重建。完成。

【讨论】:

  • 尽可能避免创建需要提升权限的应用程序。在这种情况下,添加到 HK_USERS 可能更合适。
  • @FedericoRizzo 更多细节会很好...您尝试过什么,发生了什么?
  • 它肯定更好的解决方案(在你的情况下),但有时需要管理员权限。那么这是一种方法。我已经(再次)测试了我的帖子,对我有用。
  • 现在我知道上下文菜单可以用 HK_USER 编辑,所以我必须找到另一个解决方案。我必须使用 HK_CLASSES_ROOT。如果我什么也找不到,我会尝试更好的解决方案
  • 它有效。我只需要了解每次启动应用程序时都避免权限请求
【解决方案2】:

如果您要添加到 HK_CLASSES_ROOT,您的应用程序必须以提升的权限运行。理想情况下,您应该保留对 HK_USERS 的任何更改,这些更改应该具有相同的子键

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
相关资源
最近更新 更多