3

Windows イベント ログを読み取るコードがあります。OpenEventLog、ReadEventLog を使用して、イベント ソースとイベント ID を取得します。次に、以下のソースを検索します。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application

キーを使用して、リストされている内容に従って適切な DLL をロードしEventMessageFile、最後に を使用FormatMessageしてイベント文字列をメッセージ DLL コンテンツとマージし、最終的なイベント メッセージ テキストを取得します。これは推奨される方法であり、少し面倒ですが、うまく機能します。

まで...ソースを調べてみると、EventMessageFileではなく、ProvideGuidエントリがあることがわかりました。これは新しい方法のようです (Vista と Windows 2008 で表示されます)。うーん -- メッセージ テキストを検索し、データ文字列をマージするために FormatMessage に渡すものは何もありません

:(

レジストリで GUID を検索すると、他のファイル (HTTP ソースの場合は http.sys) への参照につながりますが、完全なメッセージ テキストを取得することはできません。EvtOpenSessionこれらのAPIを使用する必要がありますか? EVENTLOGRECORD*への呼び出しからReadEventLog、およびサポートされていない Windows 2003 でソフトウェアを実行する必要があるという事実EvtOpenSession(Vista および Windows 2008 でのみ使用可能) があるので、そうしないことを望んでいます。注: Vista の一部のソースには ProviderGUID があり、その他のソースには EventMessageFile があるため、古い方法も引き続き実行できます。

したがって、私が求めているのは、ProviderGuid を見て、完全なイベント ログ メッセージ テキストを表示するために FormatMessage に渡す必要がある DLL を取得する方法です。

ご意見ありがとうございます

4

2 に答える 2

1

イベント ログ エントリの読み取り/展開用の Win32 API があります。

MSDN を参照してください: http://msdn.microsoft.com/en-us/library/aa385780(VS.85).aspx

サービス パックや新しいバージョンは言うまでもなく、パッチに関する問題が見つかる可能性があります。

于 2009-03-03T17:50:51.670 に答える
1

Richard がリンクしている API は、Vista/Server 2K8 で導入された新しいスタイルの Eventing システム (コードネーム Crimson、Manifest Based Providers と呼ばれることもあります) 用です。この新しいシステムの成果物の 1 つは、これらのログを使用するための新しい API です。もう 1 つは、この新しいフレームワークを使用してイベントを生成する特定の EventSources の ProviderGuid キーです。

これらのログを使用するには、後で Windows Vista の関数を使用する必要があると思います。EvtFormatMessage メソッドを使用して文字列をフォーマットできます。これらの API は、「クラシック」プロバイダーによって生成されたイベントも読み取ると思います。

これらのメッセージを .NET アプリから使用している場合は、.NET 3.5 で導入された System.Diagnostics.Eventing.Reader 名前空間の型を使用できます。

于 2009-03-29T09:02:07.323 に答える