C # программа, которая выводит все дерево реестра HKLM на консоль? - PullRequest
1 голос
/ 23 августа 2010

Я пытаюсь написать простое консольное приложение, которое выводит содержимое HKLM на консоль.Вывод должен выглядеть примерно так:

HKEY_LOCAL_MACHINE  
HKEY_LOCAL_MACHINE\BCD00000000
  HKEY_LOCAL_MACHINE\BCD00000000\Description
    KeyName: BCD00000000
    System: 1
    TreatAsSystem: 1
    GuidCache: System.Byte[]
  HKEY_LOCAL_MACHINE\BCD00000000\Objects
    HKEY_LOCAL_MACHINE\BCD00000000\Objects\{0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9}
      HKEY_LOCAL_MACHINE\BCD00000000\Objects\{0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9}\Description
        Type: 537919488
      HKEY_LOCAL_MACHINE\BCD00000000\Objects\{0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9}\Elements
        HKEY_LOCAL_MACHINE\BCD00000000\Objects\{0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9}\Elements\16000020
          Element: System.Byte[]

Мне не повезло, и я нашел способ сделать этоЛюбая помощь будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 23 августа 2010

cHao - самый безопасный подход к вашему вопросу.Между тем мне было скучно в эту воскресную ночь и что-то написал.Просто измените Console.WriteLine или добавьте несколько других Console.WriteLine в соответствии со своими потребностями, независимо от того, что вам нужно.

class Program
{
    static void Main(string[] args)
    {
        Registry.CurrentUser.GetSubKeyNames()
            .Select(x => Registry.CurrentUser.OpenSubKey(x))
            .Traverse(key =>
            {
                if (key != null)
                {
                    // You will most likely hit some security exception
                    return key.GetSubKeyNames().Select(subKey => key.OpenSubKey(subKey));
                }

                return null;
            })
            .ForEach(key =>
            {
                key.GetValueNames()
                    .ForEach(valueName => Console.WriteLine("{0}\\{1}:{2} ({3})", key, valueName, key.GetValue(valueName), key.GetValueKind(valueName)));
            });

        Console.ReadLine();
    }
}

public static class Extensions
{
    public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> fnRecurse)
    {
        foreach (T item in source)
        {
            yield return item;

            IEnumerable<T> seqRecurse = fnRecurse(item);

            if (seqRecurse != null)
            {
                foreach (T itemRecurse in Traverse(seqRecurse, fnRecurse))
                {
                    yield return itemRecurse;
                }
            }
        }
    }

    public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
    {
        foreach (var item in source)
        {
            action(item);
        }
    }
}
2 голосов
/ 23 августа 2010

Вы знаете, что уже есть приложение, которое создает дамп содержимого реестра, верно?

REG EXPORT HKLM hklm.reg

Самое интересное, что он экспортирует ключи в текстовом формате, но этот текстовый файл можно импортировать с помощью REG или редактора реестра.

1 голос
/ 23 августа 2010

спасибо за ответ Pierre-Alain Vigeant, мне нравится ваше решение. по большей части это работало с несколькими незначительными изменениями для форматирования текста, но я все еще не мог справиться с создаваемым исключением безопасности. Оказывается, linq не так хорош для этого, потому что он делает много закулисных вещей. Следующее решение является основной идеей, как это сделать

class Program
{
    static void Main(string[] args)
    {
        RegistryKey key = Registry.LocalMachine;

        Traverse(key, 0);

        key.Close();
        Console.Read();

    }

    private static void Traverse(RegistryKey key, int indent)
    {
        Console.WriteLine(key.Name);
        string[] names = key.GetSubKeyNames();


        foreach (var subkeyname in names)
        {

            try
            {
                string[] valnames = key.GetValueNames();
                foreach (string valname in valnames)
                {
                    Console.WriteLine(returnIndentions(indent)+valname + ":" + key.GetValue(valname));

                }
                Traverse(key.OpenSubKey(subkeyname),indent++);
            }
            catch { 
            //do nothing
            }
        }
    }

    private static string returnIndentions(int indent)
    {
        string indentions = "";
        for (int i = 0; i < indent; i++) {
            indentions += " ";
        }
        return indentions;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...