请求的注册表访问不被允许。

52

我正在编写一个调整实用程序,修改了 HKEY_CLASSES_ROOT 下的一些键。

在 Windows XP 等系统下一切正常。但在 Windows 7 下出现错误 Requested registry access is not allowed。我猜 Vista 和 2008 也会出现这个问题。

我应该如何修改我的代码以添加 UAC 支持?

7个回答

64

app.manifest 应该像这样:

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

4
@Gunner:将它放到项目的根目录下,比如App.config。(文件 -> 添加新项 -> 应用程序清单文件) - abatishchev
2
@Gunner:将 App.manifest 添加到 VS 项目的根目录,它将自动复制到输出目录作为 <appname>.exe.manifest 或嵌入程序集中。 - abatishchev
1
@Gunner:理论上应该等于可执行文件的名称。 - abatishchev
用户仅需读取注册表,为何需要管理员权限?许多公司电脑不授予用户管理员权限,那么在这种情况下,任何应用程序如何使用注册表呢? - NickG
@NickG:非特权用户只能访问用户注册表 hive。 - abatishchev
显示剩余6条评论

20

在Vista及其更新版本的Windows中,如果您没有管理员权限,则无法写入HKCR(或HKLM)注册表项。因此,在运行实用程序之前,您需要以管理员身份登录,为其提供需要管理员级别的清单(这将提示用户输入管理员登录信息),或者停止更改非管理员应该玩耍的地方。 :-)


3
不用客气。 :-) 抱歉我无法在此机器上发布适当的清单,但我想如果有人必须搜索清单,那就应该是你。 <g> - Ken White

19

如果您不需要对整个应用程序进行管理员特权,或者只需要进行一些不经常的更改,则可以在新进程中进行更改,并使用以下方式启动它:

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

这将以管理员身份运行进程,以执行您需要的所有注册表操作,但在完成后以正常特权返回您的应用程序。这样,它就不会每次启动时提示用户打开UAC对话框。


你的意思是需要实现一个分叉,其中一部分代码启动带参数的同一应用程序,以便执行另一部分代码吗? - abatishchev
它可以是具有参数的相同应用程序,也可以是一个单独的小型无窗口应用程序,以编写其所需内容。 - Davy8

7
作为临时解决方案,用户可以右键单击工具,并选择“以管理员身份运行”。

2

1

0

你可以像abatishchev一样做,但不需要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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接