C#获取注册表子项的值

时间:2015-05-16 16:07:41

标签: c# registry

我在注册表中有类似的东西:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MyKeys\Keys1
  > random subkey 1 / value a = 1
  > random subkey 2 / value b = 2
  > random subkey 3 / value c = 3
  > random subkey 4 / value d = 4

随机子密钥x - 随机数(例如{6E7EE186-9G13-50HC-A001-319DA68183A7})

现在我想将所有子键名保存到string []然后将每个值添加到listView:

a | 1
b | 2
c | 3
d | 4

有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:3)

此代码是从特定键

中检索子键+值的示例
    class Key
    {
        public string KeyName { get; set; }
        public List<KeyValuePair<string, object>> Values { get; set; }
    }

    private List<Key> GetSubkeysValue(string path, RegistryHive hive)
    {
        var result = new List<Key>();
        using (var hiveKey = RegistryKey.OpenBaseKey(hive, RegistryView.Default))
        using (var key = hiveKey.OpenSubKey(path))
        {
            var subkeys = key.GetSubKeyNames();

            foreach (var subkey in subkeys)
            {
                var values = GetKeyValue(hiveKey, subkey);
                result.Add(values);
            }
        }
        return result;
    }

    private Key GetKeyValue(RegistryKey hive, string keyName)
    {
        var result = new Key() {KeyName = keyName};
        using (var key = hive.OpenSubKey(keyName))
        {
            foreach (var valueName in key.GetValueNames())
            {
                var val = key.GetValue(valueName);
                var pair = new KeyValuePair<string, object>(valueName, val);
                result.Values.Add(pair);
            }
        }

        return result;
    }

使用您的根路径调用GetKeyValue(问题中为SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ MyKeys \ Keys1) 和本地机器配置单元

备注

有些情况OpenSubKey返回null,在我的示例中,这些情况会抛出NullRefrenceException =&gt;您应该决定OpenSubKey返回null

时会发生什么

您的路径位于local_machine - 软件中,请确保您使用正确的RegistryView

答案 1 :(得分:1)

接受的答案对我不起作用,我必须进行修改。

public class RegistryFuncs
{
    public static List<Key> GetSubkeysValue(string path, RegistryHive hive)
    {
        var result = new List<Key>();
        using (var hiveKey = RegistryKey.OpenBaseKey(hive, RegistryView.Default))
        using (var key = hiveKey.OpenSubKey(path))
        {
            var subkeys = key.GetSubKeyNames();

            foreach (var subkey in subkeys)
            {
                var values = GetKeyValue(hiveKey, path, subkey);
                result.Add(values);
            }
        }
        return result;
    }

    public static Key GetKeyValue(RegistryKey hive, string path, string keyName)
    {
        var result = new Key() { KeyName = keyName };
        var subkey = $@"{path}\{keyName}";
        using (RegistryKey key = Registry.LocalMachine.OpenSubKey(subkey))
        {
            if (key == null) return null;

            foreach (var valueName in key.GetValueNames())
            {
                var val = key.GetValue(valueName);
                var pair = new KeyValuePair<string, object>(valueName, val);
                result.Values.Add(pair);
            }
        }

        return result;
    }
}

public class Key
{
    public string KeyName { get; set; }
    public List<KeyValuePair<string, object>> Values { get; set; }

    public Key()
    {
        Values = new List<KeyValuePair<string, object>>();
    }
}