質問

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

その他、サービスパックや新しいバージョンはもちろん、パッチの問題を見つける可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top