2009-08-31 97 views
1

我想检查我是否有显示的形式,允许用户更改都写在关键的一些设置之前,在注册表中特定键的写访问。RegistryPermission是如何工作的?

码消毒为清楚起见

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提供的,如果这是可能的权限系统的安全性。

回答

1

你不应该依赖于.NET代码访问安全管理访问控制到注册表中;更别说应该在代码中进行明确的检查了。用这种方法,用户仍然可以使用注册表编辑器并绕过所有的访问检查。

相反,你应该使用正确的ACL来限制哪些用户可以写入密钥。

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

+0

我想我很难解释。根据客户端(例如大学)的不同,网络管理员将在该位置创建密钥,并使用该注册表中的ACL限制访问权限,以确保学生对该密钥具有只读访问权限。对于其他类型的设置,用户将在CURRENT_USER中写入自己的设置,除非该设置在LOCAL_MACHINE中被覆盖。 – 2009-08-31 22:26:59

+0

但是,这就是我所做的,我使用OpenSubKey和写权限,并且完全删除了RegistryPermission。我会将这个答案标记为已接受,因为这是我所做的。 – 2009-08-31 22:28:41

0

嗯,你可以尝试使用像卢茨Roeder的反射器的工具用于查看Registry.SetValue方法的内容。

望了一下它,它似乎与下一行代码做到这一点:

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

此检查,如果关键是遥控钥匙只能制造。 – 2009-08-31 19:10:35