检查注册表权限而不抛出异常

时间:2009-09-16 08:53:32

标签: c# .net exception registry

我有一段像这样的代码

try
{
    RegistryKey regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\xxxx\\yyyyy");
    // more code
}
catch
{
}

try { RegistryKey regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\xxxx\\yyyyy"); // more code } catch { }

我不喜欢使用空的catch块。但是,它很有用,因为如果用户没有访问注册表的权限,则不应该执行任何操作。

这段代码被多次调用,除了不好的做法之外,我认为它的性能很差。

我一直在寻找一种方法来检查注册表权限,然后再尝试访问它,但是我发现这样做的唯一方法就是检查

的异常

并检查异常。所以,这对初始方法没有任何好处。

¿有没有办法检查注册表访问权限,而无需人为抛出或必须检查异常?

编辑:

好吧,看起来.NET首选的方法是尝试访问资源并检查异常。 Yannick指出的文章显示了处理Windows安全模型,手动查找所需访问权限的复杂程度。 所以,我要做的是稍微重新设计这个代码,这样它只检查一次访问(捕获异常)并保留该信息,而不是不断地抛出异常。 这样做的缺点是,如果用户“动态”更改安全设置,代码将继续拒绝访问注册表。但是,如果没有一种简单而干净的检查访问方式,这是首选。

1 个答案:

答案 0 :(得分:2)

由于您正在创建新密钥,因此您不应该只检查父级的权限吗?

编辑:我不确定是否有托管方式,但您可以在Stdprov.dll中尝试CheckAccess():http://msdn.microsoft.com/en-us/library/aa384911%28VS.85%29.aspx

Edit2:您是否尝试过http://msdn.microsoft.com/en-us/library/1w66447a.aspx

Edit3:

  

26).NET中的访问检查

     

在第2部分中,我们进行了表演   使用Win32进行访问检查   AccessCheck API。不幸的是,那里   似乎并不等同   可以执行的托管功能   任务。不建议你这样做   在.NET中执行访问检查。   相反,你应该利用   基于角色的安全性来执行   访问检查(这是什么   ReadSD可以。在ReadSD写入之前   安全描述符,需要检查   如果你被允许改变   安全描述符。它通过这样做   阅读安全描述符和   调用GenericPrincipal.IsInRole   检查组成员资格)。这只是   适用于您的对象的设计   基于角色的安全性。这是行不通的   由安全保护的对象   描述符。

     

如果您需要执行访问检查   在具有安全性的对象上   描述符(在我们的例子中是注册表项),   你不会使用AccessCheck这样做   (即使在Win32中)。正确的方法是   打开注册表项,如果   安全描述符拒绝访问,   你会得到一个“访问被拒绝”   异常。

     

在简单的访问检查中,您可能是   能够执行访问检查   你自己的帮助   必要的基于角色的安全性(图   38):

http://www.codeproject.com/KB/system/accessctrl3.aspx

相关问题