イベントIDに関する説明が見つかりませんでした

イベントログを 名前をつけて保存して 別のコンピュータで見ると イベントログの説明に「イベントIDに関する説明が見つかりませんでした。」とか「The description for Event ID 'xxxx' in Source 'YYYY' cannot be found. 」なんていう長ったらしい文章が表示されてしまいます。また 独自のアプリケーションプログラムで イベントログを登録していると 同様なメッセージが表示されることもあります。なぜ このような現象がおきるのか?・・・ここでは イベントログの説明が表示される仕組みについて解説します。

イベントログの説明が表示される仕組み

イベントログの説明は
イベントビューア(イベントログを表示するプログラム)」が
イベントログ データ」を元に
OSの一部」を呼び出して
レジストリ」を参照して
メッセージDLL」を呼び出して
表示用の文字列」を取得して
表示しています。

イベントビューアは Windowsが標準で提供する イベントログを表示、検索するためのプログラムで [スタート]→[管理ツール]→[イベントビューア]で表示できます。

イベントログ データは イベントビューアで [アプリケーション]を右クリックして [プロパティ]をクリックすると 「ログの名前」表示されるEVT形式ファイルとも呼ばれる バイナリ形式のファイル「C:¥WINDOWS¥system32¥config¥AppEvent.Evt」です。 バイナリファイルなので イベントビューアで「ログを開く」でアタッチすると表示はできますが 他のアプリケーションでは見ることはできません。

OSの一部は services.exeや、.NET Frameworkのクラスライブラリです。

レジストリは HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥EventLog¥Application、System、Securityの下に イベントソースと同一のキーがあります。例えば Systemの下の AlerterというWindowsサービスプログラムのキーを見るとREG_EXPAND_SZ(展開可能な文字列値)の「EventMessageFile」というキーがあります。

EventMessageFileには 「%SystemRoot%¥System32¥netmsg.dll」という値が設定されています。これが「メッセージDLL」と呼ばれるものです。つまり イベントソースごとにメッセージDLLというものがあり、イベントIDごとにメッセージが変換されるという仕組みです。

プログラムで、この文字列を取得して WIN32APIのExpandEnvironmentStrings関数を使用して 通常の文字列に変換します。 具体的には 「%SystemRoot%¥System32¥netmsg.dll」が「C:¥WINDOWS¥system32¥netmsg.dll」に変換されます。 変換したものが物理的なメッセージDLLのフルパスなので、そのメッセージDLLを WIN32APIのLoadLibraryEx関数を使用して、メモリ上にロードして、FormatMessage関数を使って イベントIDに対応したメッセージ(イベントログの説明=表示用の文字列)を取得します。

それで そもそもの疑問に立ち戻ると...イベントログが発生したコンピュータには メッセージDLLが登録されているけど、別コンピュータには メッセージDLLがないので きちんとイベントログの説明が表示できない というのが答えです。

サーバーなどの物理的な構成やサーバーアプリケーションがまるっきり同じ構成であれば、他のサーバーで起きたイベントログは きちんと表示できます。サーバー構成が異なっていてもイベントビューアで 「別のコンピュータへ接続」すれば、イベントログが発生しているサーバーには メッセージDLLがあるのできちんと表示できます。



風水吉凶方位 風水吉凶方位 |  奇門遁甲 奇門遁甲 |  金運神社 金運神社 |  仏像 仏像 |  論語 論語 |  般若心経 般若心経 |  二十四節気 二十四節気 |  菜根譚 菜根譚 |  SharePoint活用 SharePoint |  OneNote活用 OneNote |  ICT活用 ICT