RegistryPermission如何工作?

时间:2009-08-31 18:47:08

标签: c# security registry

我正在尝试检查我是否对注册表中的特定密钥具有写入权限,然后才显示允许用户更改用该密钥写入的某些设置的表单。

为清晰起见,

代码已清理

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中提供的权限系统检查安全性(如果可能的话)。

2 个答案:

答案 0 :(得分:1)

您不应该依赖.NET代码访问安全性来管理对注册表的访问控制;如果您对代码进行明确检查,更不用说了。使用该方法,用户仍然可以使用注册表编辑器并绕过所有访问检查。

相反,您应该使用适当的ACL来限制用户可以写入密钥的内容。

如果要在运行时测试是否可以访问密钥,则应尝试打开密钥进行写入,并捕获SecurityException(在这种情况下,运行应用程序的用户无权修改密钥)

答案 1 :(得分:0)

mmm你可以尝试使用像Lutz Roeder的Reflector这样的工具来查看Registry.SetValue方法的内容。

看一下它,似乎用下一行代码来做:

new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand();