Как читать журнал событий Windows без EventMessageFile?

У меня есть код, который читает журнал событий Windows. Он использует OpenEventLog, ReadEventLog и получает источник события и идентификатор события. Затем он ищет источник под

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application

ключ, загружает соответствующие библиотеки DLL в соответствии с тем, что указано в EventMessageFile и, наконец, использует FormatMessage объединить строки события с содержимым DLL сообщения, чтобы получить окончательный текст сообщения о событии. Это рекомендуемый способ, и хотя это немного больно, он прекрасно работает.

Пока... Я иду искать источник и обнаруживаю, что у него нет EventMessageFile, а скорее ProvideGuid запись. Кажется, это новый способ (они появляются в Vista и Windows 2008). Тьфу - нечего передавать в FormatMessage для поиска текста сообщения и объединения строк данных

:(

Поиск в реестре guid приводит к ссылкам на другие файлы (http.sys в случае источника HTTP), но я никогда не могу получить полный текст сообщения. Должен ли я использовать эти EvtOpenSession API-интерфейсы? Я надеюсь, что нет, так как у меня уже есть EVENTLOGRECORD* от звонка до ReadEventLogи тот факт, что программное обеспечение должно работать на Windows 2003, где EvtOpenSession не поддерживается (доступно только в Vista и Windows 2008). ПРИМЕЧАНИЕ. Некоторые источники в Vista имеют ProviderGUID, а другие - EventMessageFile, поэтому старый метод все еще жизнеспособен.

Так что мне нужен способ взглянуть на ProviderGuid и получить DLL, которую нужно передать в FormatMessage для отображения полного текста сообщения журнала событий.

Спасибо за любой вклад

2 ответа

Решение

API, на которые ссылается Ричард, предназначены для новой системы событий Eventing (с кодовым названием Crimson, иногда называемой провайдерами на основе манифеста), представленной в Vista/Server 2K8. Одним из артефактов этой новой системы являются новые API для использования этих журналов, другим является ключ ProviderGuid для определенных источников событий, которые генерируют события с использованием этой новой инфраструктуры.

Я думаю, что вы должны использовать функции в Windows Vista позже, чтобы использовать эти журналы, он должен справиться с работой за вас. Вы можете использовать метод EvtFormatMessage для форматирования строк. Я верю, что эти API также будут читать события, произведенные провайдерами "Классик".

Если вы используете эти сообщения из приложения.NET, вы можете использовать типы в пространстве имен System.Diagnostics.Eventing.Reader, представленном в.NET 3.5.

Есть Win32 API для чтения / расширения записей журнала событий.

См. MSDN: http://msdn.microsoft.com/en-us/library/aa385780(VS.85).aspx

Что-нибудь еще, и вы, вероятно, найдете проблемы с исправлениями, не говоря уже о пакетах обновления или новых версиях.

Другие вопросы по тегам