Hal*_*Hax 13 c# windows registry permissions
有没有人知道如何以编程方式检查(使用C#)我的程序是否能够读/写特定的注册表项(具体为:"SOFTWARE\Microsoft\Windows\CurrentVersion\Run")?
我问,因为我的程序可以选择启用或禁用"启动时运行"行为.如果不允许当前用户对注册表进行更改,我想禁用此选项.该密钥是否始终允许由当前用户写入,或者是否可能已被锁定?如果是后者,我该如何检查?
我已经看到了几种检查注册表权限的冲突方式 - 但基本上我在尝试阅读之前找不到检查特定密钥的方法.我宁愿在访问密钥之前执行检查,也不想尝试访问它并接收异常.
任何帮助深表感谢.
汤姆
Wol*_*yrd 17
该RegistryPermission的类管理各地雷吉·基斯的安全权限.要检查您是否具有对权限的写入权限,请按以下方式使用它:
RegistryPermission perm1 = new RegistryPermission(RegistryPermissionAccess.Write, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
Run Code Online (Sandbox Code Playgroud)
然后,您将在try/catch中使用"Demand"方法,并在失败时返回(引发安全性异常).成功后,您将继续并执行更新.虽然这不是您想要的,但在访问之前检查权限,这是确保您在操作密钥之前拥有所需权限的可接受方式.以完全结构化的方式,这相当于:
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
Run Code Online (Sandbox Code Playgroud)
编辑:考虑我在评论中提到的内容,这里是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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
关于权限你应该知道的一件事是它们是不稳定的.这意味着您可以对注册表项进行安全检查,仅在检查通过时尝试添加您的值,然后仍然因访问异常不足而失败,因为在您进行检查和您对其执行操作时权限发生了变化.结果.即使它们是程序中的连续语句,也可以这样做.
授予的安全权限往往相对稳定,但机会仍然存在.这意味着您必须拥有处理安全例外的代码,如果您必须这样做,那么首先进行检查并没有任何意义.相反,花点时间让你的异常处理程序更好一些.
也就是说,对任何想要在初创公司运行的应用程序都说"嘘".YAGNI.
| 归档时间: |
|
| 查看次数: |
10856 次 |
| 最近记录: |