打印LocalMachine的整个树内容

时间:2011-10-18 19:44:56

标签: c# .net windows registry

我正在尝试开发一个c#程序,将整个LocalMachine树打印到控制台。到目前为止,我刚刚能够获得HKEY_LOCAL_MACHINE的子键,但没有比那更深的了。我相对肯定我需要在这里使用某种递归来获取子键及其子键的所有内容,依此类推。我只是不确定如何去做。这就是我现在所拥有的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;

namespace PrintLocalMachine
{
    class PrintLocalMachine
    {
        static void Main(string[] args)
        {
            Console.Out.WriteLine(Registry.LocalMachine.Name);
            string[] subkeynames = Registry.LocalMachine.GetSubKeyNames();            

            foreach (string subkey in subkeynames)
            {
                try
                {
                    RegistryKey rk = Registry.LocalMachine.OpenSubKey(subkey);
                    Console.Out.WriteLine(rk.Name);

                    string[] subkeynames2 = rk.GetSubKeyNames();

                    foreach (string s in subkeynames2)
                    {
                        recurse(s, rk);
                    }
                }
                catch (Exception e) { }
            }
        }

        private static void recurse(string sub, RegistryKey rk)
        {
            RegistryKey rk2 = Registry.LocalMachine.OpenSubKey(sub);
            Console.Out.WriteLine(rk2.Name);

            string[] subkeynames3 = rk.GetSubKeyNames();

            foreach(string s2 in subkeynames3){
                recurse(s2, rk2);
            }
        }
    }
}

有人可以解释我应该怎么做吗?我真的需要指向正确的方向,我只是碰到了这个墙。

编辑:我改变了一下并更新了代码;更新的代码挂在HKEY_CURRENT_MACHINE \ SAM上,只是一遍又一遍地打印,直到StackOverflowException

2 个答案:

答案 0 :(得分:2)

除非它自己调用,否则

recurse()不是recursion
将所有代码从main移到recurse()并从main调用recurse()。
您可能还想关闭已打开的子项。

答案 1 :(得分:0)

你是对的。在结构内部有结构的这种问题可以通过递归来解决。你需要做的是写一个递归函数,即一个调用自身直到某个条件满足的函数。在这种情况下,条件是如果一个注册表项至少有一个孩子,我们需要进入该注册表项,我们将继续这样做,直到我们到达一个叶子节点,即没有更多孩子的注册表项。

 private static void Main(string[] args)
    {

        string[] subkeynames = Registry.LocalMachine.GetSubKeyNames();
        Console.Out.WriteLine(Registry.LocalMachine.Name);

        foreach (string subkey in subkeynames)
        {
            try
            {
                //this might raise a security exception
                RegistryKey rk = Registry.LocalMachine.OpenSubKey(subkey);
                recurse(rk);
                rk.Close();
            }
            catch (Exception e)
            {
                Console.Write("Couldnt access key : " + subkey + "\n " + e.ToString());
            }
        }

        Console.ReadKey();
    }

    private static void recurse(RegistryKey rk)
    {
        Console.WriteLine(rk.Name);
        string[] subkeys = rk.GetSubKeyNames();

        if (null != subkeys && subkeys.Count() > 0)
        {
            foreach (var subkey in subkeys)
            {
                try
                {
                    //this might raise a security exception
                    RegistryKey key = rk.OpenSubKey(subkey);
                    recurse(key);
                }
                catch (Exception e)
                {
                    Console.Write("Couldnt access key : " + subkey + "\n " + e.ToString());
                }

            }
        }
    }