2011-10-18 46 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()。
您可能還想關閉打開的子項。