所以我正在检查是否可以使用下面的代码对注册表进行写访问
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放在了捕获中,但我认为我不应该这样做,因为如果我有能力写的话,我会事先检查。
我在这里错过了什么吗?
答案 0 :(得分:1)
您将CAS与Windows访问权限混淆。它们完全不同。 RegistryPermission验证.NET程序是否以足够的信任运行以访问注册表。这超出了基本的Windows访问权限,该权限为用户帐户提供了对注册表项的写入权限。 .NET检查对于不受信任的 sandbox 代码非常有用,例如,您作为插件加载的那种代码。
您的支票不会对RegistryKey.SetValue()执行的现有支票添加任何内容。它已经检查了创建和写入权限。所以你不妨删除它。
检查足够的Windows访问权限是非常痛苦的。您将在RegistrySecurity类的MSDN库文章中找到一些示例代码,您只能将其放入程序中。有关于它的详细文章here,不知道它有多可靠。
通过让Windows执行检查并处理异常情况,这是非常普遍的处理。通过捕获SecurityException。并且通过先发制人确保异常不太可能,因此它确实非常特殊。你几乎肯定需要要求提升UAC。涵盖this answer。