Как читать журнал событий Windows без EventMessageFile? - PullRequest
3 голосов
/ 03 марта 2009

У меня есть код, который читает журнал событий 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 ]

1 голос
/ 29 марта 2009

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

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

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

1 голос
/ 03 марта 2009

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

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

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

...