Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Loop through registry and get all subkeys and the values in RegistryKey in C#

I need to loop through the registry and get all subkeys and the all values.

This it's what I been trying (to get all subkeys only):

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
         {

         }
    }
}

How do I get all the values? I need to do two methods: one that gets all the subkeys and other that gets all the values. I'm only asking the one to get all the values. Thank you.

PS: It's not homework or otherwise related to academics. It's something personal.

like image 517
soulblazer Avatar asked Mar 13 '23 20:03

soulblazer


1 Answers

Once given the RegistryKey, you could easily get the key's ValueNames by Key.GetValueNames() and to get each of the individual key's Value for each ValueName by Key.GetValue(valueName) which will return an object.

Borrowing your code to elaborate, here is how it should be modified to,

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
    }
}
like image 70
Ian Avatar answered Mar 17 '23 00:03

Ian