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

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

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

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

RegistryPermissionAttribute是Code Access Security又称CAS的一部分 ,这是一个权限系统,用于检查.NET框架内部的权限,这些权限由安全策略定义。 有4个安全策略 :

  • 企业 – 作为Active Directory安装一部分的一系列计算机的策略。
  • 机器 – 当前机器的策略。
  • 用户 – 登录用户的策略。
  • AppDomain – 执行应用程序域的策略。

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

我之所以解释这一点的原因是因为RegistryPermissionAttribute只检查您的.NET权限,它不会检查操作系统权限。

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

我不认为这是一个简单的事情,就像你打开密钥而没有指定你想要写访问权限? OpenSubKey(string)方法仅提供只读访问权限。

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

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

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

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

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

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