循环通过注册表并获取 C# 中 RegistryKey 中的所有子项和值

sou*_*zer 4 c# registry recursion

我需要遍历注册表并获取所有子项和所有值。

这就是我一直在尝试的(仅获取所有子键):

public void OutputRegKey(RegistryKey Key)
{
    foreach (string keyname in Key.GetSubKeyNames())
    {
        try
        {
            using (RegistryKey key2 = Key.OpenSubKey(keyname))
            {
                foreach (string valuename in Key.GetValueNames())
                {
                    comboBox1.Items.Add(valuename);
                    OutputRegKey(key2);
                }
            }
         }
         catch
         {

         }
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何获得所有值?我需要做两种方法:一种获取所有子键,另一种获取所有值。我只是要求一个人获得所有的价值。谢谢你。

PS:这不是家庭作业或与学术有关的其他方面。这是个人的事情。

Ian*_*Ian 7

一旦给出了RegistryKey,你可以很容易地拿到钥匙的ValueNames通过Key.GetValueNames(),并获得每一个单独的按键的的Value每一个ValueNameKey.GetValue(valueName)该会returnobject

借用你的代码来详细说明,这里是它应该如何修改,

private void processValueNames(RegistryKey Key) { //function to process the valueNames for a given key
    string[] valuenames = Key.GetValueNames();
    if (valuenames == null || valuenames.Length <= 0) //has no values
        return;
    foreach (string valuename in valuenames) {
        object obj = Key.GetValue(valuename);
        if (obj != null)
            comboBox1.Items.Add(Key.Name + " " + valuename + " " + obj.ToString()); //assuming the output to be in comboBox1 in string type
    }
}

public void OutputRegKey(RegistryKey Key) {
    try {
        string[] subkeynames = Key.GetSubKeyNames(); //means deeper folder
        if (subkeynames == null || subkeynames.Length <= 0) { //has no more subkey, process
            processValueNames(Key);
            return;
        }
        foreach (string keyname in subkeynames) { //has subkeys, go deeper
            using (RegistryKey key2 = Key.OpenSubKey(keyname))
                OutputRegKey(key2);
        }
        processValueNames(Key); 
    } catch (Exception e) {
        //error, do something
    }
}
Run Code Online (Sandbox Code Playgroud)