- PR -

クライアントのイベントログ取得について

1
投稿者投稿内容
ゆいたん
ベテラン
会議室デビュー日: 2004/08/26
投稿数: 91
投稿日時: 2006-08-02 17:23
クライアントのイベントログ取得についてご質問させていただきます。

【開発環境】
VS2005 C#

【実行対象】
Windows2000、WindowsXP

【やりたいこと】
クライアントのイベントログを効率的に収集したい。

【やったこと】
以下のようなコードを記述して、イベントログを取得できています。
現在はリストボックス(lstResults)に出力していますが、
最終的にはデータベースもしくはテキストに出力します。
コード:
try
{
    remoteEventLogs = EventLog.GetEventLogs(hostName);
    lstResults.Items.Insert(0, "Number of logs on computer: " + remoteEventLogs.Length);
    foreach (EventLog remoteEventLog in remoteEventLogs)
    {
        lstResults.Items.Insert(0, "Log: " + remoteEventLog.Log);
        foreach (EventLogEntry remoteEventLogEntry in remoteEventLog.Entries)
        {
            lstResults.Items.Insert(0, remoteEventLogEntry.Index + ":" + remoteEventLogEntry.Message);
            Application.DoEvents();
        }
        remoteEventLog.Clear();
    }
}
catch (Exception ex)
{
    lstResults.Items.Insert(0, ex.Message);
}


最初はTimeGeneratedプロパティなどを収集側にスタックして
その時間以降のログを取得するような仕組みを考えていましたが、
結局、総ナメして出力だけを抑止するしかないらしく、
EventLogオブジェクトのClearメソッドを使用し、前回取得した
ログより後発のログだけを取得するようにしました。
ただ、この方法だと、クライアント側でイベントログを見ると
空になってしまい、クライアントでログを追えません。
# まぁ、収集したログを見ればいいのですが。。。

【質問】
1.他にどんな手法が考えられますでしょうか?
# 抽象的な質問ですみません。
# 例えばWMIとかがもうひとつのアプローチかなと思っています。
2.販売されているソフトで要件を満たしそうな製品はないでしょうか。

よろしくお願いいたします。

かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2006-08-02 17:54
http://www.microsoft.com/japan/technet/scriptcenter/tools/logparser/default.mspx
こんなんは使えないかい?
私は、コマンドライン版のほうしか使ったことないけど。
ゆいたん
ベテラン
会議室デビュー日: 2004/08/26
投稿数: 91
投稿日時: 2006-08-03 11:51
かめたろさんありがとうございました。
# 他の用途にもすごく使えるかも

HELPに記述されているもののほとんどパクリですが
下記のコードを実行し、ログが取得できることを確認しました。

コード:
using LogQuery = Interop.MSUtil.LogQueryClassClass;
using EventLogInputFormat = Interop.MSUtil.COMEventLogInputContextClassClass;
using LogRecordSet = Interop.MSUtil.ILogRecordset;
try
{
    LogQuery oLogQuery = new LogQuery();
    EventLogInputFormat oEVTInputFormat = new EventLogInputFormat();
    String strQuery = @"SELECT * FROM '\\\\" + hostName + @"\\System'";
    LogRecordSet oRecordSet = oLogQuery.Execute(strQuery, oEVTInputFormat);

    for (; !oRecordSet.atEnd(); oRecordSet.moveNext())
    {
        lstResults.Items.Insert(0, oRecordSet.getRecord().toNativeString(","));
    }

    oRecordSet.close();
}
catch (Exception ex)
{
    lstResults.Items.Insert(0, "Unexpected error: " + ex.Message);
}



あとは、iCheckPointパラメータを攻略すれば、なんとかなるかなと思っています。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2006-08-03 12:31
私もリモートコンピュータのイベントログ取得で頭を悩ませています。

リモートコンピュータのみに存在するイベントソースのメッセージは取得できていますか? (つまりログ収集を実行しているローカルコンピュータにイベントメッセージファイルが存在していない場合)

