2014-01-17 23 views
0

所以我检查,看看我是否有到注册表的代码下面检测写访问注册表

try 
{ 
    RegistryPermission perm = new RegistryPermission(RegistryPermissionAccess.Write, networkRegistryPath); 
    perm.Demand(); 
} 
catch (Exception ex) 
{ 
    throw new ArgumentException("Write Access Denied"); 
} 

rk.SetValue("PnPCapabilities", powerOff[0]); 
networkCards.Add(networkRegistryPath, powerOff[0]); 

写访问,如果perm.Demand()失败,我相信它会抛出一个错误但它并不那么我然后尝试写一个值。然后它发生错误无法写入注册表。

我把rk.SetValue放在catch中,但我认为我不应该需要,因为如果我有能力写入,我会事先检查。

我在这里错过了什么吗?

+5

停止检查。写入注册表。如果失败了,你不能写。 –

+0

需求'如果调用堆栈中所有更高的调用者没有被授予当前实例指定的权限,则在运行时强制一个SecurityException.'我不认为这会在您希望的时候总是失败 – Jonesopolis

回答

1

您正在混淆CAS和Windows访问权限。他们完全不同。 RegistryPermission验证.NET程序是否运行足够的信任来访问注册表。这超出了基本的Windows访问权限,它允许用户帐户对注册表项的写入权限。 .NET检查对于沙箱有用,这些代码不可信,例如,您将作为插件加载的类型。

您的检查不会向RegistryKey.SetValue()执行的现有检查添加任何内容。它已经检查了创建和写入权限。所以你不妨将它删除。

检查足够的Windows访问权限是非常痛苦的。您会在MSDN库文章中找到RegistrySecurity类的一些示例代码,但您可以将其放入程序中。有一篇关于它的详细文章here,不知道它有多可靠。

这是相当普遍处理的只是让Windows执行检查和处理特殊情况。通过捕获SecurityException。并通过先发制人确保一个例外不太可能,所以它是真正的例外。你几乎肯定需要请求UAC提升。由this answer覆盖。