检查注册表权限而不抛出exception

我有一段这样的代码

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

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

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

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

RegistryPermission.Demand()

并检查一个例外。 所以,这对初始方法没有任何好处。

¿有没有办法检查注册表访问权限,而不是人为抛出或必须检查exception?

编辑:

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

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

编辑:我不确定是否有托管方式,但您可以在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执行了访问检查。 不幸的是,似乎没有可以执行任务的等效托管function。 不建议您在.NET中执行访问检查。 相反,您应该使用基于角色的安全性来为您执行访问检查(这是ReadSD所做的。在ReadSD写入安全描述符之前,它需要检查是否允许您更改安全描述符。它通过以下方式执行此操作:读取安全描述符并调用GenericPrincipal.IsInRole来检查组成员身份。 仅当您的对象设计用于基于角色的安全性时,此方法才有效。 它不适用于安全描述符保护的对象。

如果您需要使用安全描述符(在我们的示例中为注册表项)对对象执行访问检查,则不会使用AccessCheck来执行此操作(即使在Win32中)。 正确的方法是打开注册表项,如果安全描述符拒绝访问,您将获得“拒绝访问”exception。

在简单的访问检查中,您可以在基于角色的命令性安全性的帮助下自行执行访问检查(图38):

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