检查对注册表的写入权限

时间:2014-01-17 20:28:06

标签: c#

所以我正在检查是否可以使用下面的代码对注册表进行写访问

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放在了捕获中,但我认为我不应该这样做,因为如果我有能力写的话,我会事先检查。

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您将CAS与Windows访问权限混淆。它们完全不同。 RegistryPermission验证.NET程序是否以足够的信任运行以访问注册表。这超出了基本的Windows访问权限,该权限为用户帐户提供了对注册表项的写入权限。 .NET检查对于不受信任的 sandbox 代码非常有用,例如,您作为插件加载的那种代码。

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

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

通过让Windows执行检查并处理异常情况,这是非常普遍的处理。通过捕获SecurityException。并且通过先发制人确保异常不太可能,因此它确实非常特殊。你几乎肯定需要要求提升UAC。涵盖this answer

相关问题