2011-10-18 43 views
0

我想开发一个C#程序来将整个LocalMachine树打印到控制台。到目前为止,我已经能够获得HKEY_LOCAL_MACHINE的子键,但没有比这更深。我相对确定我需要在这里使用某种递归来获取子键及其子键的所有内容,等等。我只是不确定如何去做。这是我现在得到的:打印LocalMachine的整个树内容

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

+0

为什么不能进入注册表编辑器,单击HKEY_LOCAL_MACHINE,转到文件,然后单击导出? '.reg'文件只是文本文件,你可能需要拿出那个文件中的内容并改为使用它。基本上,不要重新发明轮子。 – qJake

+0

应该添加了作业标签抱歉,这是一个课程作业。我需要通过C#程序来做到这一点。 –

+0

除非你重新抛出,否则赶上'Exception e'是个坏主意。捕获抛出的特定异常类型。 –

回答

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

      } 
     } 
    } 
+0

这似乎帮助我使它工作,但它只是出于任何原因打印出HKEY_CURRENT_MACHINE \ System \子项。 –

+0

对我来说工作正常.. –

+0

也许它只是需要很长时间来打印它还没有HKEY_LOCAL_MACHINE中的任何其他子项,但它不应该首先打印BCD00000000的内容? –

2

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