EventMessageFileなしでWindowsイベントログを読み取る方法は?
-
03-07-2019 - |
質問
Windowsイベントログを読み取るコードがあります。 OpenEventLog、ReadEventLogを使用して、イベントソースとイベントIDを取得します。次に、
の下でソースを検索しますHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
キー、 EventMessageFile
にリストされている内容に従って適切なDLLをロードし、最後に FormatMessage
を使用してイベント文字列をメッセージDLLコンテンツとマージして、最終イベントメッセージテキスト。これは推奨される方法であり、少し苦痛ですが、うまく機能します。
…ソースを検索すると、 EventMessageFile
ではなく、 ProvideGuid
エントリがあります。これは新しい方法のようです(VistaおよびWindows 2008に表示されます)。 Uggh-メッセージテキストを検索してデータ文字列にマージするためにFormatMessageに渡すものはありません
:(
レジストリでguidを検索すると、他のファイル(HTTPソースの場合はhttp.sys)への参照につながりますが、完全なメッセージテキストを取得することはできません。これらの EvtOpenSession
APIを使用する必要がありますか? ReadEventLog
の呼び出しから EVENTLOGRECORD *
を既に取得していること、およびソフトウェアが EvtOpenSession
はサポートされていません(VistaおよびWindows 2008でのみ使用可能)。注:Vistaの一部のソースにはProviderGUIDがあり、他のソースにはEventMessageFileがあるため、古いメソッドは引き続き実行可能です。
したがって、私が望んでいるのは、ProviderGuidを見て、完全なイベントログメッセージテキストを表示するためにFormatMessageに渡す必要があるDLLを取得する方法です。
入力ありがとうございます
解決
RichardがリンクするAPIは、Vista / Server 2K8で導入された新しいスタイルのイベントシステム(コード名Crimson、マニフェストベースプロバイダーとも呼ばれます)用です。この新しいシステムのアーティファクトの1つは、これらのログを使用する新しいAPIです。もう1つは、この新しいフレームワークを使用してイベントを生成する特定のEventSourceのProviderGuidキーです。
これらのログを使用するには、後でWindows Vistaの機能を使用する必要があります。作業を処理する必要があります。 EvtFormatMessageメソッドを使用して、文字列をフォーマットできます。これらのAPIは" Classic"によって生成されたイベントも読み取ると思います。プロバイダー。
.NETアプリからこれらのメッセージを消費している場合、.NET 3.5で導入されたSystem.Diagnostics.Eventing.Reader名前空間の型を使用できます。
他のヒント
イベントログエントリの読み取り/拡張用のWin32 APIがあります。
MSDNを参照してください: http://msdn.microsoft .com / en-us / library / aa385780(VS.85).aspx
その他、サービスパックや新しいバージョンはもちろん、パッチの問題を見つける可能性があります。