我想要写入Windows注册表中HKEY_CURRENT_USER\Software\appname的内容,但是当我尝试写入该键时,我遇到了权限错误。我已经将以下内容添加到我的程序集中:
[assembly: RegistryPermissionAttribute(SecurityAction.RequestMinimum, Write = @"HKEY_CURRENT_USER\\Software")]
但这并没有解决问题,我还应该做些什么吗?
我想要写入Windows注册表中HKEY_CURRENT_USER\Software\appname的内容,但是当我尝试写入该键时,我遇到了权限错误。我已经将以下内容添加到我的程序集中:
[assembly: RegistryPermissionAttribute(SecurityAction.RequestMinimum, Write = @"HKEY_CURRENT_USER\\Software")]
OpenSubKey(string)
方法时只能获取只读权限。RegistryPermissionAttribute 是 代码访问安全(CAS) 的一部分,这是一个权限系统,用于检查您在 .NET 框架内的权限,这些权限由安全策略定义。有四个安全策略:
前三个在 .NET 配置工具的配置屏幕中进行配置,最后一个在运行时进行配置。
我之所以先解释这个,是因为 RegistryPermissionAttribute 只检查您的 .NET 权限,而不检查操作系统权限。
你可以使用System.Security.AccessControl来检查操作系统权限,但是要获取权限,你可能需要提升或模拟用户。我看不到这里的答案或解决方法。我是在搜寻其他问题时找到了这个问题。
我认为可能需要的一件事是,如果你从 exe 运行,则需要以管理员身份运行。如果你从 VS 运行,则需要确保 VS 以管理员身份运行。如果是这样,VS 窗口标题将显示“(Administrator)”。
确保应用程序使用具有足够权限访问注册表的用户帐户运行。
这对我很有用。已经存在或不存在该密钥都可以。不需要任何特殊的程序集属性。
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);
}
}
}
}
编辑:重新阅读问题后,似乎问题可能是操作系统权限。