Как читать журнал событий 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
Что-нибудь еще, и вы, вероятно, найдете проблемы с исправлениями, не говоря уже о пакетах обновления или новых версиях.