我正在尝试检查我是否对注册表中的特定密钥具有写入权限,然后才显示允许用户更改用该密钥写入的某些设置的表单。
为清晰起见,代码已清理
public bool CanWrite()
{
string key = @"HKEY_LOCAL_MACHINE\SOFTWARE\MyHaccpPlan, Inc.\2.0";
try
{
RegistryPermission permission = new RegistryPermission(RegistryPermissionAccess.Write, key);
permission.Demand();
return true;
}
catch(SecurityException)
{
return false;
}
}
我正在使用只具有读访问权限的用户运行应用程序。问题是即使用户没有写访问权,此函数也会返回true。
稍后,像
这样的电话Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\MyHaccpPlan, Inc.\2.0", "Language", "fr-CA");
将失败并显示UnauthorizedAccessException
。
如何在尝试写入之前正确检查注册表权限?
修改
我不希望当前用户能够在那里写。我想使用此注册表项作为标志,应禁用该软件中的功能。但如果用户是管理员,我希望软件允许该功能。目标是网络管理员可以预设设置,用户将无法更改设置。
但除了实际编写并等待它崩溃之外,我想使用.NET中提供的权限系统检查安全性(如果可能的话)。
答案 0 :(得分:1)
您不应该依赖.NET代码访问安全性来管理对注册表的访问控制;如果您对代码进行明确检查,更不用说了。使用该方法,用户仍然可以使用注册表编辑器并绕过所有访问检查。
相反,您应该使用适当的ACL来限制用户可以写入密钥的内容。
如果要在运行时测试是否可以访问密钥,则应尝试打开密钥进行写入,并捕获SecurityException(在这种情况下,运行应用程序的用户无权修改密钥)
答案 1 :(得分:0)
mmm你可以尝试使用像Lutz Roeder的Reflector这样的工具来查看Registry.SetValue方法的内容。
看一下它,似乎用下一行代码来做:
new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand();