C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

イベントログ Xpathでフィルタ

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■86409 / inTopicNo.1)  イベントログ Xpathでフィルタ
  
□投稿者/ あざ (1回)-(2018/01/26(Fri) 14:48:19)

分類:[C#] 

2018/01/26(Fri) 18:24:22 編集(投稿者)
2018/01/26(Fri) 18:24:19 編集(投稿者)

お世話になります、
勉強していて、解決できないため質問いたします。
当方初心者ですので、足りていない情報などあるかもしれません。

【やりたいこと】
イベントログを取得して、XMLファイルの中身を参照してデータのフィルターしDataGridViewに表示する

管理ツールのイベントビューアーを開いて頂き、
操作>現在のログをフィルター>XMLのタブを押した後、手動でクエリを編集するに【XMLファイル】を入れた結果が求めているものになります。

現在
イベントのログが取れているのみで、XMLのフィルターをどう使っていけばいいかわからない状況です。


【環境】
.net 2.0
C#


【XMLファイル】
<?xml version="1.0" encoding="utf-8" ?>
<QueryList>
<Query Id="0" Path="Application">
<Select Path="Application">*[System[(Level=1 or Level=4 or Level=0) and (EventID=903) and TimeCreated[timediff(@SystemTime) &lt;= 43200000]]]</Select>
</Query>
</QueryList>

【イベント取得箇所】
dataGridView1.Columns.Clear();
try
{
System.Diagnostics.EventLog evLog = new System.Diagnostics.EventLog("Application");
bool checker = new bool();
int iCnt = evLog.Entries.Count;

DataSet ds = new DataSet();
// ds.ReadXml(FILE_PATH);
DataTable dt = ds.Tables.Add("Computer");
DataRow dr;


//DateTime値に変換する文字列
string s1 = dateTimePicker1.Text;
//文字列をDateTime値に変換する
DateTime dt1 = DateTime.Parse(s1);
//結果を表示する
Console.WriteLine(dt1);

dt.Columns.Add("レベル");
dt.Columns.Add("日付と時刻");
dt.Columns.Add("ソース");
dt.Columns.Add("イベントID");
dt.Columns.Add("タスクのカテゴリ");
dt.Columns.Add("メッセージ");
dt.Columns.Add("PC名");
dt.Columns.Add("ユーザー");

for (int i = iCnt - 1; i >= 0; i--)
{
if (evLog.Entries[i].TimeWritten <= dt1)
{
break;
}
else
{
if (checker == true)
{
dr = dt.NewRow();
GritValues(dr, dt, evLog, i);
dt.Rows.Add(dr);

}
else
{
continue;
}
}
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "Computer";

}
//datagridの列などの調整
Gridview();

}
catch
{
return;
}

以上です、よろしくお願いします。
引用返信 編集キー/
■86421 / inTopicNo.2)  Re[1]: イベントログ Xpathでフィルタ
□投稿者/ WebSurfer (1417回)-(2018/01/26(Fri) 17:56:28)
No86409 (あざ さん) に返信

どういう結果を期待したが、実際の結果は期待とどう異なるか、何を解決できない
のかなどの具体的なことが質問文からは読めませんでした。

そのあたりを説明していただけませんか。(コードを読むなり動かしてみれば分か
るとは言わないでくださいね)
引用返信 編集キー/
■86422 / inTopicNo.3)  Re[2]: イベントログ Xpathでフィルタ
□投稿者/ あざ (2回)-(2018/01/26(Fri) 18:20:35)
No86421 (WebSurfer さん) に返信

こんばんは、説明不足で申し訳ございません。

管理ツールのイベントビューアーを開いて頂き、
操作>現在のログをフィルター>XMLのタブを押した後、手動でクエリを編集するに【XMLファイル】を入れた結果が求めているものになります。

現在
イベントのログが取れているのみで、XMLのフィルターをどう使っていけばいいかわからない状況です。

ご教授よろしくお願いします。
引用返信 編集キー/
■86423 / inTopicNo.4)  Re[1]: イベントログ Xpathでフィルタ
□投稿者/ 魔界の仮面弁士 (1555回)-(2018/01/26(Fri) 18:40:33)
No86409 (あざ さん) に返信
> イベントログを取得して、XMLファイルの中身を参照してデータのフィルターしDataGridViewに表示する
XML の記述は「Level」や「EventID」なのに
DataTable の記述は「レベル」や「イベントID」なので
統一されていないですね…。逐次変換することになりそう。


> イベントログを取得して、XMLファイルの中身を参照してデータのフィルターしDataGridViewに表示する

(案1) データ全件を dt.WriteXml で XML 化してから、フィルターを文字列解析して自前でフィルター処理

(案2) XPath 表記にあわせた形式で、イベントログの内容を XmlDocument に加工しておき、
 SelectNodes でフィルター処理したものを DataTable に詰めなおす

(案3) PowerShell の Get-WinEvent を経由させる


> bool checker = new bool();
bool は構造体なので、new する必要はありません。

そして上記は結局のところ
 bool checker = default(bool);
あるいは
 bool checker = false;
と同義です。



> //DateTime値に変換する文字列
> string s1 = dateTimePicker1.Text;
> //文字列をDateTime値に変換する
> DateTime dt1 = DateTime.Parse(s1);

DateTimePicker のフォーマット指定にもよりますが、
文字列型を経由させてパースしなおすのではなく、

 DateTime dt1 = dateTimePicker1.Value.Date;

などのように、日付型のまま取り扱うべきかと。


> GritValues(dr, dt, evLog, i);

grit → 砂粒、気概
grid → 格子、碁盤目

この場合、dr と dt の 2 つを一緒に渡す必要はないと思います。
dr.Table を参照すれば、dt のインスタンスを取得できますので。
引用返信 編集キー/
■86433 / inTopicNo.5)  Re[1]: イベントログ Xpathでフィルタ
□投稿者/ WebSurfer (1418回)-(2018/01/27(Sat) 13:33:27)
No86409 (あざ さん) に返信


https://teratail.com/questions/110698 ← マルチポストですよね?

マルチポストがどういう意味か分からなければそれをキーワードにググってヒットする記事を 2, 3 読んでみてください。
まず歓迎されることはなさそうです。
引用返信 編集キー/
■86435 / inTopicNo.6)  Re[2]: イベントログ Xpathでフィルタ
□投稿者/ あざ (3回)-(2018/01/29(Mon) 09:12:30)
No86433 (WebSurfer さん) に返信

ほかで出していたものを削除致します。申し訳ございません。



■86423 (魔界の仮面弁士 さん) に返信
教えてくださいましてありがとうございます。

案や修正する箇所.手直しする所を直して、一度考察しまた質問します。

ありがとうございます。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