以编程方式访问注册表时出现问题
本文关键字:问题 注册表 编程 方式 访问 | 更新日期: 2023-09-27 18:24:55
我使用C#以编程方式读取注册表值时遇到问题。我查阅了许多网站并提供帮助,但找不到任何帮助。当我在提升模式下运行VS时,我可以访问和读取注册表,但当我在非提升模式下执行VS时,会遇到问题。最初,我开始使用以下代码
byte[] val = (byte[])Registry.GetValue("HKEY_LOCAL_MACHINE''Software''MyServices''Identity''ASPNET_SETREG", "ValueName", 0);
这在提升模式下运行良好,但在非提升模式下失败。将属性置于功能的顶部
[RegistryPermissionAttribute(SecurityAction.Demand,Unrestricted=true)]
这无济于事。然后尝试
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.LinkDemand, Flags = System.Security.Permissions.SecurityPermissionFlag.AllFlags)]
还是没用。现在我尝试了以下代码。。。
RegistryKey key = Registry.LocalMachine;
RegistrySecurity rs = new RegistrySecurity();
rs = key.GetAccessControl();
string user = "DomainName''Username";
rs.AddAccessRule(new RegistryAccessRule(user,
RegistryRights.ReadKey,
InheritanceFlags.None,
PropagationFlags.None,
AccessControlType.Allow));
key.SetAccessControl(rs);//Exception: "Attempted to perform an unauthorized operation."}
//RegistryKey key2 = key.OpenSubKey("Software''MyServices''Identity''ASPNET_SETREG");
//RegistryKey key2 = key.OpenSubKey("Software''MyServices''Identity''ASPNET_SETREG", false);
//RegistryKey key2 = key.OpenSubKey("Software''MyServices''Identity''ASPNET_SETREG", RegistryKeyPermissionCheck.ReadSubTree);
RegistryKey key2 = key.OpenSubKey("Software''MyServices''Identity''ASPNET_SETREG", RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.ReadPermissions);
评论SetAccessControl并使用任何OpenSubkey选项,我得到异常:"不允许请求的注册表访问。"
我被严重卡住了,无法继续前进。
private RegistryKey keyR = Registry.CurrentUser.OpenSubKey("Software''YourKey",true);
private RegistryKey keyW = Registry.CurrentUser.CreateSubKey("Software''YourKey");
public string version
{
get { return keyR.GetValue("VERSION", "", RegistryValueOptions.DoNotExpandEnvironmentNames).ToString(); }
set { keyW.SetValue("VERSION", value, RegistryValueKind.String); }
}
我以这种方式使用windows注册表。没问题。。。
windows注册表基本上是一个结构化的文件系统,具有键和值的权限。
您没有对...'MyServices'
或更深层次的密钥正确设置权限-您没有权限从您的无特权进程访问这些密钥。
任一:
- 这些密钥应该是任何人都可以读取的,所以您应该更改权限以使它们对每个人都可读。或者-
- 出于充分的原因,这些密钥被有意限制,因此它们不应该被所有人都可读,在这种情况下,您的程序应该始终在提升的状态下运行