如何检查是否允许用户读/写特定的注册表项?

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)

  • 这对我来说不起作用(.NET 2和4.5)因为它总是返回true,即使我显然没有对密钥的写访问权限. (3认同)

Joe*_*orn 7

关于权限你应该知道的一件事是它们是不稳定的.这意味着您可以对注册表项进行安全检查,仅在检查通过时尝试添加您的值,然后仍然因访问异常不足而失败,因为在您进行检查和您对其执行操作时权限发生了变化.结果.即使它们是程序中的连续语句,也可以这样做.

授予的安全权限往往相对稳定,但机会仍然存在.这意味着您必须拥有处理安全例外的代码,如果您必须这样做,那么首先进行检查并没有任何意义.相反,花点时间让你的异常处理程序更好一些.

也就是说,对任何想要在初创公司运行的应用程序都说"嘘".YAGNI.


i_a*_*orf 5

我认为你最好的办法就是尝试将你的价值添加到密钥中,并通过告知用户他们没有足够的权限来妥善处理故障.

如果您正在编写某种旨在始终由管理员运行的管理工具,则应在清单中指明.这样你的应用程序将在启动时提升(通过UAC提示).