Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Существуют API-интерфейсы Win32 для чтения/расширения записей журнала событий.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top