有谁知道我可以以编程方式检查(使用C#)我的计划是否能够读/写一个特定的注册表项(具体是:“SOFTWARE \微软\的Windows \ CurrentVersion \ Run中”)?
我问,因为我的程序必须启用或禁用“在启动时运行的行为的选项。 我想,如果当前用户是不允许修改注册表来禁用此选项。 是该键总是允许当前用户写的,或者是有它已被锁定的可能性? 如果是后者,我如何检查呢?
我看到检查注册表权限的几个相互冲突的方式 - 但基本上我不能找到一种方法来检查特定的键之前,我试着去阅读它。 我想访问的关键不是试图访问它,并收到一个异常,而之前执行检查。
任何帮助深表感谢。
汤姆
该RegistryPermission的类管理各地雷吉·基斯的安全权限。 要检查是否可能不得不使用它通过以下方式许可的写访问:
RegistryPermission perm1 = new RegistryPermission(RegistryPermissionAccess.Write, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
然后,您可以使用“需求”的方法在一个try / catch并返回失败(安全异常的认识)。 如果成功你会继续,并执行更新。 虽然这是不太你想要什么,之前的访问权限进行检查,这是确保你有上的按键进行操作之前,你需要的权限接受的方式。 在一个完全结构化的方式,这将等同于:
try
{
RegistryPermission perm1 = new RegistryPermission(RegistryPermissionAccess.Write, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
perm1.Demand();
}
catch (System.Security.SecurityException ex)
{
return;
}
//Do your reg updates here
编辑:什么我在评论中提及的思考,这里是扩展方法许可检查RegistryPermission的类:
using System.Security.Permissions;
using System.Security;
public static class RegistryExtensions
{
public static bool HavePermissionsOnKey(this RegistryPermission reg, RegistryPermissionAccess accessLevel, string key)
{
try
{
RegistryPermission r = new RegistryPermission(accessLevel, key);
r.Demand();
return true;
}
catch (SecurityException)
{
return false;
}
}
public static bool CanWriteKey(this RegistryPermission reg, string key)
{
try
{
RegistryPermission r = new RegistryPermission(RegistryPermissionAccess.Write, key);
r.Demand();
return true;
}
catch (SecurityException)
{
return false;
}
}
public static bool CanReadKey(this RegistryPermission reg, string key)
{
try
{
RegistryPermission r = new RegistryPermission(RegistryPermissionAccess.Read, key);
r.Demand();
return true;
}
catch (SecurityException)
{
return false;
}
}
}
你应该知道的权限一件事是,它们是挥发性的 。 这意味着你可以做你的安全检查上的注册表键,尝试添加你的价值只有在检查通过,然后还因为权限当您进行检查,当你采取行动之间改变的失败 ,并没有足够的访问异常结果。 这是可能的,即使他们是在你的程序中连续的语句。
授予安全权限趋于相对稳定,但机会仍然存在。 这意味着你必须有代码来处理安全异常,如果你有这样做,反正有没有真正从事制造放在第一位检查的任何一点。 相反,把你的时间到让你的异常处理好一点点。
这就是说,“嘘”,以要运行程序在启动时的东西任何应用程序。 YAGNI。
我觉得你最好的选择是只尝试你的价值添加到钥匙,并处理故障摆好通过告知他们没有足够的权限,做到这一点的用户。
如果你正在写某种被设计成总是由管理员运行管理工具,你应该表明,在清单 。 这样,你的应用程序将在启动时(通过UAC提示)提升。
简单的方法是尝试打开与写访问的关键,看看你得到它。 请记住, 关闭后的关键。
bool fWriteAccess;
try {
Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True).Close();
fWriteAccess = True;
} catch (SecurityException) {
fWriteAccess = False;
}
我不知道如何将它与C#,但与Win32中,你可以使用RegGetKeySecurity()
也许有一个C#包装? 否则,使用的P / Invoke。
刚刚尝试打开与写权限的注册表项。
这就是说,别人怎么说是正确的:有没有办法判断的操作会成功,除非你试试吧。 也许someon删除Run项。 也许注册表将超过分配的内存。 可能磁盘故障。
文章来源: How do I check whether a user is allowed to read / write a particular registry key?