- PR -

C# リモートマシンのイベントログ 取得について

投稿者投稿内容
taitai1031
会議室デビュー日: 2005/03/11
投稿数: 8
投稿日時: 2007-08-16 15:26
C#1.1 でリモートマシンのイベントログ取得を行いたいのですが
下記例外が発生してしまい取得できません。
お力をお借りしたいと思います。
よろしくお願いいたします。

{"クエリー実行エラー: <from-entity> を開けません。: イベントログ \"\\\\?\\UNC\\192.168.0.22\\C$\\WINDOWS\\system32\\config\\AppEvent.evt\" を開く際にエラーが発生しました。: プロセスはファイルにアクセスできません。別のプロセスが使用中です。 [プロセスはファイルにアクセスできません。別のプロセスが使用中です。]" }

ソースコード
ILogQuery logQuery = new MSUtil.LogQueryClassClass();
COMEventLogInputContextClassClass evtInput = new MSUtil.COMEventLogInputContextClassClass();
evtInput.iCheckpoint = hostName + ".lpc";

String query = "SELECT * FROM " + this.GetEventLogPath(ipAddress);

ILogRecordset recordSet = logQuery.Execute(query, evtInput);
return recordSet;

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-08-16 21:48
 ILogQuery, MSUtil, MSUtil.LogQueryClassClass, COMEventLogInputContextClassClass, GetEventLogPath, ILogRecordset を、MSDN で検索してみたのですが、どれもヒットしませんでした。これらは、どこの、何というコンポーネントを使用されているのでしょう?

 メッセージを、単純に判断すると、AppEvent.evt というファイルを直接オープンしようとしていますか?それって、無理ですよね?だって、Windows が使っているのですから。
 そうではなく、WMI などで問い合わせをするんじゃないでしょうか?

 それとも、WMI の LogFileEventConsumer をラップしている?そうだとしたら、そっちじゃなく、NTEventLogEventConsumer の方じゃないでしょうか。
taitai1031
会議室デビュー日: 2005/03/11
投稿数: 8
投稿日時: 2007-08-17 09:12
Jittaさんありがとうございます。

> ILogQuery, MSUtil, MSUtil.LogQueryClassClass, COMEventLogInputContextClassClass, GetEventLogPath, ILogRecordset を、MSDN で検索してみたのですが、どれもヒットしませんでした。これらは、どこの、何というコンポーネントを使用されているのでしょう?

LogParserのコンポーネントを利用しています。

> メッセージを、単純に判断すると、AppEvent.evt というファイルを直接オープンしようとしていますか?それって、無理ですよね?だって、Windows が使っているのですから。

僕もそう思わなくもなかったのですが以下を参考にさせていただきました。
iCheckPointを利用したかったので。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32545&forum=7&6

ただ、読み取れるマシンもありました。
同じマシンでも AppEvent.evt はNGでも SysEvent.evt はOKの場合も
ありました。
また、ローカルも読み取れるのですが、UNCで指定するとダメでした。

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-08-17 10:01
引用:

また、ローカルも読み取れるのですが、UNCで指定するとダメでした。



本題とはあまり関係ないと思いますが…

Windows 認証のパススルーが働く場合以外は、共有フォルダに対して事前に接続操作を行わないと駄目です>UNC パス
taitai1031
会議室デビュー日: 2005/03/11
投稿数: 8
投稿日時: 2007-08-17 11:20
引用:

Windows 認証のパススルーが働く場合以外は、共有フォルダに対して事前に接続操作を行わないと駄目です>UNC パス



管理共有可能な環境でやっています。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-08-17 11:56
引用:

管理共有可能な環境でやっています。



共有フォルダに「接続可能である」ことと「エクスプローラなどで自動的に接続される」ことは別です。念のため。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
taitai1031
会議室デビュー日: 2005/03/11
投稿数: 8
投稿日時: 2007-08-17 14:16
引用:

共有フォルダに「接続可能である」ことと「エクスプローラなどで自動的に接続される」ことは別です。念のため。



一応、ソース内で FileExist を仕掛けても通りましたので
環境自体は大丈夫だと思うのですが如何でしょうか。
taitai1031
会議室デビュー日: 2005/03/11
投稿数: 8
投稿日時: 2007-08-17 19:00
なんとか取得出来るようになりました。
(かなり怪しいのですが。)

1、EventLog サービスを無効にして再起動。
2、レジストリで出力先ファイル名を変更。
3、EventLog サービス開始。
  (変更したファイル名のファイルが作成される。)
4、再度 EventLog サービスを無効にして再起動。
5、レジストりで出力先ファイル名を元に戻す。
6、EventLog サービス再起動(不要なファイルは削除)

一度、ファイルを手放すと取得できるようになるみたいです。
ただ、しばらくしたらまた元に戻るのではないか検証が必要ですが・・・
なお、違うファイルに書き込まれるようになったと言うことはありませんでした。
バックアップを元に戻しても内容は同じでしたし。

もう少し検証と調査をしてみます。

スキルアップ/キャリアアップ(JOB@IT)