不允许请求的注册表访问

时间:2009-02-18 18:45:03

标签: c# .net security uac registry

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

所有在Windows XP等下运行正常。但是我在Windows 7下遇到错误Requested registry access is not allowed。Vista和2008我也是。

如何修改代码以添加UAC支持?

7 个答案:

答案 0 :(得分:56)

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>

答案 1 :(得分:17)

除非您拥有管理权限,否则您无法在Vista和更新版本的Windows中写入HKCR(或HKLM)配置单元。因此,您需要在运行实用程序之前以管理员身份登录,为其提供一个清单,说明它需要管理员级别(这将提示用户输入管理员登录信息),或者退出更改非 - 管理员不应该玩。 : - )

答案 2 :(得分:17)

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

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

将以管理员身份运行该过程,以便通过注册表执行您需要的任何操作,但使用正常的权限返回到您的应用程序。这样,每次启动时都不会提示用户使用UAC对话框。

答案 3 :(得分:5)

作为临时修复,用户可以右键单击该实用程序并选择“以管理员身份运行”。

答案 4 :(得分:2)

我正在尝试verb = "runas",但在尝试更新注册表值时仍然遇到UnauthorizedAccessException。原来这是因为没有打开可写设置为true的子键。

Registry.OpenSubKey("KeyName", true);

Cannot write to Registry Key, getting UnauthorizedAccessException

答案 5 :(得分:1)

此问题与向运行应用程序的用户帐户授予必要的授权有关。要阅读类似的情况和针对正确解决方案的详细响应(如Microsoft所述),请随时访问此帖子:http://rambletech.wordpress.com/2011/10/17/requested-registry-access-is-not-allowed/

答案 6 :(得分: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>