注册表访问异常问题

时间:2011-08-22 22:26:33

标签: c# .net permissions registry

我目前正在构建一个注册表浏览器,主要是因为我想支持一些更好的搜索操作。就像'找到所有'和正则表达式一样。我面临的一个问题是,一些密钥在打开时会抛出安全异常。我已经尝试使用管理员权限运行应用程序,我的用户帐户也是管理员。我嵌入了一个带有“requireAdministrator”请求权限的清单。我还尝试将ClickOnce安全设置设置为完全信任,这与requireAdministrator不兼容,或者Visual Studio告诉我....似乎没有任何帮助来避免此异常。

我想迭代所有的键。我不想添加/删除密钥。如果用户希望删除密钥并且没有这样做的权限,则会显示错误消息。我只是希望能够拥有无限制的READ访问权限。这可能吗?

FTR:我使用的是Win7 x64并使用Vs2010u,而项目是用.net 4.0中的C#编写的。如果regedit能够读取所有键,即使它不允许您编辑其中的一些键。我们也可以让应用程序做同样的事情似乎是合适的。虽然我发现它非常困难,但在www上似乎没有任何真正的帮助。只有链接链接圈,yay。

[编辑]

以下是读取密钥的代码:

    private void IterateSubKeys(RegistryKeyModel key) {

        var subKeys = key.Key.GetSubKeyNames();
        var values = key.Key.GetValueNames();

        foreach (var valuename in values) {
            try {
                var valueKind = key.Key.GetValueKind(valuename);
                var value = key.Key.GetValue(valuename);

                key.Values.Add(new RegistryValueModel(valuename, value, valueKind));
            }
            catch { }
        }

        foreach (var keyname in subKeys) {
            try {
                var subkey = key.Key.OpenSubKey(
                    keyname, 
                    RegistryKeyPermissionCheck.ReadSubTree, 
                    RegistryRights.ReadKey);

                key.SubKeys.Add(new RegistryKeyModel(subkey));
            }
            catch { Console.WriteLine("Error reading key: {0}", keyname); }
        }
    }

1 个答案:

答案 0 :(得分:2)

这是设计的。有许多安全相关的密钥只能访问系统帐户。您无法使用该帐户。 Regedit也无法读取这些键,它们只是不可见。避免昂贵的异常将需要pinvoke。