如何在C#中获取注册表写入权限

时间:2009-04-06 12:06:26

标签: c#

我正在尝试写入HKEY_CURRENT_USER \ Software \ appname中的Windows注册表,但是当我尝试写入密钥时,我一直收到权限错误,我已将以下内容添加到我的程序集中:

[assembly: RegistryPermissionAttribute(SecurityAction.RequestMinimum, Write = @"HKEY_CURRENT_USER\\Software")]

但这还没有解决问题,我还应该做些什么吗?

5 个答案:

答案 0 :(得分:8)

我认为这并不像你打开密钥那样简单而没有指定你想要写访问权限? OpenSubKey(string)方法仅提供只读访问权限。

答案 1 :(得分:7)

RegistryPermissionAttributeCode Access Security aka CAS的一部分,这是一个权限系统,用于检查.NET框架内部的权限,这些权限由安全策略定义。 There are 4 security policies

  • 企业版 - 属于Active Directory安装的一系列计算机的策略。
  • 机器 - 当前机器的政策。
  • 用户 - 已登录用户的政策。
  • AppDomain - 执行应用程序域的策略。

前三个在.NET配置工具的配置屏幕中配置,最后一个在运行时配置。

我首先解释这一点的原因是RegistryPermissionAttribute仅检查您的.NET权限,但它不检查操作系统权限。

您可以使用System.Security.AccessControl检查操作系统权限,但要获取您可能需要升级或模拟的权限。

答案 2 :(得分:0)

确保应用使用具有足够权限访问注册表的用户帐户运行。

答案 3 :(得分:0)

我在这里没有看到答案或解决方案。我在搜索其他东西时发现了这个问题。

我认为可能需要的一件事是,如果您从exe运行,则需要以管理员身份运行。如果您从VS运行,则需要确保VS以管理员身份运行。如果是,VS将在窗口标题中显示"(管理员)。

答案 4 :(得分:-1)

这对我有用。已经存在密钥而没有它。没有任何特殊的装配属性。

using System;
using Microsoft.Win32;

namespace WriteToRegistry {
  class Program {
    static void Main(string[] args) {
      const string csRootKey = @"Software\MyCompany\Test";

      using (RegistryKey loRegistryKey = Registry.CurrentUser.CreateSubKey(csRootKey)) {
        if (loRegistryKey == null)
          throw new InvalidOperationException("Could not create sub key " + csRootKey);

        loRegistryKey.SetValue("CurrentTime", DateTime.Now.ToString(), RegistryValueKind.String);
      }
    }
  }
}

编辑:重新阅读问题之后,似乎问题可能是操作系统权限。