如何在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); } } } }
编辑:重新阅读问题后,似乎问题可能是操作系统权限。
- Owin重启后,SignalR客户端重新连接,但未发布消息
- 在C#中使用正则表达式解析文本文件的多个部分
- C#如何强制本地化文化进入测试项目的en-US
- MemoryStream更换?
- 将ContentControl绑定到UserControl,并重用相同的实例
- 如何在Silverlight / C#中访问ListBox控件的ScrollViewer元素?
- .NET 4.5中未观察到的任务exception仍会导致应用程序崩溃
- AppDomain.CurrentDomain.UnhandledException未被调用
- 通过Xml文件配置log4net TextBoxAppender(自定义appender)