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

7

我想要写入Windows注册表中HKEY_CURRENT_USER\Software\appname的内容,但是当我尝试写入该键时,我遇到了权限错误。我已经将以下内容添加到我的程序集中:

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

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

4
请发布您用于写入密钥的代码。一个简短但完整的示例会更理想。 - Jon Skeet
5个回答

8
我不认为问题只是因为你打开了密钥但没有指定写入权限。使用OpenSubKey(string)方法时只能获取只读权限。

7

RegistryPermissionAttribute代码访问安全(CAS) 的一部分,这是一个权限系统,用于检查您在 .NET 框架内的权限,这些权限由安全策略定义。有四个安全策略

  • 企业 - 适用于 Active Directory 安装中的机器族群的策略。
  • 机器 - 适用于当前机器的策略。
  • 用户 - 适用于已登录用户的策略。
  • 应用程序域 - 适用于正在执行的应用程序域的策略。

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

我之所以先解释这个,是因为 RegistryPermissionAttribute 只检查您的 .NET 权限,而不检查操作系统权限。

你可以使用System.Security.AccessControl来检查操作系统权限,但是要获取权限,你可能需要提升或模拟用户。

0

我看不到这里的答案或解决方法。我是在搜寻其他问题时找到了这个问题。

我认为可能需要的一件事是,如果你从 exe 运行,则需要以管理员身份运行。如果你从 VS 运行,则需要确保 VS 以管理员身份运行。如果是这样,VS 窗口标题将显示“(Administrator)”。


0

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


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

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


任何应用程序都可以写入当前用户节点。本地计算机和其他计算机受操作系统保护。 - Kim

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