お世話になります。
イベントログの読み込み、表示アプリをつくっていて、2003server、XPなどでは動いていたのですが、
先日2008serverにポーティングしようとおもったら、
RegOpenKeyEx 関数で
"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Security"
のレジストリキーをオープンするところで、エラーが帰ってきてしまいました。
2008serverの場合、レジストリの場所がまったく異なるのでしょうか。
ご存知の方おられましたら、ご教示願います。
イベントログ読み込み
Re:イベントログ読み込み
Windows server 2008 については全く分かりませんが。
"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Security"のキーが存在しないのは確かな事なのですか?
一度GetLastError() にお伺いを立てて見ることをお勧めします。
"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Security"のキーが存在しないのは確かな事なのですか?
一度GetLastError() にお伺いを立てて見ることをお勧めします。
Re:イベントログ読み込み
なぜ,イベントログの読み込みにレジストリが関係するのか解りませんが……。
まずは,
MSDN: Windows Events (Windows)
http://msdn.microsoft.com/en-us/library/aa964766.aspx
の,
MSDN: Event Logging (Windows)
http://msdn.microsoft.com/en-us/library/aa363652.aspx
や
MSDN: Windows Event Log (Windows)
http://msdn.microsoft.com/en-us/library/aa385780.aspx
にあるAPIを使うという正規の方法で,読み込めないかどうかを確認してはどうでしょうか。
まずは,
MSDN: Windows Events (Windows)
http://msdn.microsoft.com/en-us/library/aa964766.aspx
の,
MSDN: Event Logging (Windows)
http://msdn.microsoft.com/en-us/library/aa363652.aspx
や
MSDN: Windows Event Log (Windows)
http://msdn.microsoft.com/en-us/library/aa385780.aspx
にあるAPIを使うという正規の方法で,読み込めないかどうかを確認してはどうでしょうか。
Re:イベントログ読み込み
RegOpenKeyEx関数でエラーが発生したときの詳細な情報はGetLastError関数では得られません。
RegOpenKeyEx関数の戻り値を確認してみてください。
RegOpenKeyEx関数の戻り値を確認してみてください。
Re:イベントログ読み込み
>RegOpenKeyEx関数でエラーが発生したときの詳細な情報はGetLastError関数では得られません。
MSDNを読み返しました。 失礼いたしました。
MSDNを読み返しました。 失礼いたしました。
Re:イベントログ読み込み
勘違いでしたら申し訳ないのですが、
もしや下記サンプルを参考に作成していますか?
http://nienie.com/~masapico/api_sample_ ... g02_c.html
Win2008ではアプリケーションログ、システムログの取得は可能なのですが、
セキュリティのもののみ、メッセージフォーマットが保存されているdllのパスが
入っているキーがみつからないようですね。
本来ならEventMessageFileというキーに登録されているはずなのですが…。
※XPや2003では下記キーのパスが使用可能のようです。
SYSTEM\\CurrentControlSet\\Services\\EventLog\\Security\\Security\\EventMessageFile
何か分かりましたら改めてコメントします。
APIの仕様より、win2008のレジストリキーの仕様を調べたほうがいいかもしれません。
もしや下記サンプルを参考に作成していますか?
http://nienie.com/~masapico/api_sample_ ... g02_c.html
Win2008ではアプリケーションログ、システムログの取得は可能なのですが、
セキュリティのもののみ、メッセージフォーマットが保存されているdllのパスが
入っているキーがみつからないようですね。
本来ならEventMessageFileというキーに登録されているはずなのですが…。
※XPや2003では下記キーのパスが使用可能のようです。
SYSTEM\\CurrentControlSet\\Services\\EventLog\\Security\\Security\\EventMessageFile
何か分かりましたら改めてコメントします。
APIの仕様より、win2008のレジストリキーの仕様を調べたほうがいいかもしれません。
Re:イベントログ読み込み
解決しましたので、詳細です。
まず、イベントログのメッセージフォーマットDLLの場所ですが、
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WINEVT\\Publishers\\"
上記レジストリに存在する{で始まるキーを全てをリストアップします。
各キーの既定キーがEVENTLOGRECORD構造体内のソース名と一致しますので、
それを元に欲しいキーを確定します。
既定キー以外にMessageFileNameというキーがあるのですが、
これの値にメッセージフォーマットDLLへのパスが入っています。
あとはWinXPなどと同様の機構でイベントログのメッセージフォーマットの取得が出来ます。
ただし、vistaやwin2008serverではマイクロソフト特有のバグがあり、
sp1ではセキュリティログのメッセージフォーマット問い合わせが動作しません。
sp2を当てると取得できるようになります。
まず、イベントログのメッセージフォーマットDLLの場所ですが、
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WINEVT\\Publishers\\"
上記レジストリに存在する{で始まるキーを全てをリストアップします。
各キーの既定キーがEVENTLOGRECORD構造体内のソース名と一致しますので、
それを元に欲しいキーを確定します。
既定キー以外にMessageFileNameというキーがあるのですが、
これの値にメッセージフォーマットDLLへのパスが入っています。
あとはWinXPなどと同様の機構でイベントログのメッセージフォーマットの取得が出来ます。
ただし、vistaやwin2008serverではマイクロソフト特有のバグがあり、
sp1ではセキュリティログのメッセージフォーマット問い合わせが動作しません。
sp2を当てると取得できるようになります。