Как получить шаблон для сообщения журнала событий Windows

Я хочу прочитать архивный файл журнала событий Windows (.evtx), как в этом примере:

using System;
using System.Diagnostics.Eventing.Reader;

public static class Program {
    static void Main(string[] args) {
        using (var reader = new EventLogReader(@"C:\tmp\some-log.evtx", PathType.FilePath)) {
            EventRecord record;
            while ((record = reader.ReadEvent()) != null) {
                // do something with record...
            }
        }
    }
}

У объекта record есть список Properties, который содержит строки замены для события:

foreach (var property in record.Properties) {
    Console.WriteLine(property.Value);
}

Если я открою файл .evtx в средстве просмотра журнала событий, я смогу увидеть полное описание события, которое похоже на сообщение базового шаблона (которое должно поступать из файла ресурсов, связанного с приложением, которое сгенерировало событие) со значениями для заполнители заменены этими значениями:

введите описание изображения здесь

Есть ли способ получить этот «шаблон сообщения» для определенного события?


person Paolo Tedesco    schedule 29.09.2015    source источник


Ответы (2)


Позже я обнаружил, что эти «шаблоны сообщений» доступны для чтения метаданных событий, связанных с определенным поставщиком (который в основном является зарегистрированным источником событий).

Вот пример:

using System;
using System.Diagnostics.Eventing.Reader;
using System.Globalization;

public static class Program {

    static void Main(string[] args) {
        foreach (var providerName in EventLogSession.GlobalSession.GetProviderNames()) {
            DumpMetadata(providerName);
        }
    }

    private static void DumpMetadata(string providerName) {
        try {
            ProviderMetadata providerMetadata = new ProviderMetadata(providerName, EventLogSession.GlobalSession, CultureInfo.InvariantCulture);
            foreach (var eventMetadata in providerMetadata.Events) {
                if (!string.IsNullOrEmpty(eventMetadata.Description)) {
                    Console.WriteLine("{0} ({1}): {2}", eventMetadata.Id, eventMetadata.Version, eventMetadata.Description);
                }
            }
        } catch (EventLogException) {
            Console.WriteLine("Cannot read metadata for provider {0}", providerName);
        } 
    }
}
person Paolo Tedesco    schedule 28.10.2015
comment
Из какого-либо источника знаете ли вы, где эти метаданные сохраняются в Windows? - person Vesper; 27.06.2016
comment
@Vesper Это сохранено в Computer\HKEY_LOCAL_MACHINE\SYSTEM\{controlSet}\Services\EventLog\{eventLogName}\{providerName}. - person Dai; 12.02.2021

Если вы изучаете журнал событий на другом компьютере, а не на том, на котором он был сохранен, тогда у вас не будет преимуществ EventLogSession.GlobalSession.GetProviderNames(), но при условии, что вы сможете найти и смонтировать HKEY_LOCAL_MACHINE куст реестра компьютера (расположенный в файле C:\Windows\System32\config\SYSTEM - да , это файл без расширения) вы можете получить шаблоны событий из этого ключа реестра:

HKEY_LOCAL_MACHINE\SYSTEM\{controlSet}\Services\EventLog\{eventLogName}\{providerName}
  • Где {controlSet} обычно CurrentControlSet, но если вы исследуете машину, которая умерла при загадочных обстоятельствах, вам может потребоваться поискать другие ключи, например ControlSet001.

    • These "control set" names are involved in the "last-known good configuration" boot option, System Restore, and other parts of the Windows boot process. If a computer won't boot correctly Windows will try other variations of configuration, which have their own separate copy of Event Log configuration.
  • Где {eventLogName} - имя журнала, который вы просматриваете. Источник событий регистрируется только для одного журнала назначения.

  • Где {providerName} соответствует значениям в столбце «Источник события» в средстве просмотра журнала событий Windows.

Найдите значение реестра с именем EventMessageFile, которое дает вам путь к Win32 PE (*.exe или *.dll), содержащему строки ресурсов Win32, которые содержат шаблоны сообщений журнала событий - затем вы можете прочитать их, используя стандартные функции ресурсов Win32 или какую-либо другую библиотеку для извлечения Ресурсы Win32.

Обратите внимание, что чтение журналов событий без шаблоны сообщений, извлеченные из EventMessageFile, - это мучительное упражнение.

person Dai    schedule 12.02.2021
comment
На данный момент вопрос довольно старый, но мне очень понравился этот бит обратного проектирования Windows :) - person Paolo Tedesco; 12.02.2021