たとえば、リモートコンピュータに イベントソース Hoge でログを書き込んでいた場合、ローカルコンピュータにも同じイベントソース Hoge が定義されていないとメッセージを取得できないと思います。少なくとも、私が使用している ReadEventLog() + FormatMessage() ではできません。

この問題を解決するために・・・

(1) 対象リモートコンピュータのイベントソースに対応するイベントメッセージファイルから Message Table リソースだけを抽出して、ローカルコンピュータにコピーしておく。リモートコンピュータから集めたイベントメッセージファイルを使用して FormatMessage() をおこなう。

もしくは

(2) イベントログの収集は各々のコンピュータでおこない、サーバーに収集したログを送信する。

のいずれかを考えています。なにか リモートコンピュータのイベントログを完全に再現できる(運用が)簡単な方法はないものでしょうか?
ゆいたん
ベテラン
会議室デビュー日: 2004/08/26
投稿数: 91
投稿日時: 2006-08-03 16:10
未記入さんこんにちは。

引用:

リモートコンピュータのみに存在するイベントソースのメッセージは取得できていますか?


メッセージとはイベントビュアから見たときの説明でしょうか?
前述の手法だと取得できています。例えば、XPからActiveDirectoryなどに
いった場合、DNSなどの説明は見れます。

引用:

リモートコンピュータのイベントログを完全に再現できる(運用が)簡単な方法はないものでしょうか?


私の場合はイベントログをイベントビュアでみれる形に復元する必要はなく
データベースなどにストアしてSQLで見に行くというゴールなので、
お役に立てそうにありません。

---------------

iCheckPointの実装ですが、次の一文を加えたところ一応は動いているようです。
コード:
oEVTInputFormat.iCheckpoint = hostName + ".lpc";


ただ、手動でログを削除された場合の挙動がちょっとおかしい気がします。
ヘルプの例がテキストファイルを4つ対象にして行っている物が載っていて
行数が減少した場合は自動的に検知するというような説明なのですが、
その通りに動いていないような気がします。もう少し調査してみます。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2006-08-03 17:29
引用:
メッセージとはイベントビュアから見たときの説明でしょうか? 前述の手法だと取得できています。例えば、XPからActiveDirectoryなどにいった場合、DNSなどの説明は見れます。


はい、イベントビューアの「説明」です。イベントビューアの場合は、イベントメッセージファイルが存在していないと、以下のようなメッセージが出ます。

引用:
イベント ID (0) (ソース XXXXXX 内) に関する説明が見つかりませんでした。リモート コンピュータからメッセージを表示するために必要なレジストリ情報またはメッセージ DLL ファイルがローカル コンピュータにない可能性があります。この説明を取得するために /AUXSOURCE= フラグを使用することができる可能性があります。詳細については、ヘルプとサポートを参照してください。次の情報はイベントの一部です: XXXXXXXXX



イベントログ自体には、ID とパラメータしか保存されていないので、メッセージを復元するためにはイベントメッセージファイルが必要なはずなんですが・・・。LogParser を使う方法だとリモートコンピュータのイベントメッセージファイルまで読み取っているということなのでしょうか。それはそれでセキュリティ上問題になりそうな気がします・・・。

[ メッセージ編集済み 編集者: 未記入 編集日時 2006-08-03 17:34 ]
ゆいたん
ベテラン
会議室デビュー日: 2004/08/26
投稿数: 91
投稿日時: 2006-08-03 17:57
引用:

イベントログ自体には、ID とパラメータしか保存されていないので、メッセージを復元するためにはイベントメッセージファイルが必要なはずなんですが・・・。



もしかして、AdminPackが入っているとこのイベントメッセージファイルが
入るとかですと、私のマシンからやった場合はぜんぜん検証になってないかも
しれません。

ちなみに、コンピュータの管理からリモートのイベントログを開いた場合は
どうなってしまうのでしょうか?ローカルにイベントメッセージファイルが
ないとだめなのでしょうか?
経験上、見れなかったことがないのですが、見れないのでしょうかね。。。
1

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