C# 打印LocalMachine的整个树内容

C# 打印LocalMachine的整个树内容,c#,.net,windows,registry,C#,.net,Windows,Registry,我正试图开发一个c程序,将整个LocalMachine树打印到控制台。到目前为止,我刚刚能够得到HKEY_LOCAL_机器的子键,但没有比这更深入的了。我比较确定我需要在这里使用某种递归来获取子键及其子键的所有内容,等等。我只是不知道该怎么办。以下是我目前掌握的情况: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Win32; names

我正试图开发一个c程序,将整个LocalMachine树打印到控制台。到目前为止,我刚刚能够得到HKEY_LOCAL_机器的子键,但没有比这更深入的了。我比较确定我需要在这里使用某种递归来获取子键及其子键的所有内容,等等。我只是不知道该怎么办。以下是我目前掌握的情况:

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

recurse()调用自身,否则它将无法运行
将所有代码从main移到recurse()并从main调用recurse()

您可能还想关闭打开的子键。

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

 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());
                }

            }
        }
    }

为什么你不能进入注册表编辑器,点击HKEY_LOCAL_机器,转到文件,然后点击导出
.reg
文件只是文本文件,您可能会取下该文件中的内容并使用它。基本上,不要重新发明轮子。应该添加一个家庭作业标签。对不起,这是一个课程作业。我需要通过一个C#程序来实现这一点。除非重新调用,否则捕获
异常e
是个坏主意。捕获被抛出的特定异常类型。这似乎有助于我使其正常工作,但无论出于何种原因,它只打印出HKEY_CURRENT_MACHINE\System\Subkey。也许打印需要很长时间,以至于它还没有打印到HKEY_LOCAL_MACHINE中的任何其他子键,但它不应该先打印BCD00000000的内容吗?我的显然不允许访问BCD。它被“无法访问密钥:”部分捕获。然后它继续打印软件。所以我想这是特定于机器的东西。如果代码有效,您应该将其标记为答案