C#でアーカイブ化されたイベントログの取得を行いたいです。
C#のコードの中でPowerShellスクリプトを使って取得を行っていたのですが、
PowerShellのCPU使用率が高く、かつ制御ができないため
C#で取得したいと考えています。
実際にPowerShellで実行していたのは以下のスクリプトです。
Get-WinEvent -Path $path -FilterXPath "*[System[Provider[@Name='WSH']]]"| Select-Object Message, TimeCreated | where{($.timecreated -ge $starttime.LocalDateTime) -and ($.timecreated -le $endtime.LocalDateTime)}
$path・・・アーカイブ化されたイベントログのパス
$starttime・・・取得対象期間始点
$endtime・・・取得対象期間終点
アーカイブ化されたイベントログファイルに対してソース名=WSHのイベントログを対象期間分取得するといった要件です。
アーカイブ化されてない通常のイベントログにはC#でもアクセスできますが、調べてもパスを指定してアーカイブ化されたものに対してアクセスするようなものは見つかりませんでした。
なんとなくですがWin32APIを上手く使えばできるんでしょうか?
使ったことがないので、よくわかりません・・・・。
何かいい方法をご存知の方、
ご助力のほどお願いいたします。
追記:
LogParserを使ってみる手もありそうですが、どうなんでしょう・・・
こちらについても初見なのでよくわかりませんが、上手く使えばCPUの制御はできますかね・・・?
追記2:
oikaさん
ご回答ありがとうございます。
試したところ読み込みできました!
しかし、XPathを指定するところで、TimeCreatedの条件を下記のように記載したところEventLogReaderのインスタンス生成で例外が発生してしましました。。。
ProviderNameのみだと例外は発生しなかったので、このXPathの記載に問題がありそうです。
XPathはイベントビューアのフィルターからXMLを参照して記載しています。
C#
1public void QueryExternalFile() 2 { 3 string queryString = "*[System[Provider[@Name='WSH'] and TimeCreated[@SystemTime>='2016-01-01T09:00:00.000Z' and @SystemTime<='2016-01-01T10:00:00.000Z']]]"; // XPATH Query 4 string eventLogLocation = @"D:\Archive-Application-2016-01-11-04-28-24-389.evtx"; 5 EventLogQuery eventsQuery = new EventLogQuery(eventLogLocation, PathType.FilePath, queryString); 6 7 try 8 { 9 EventLogReader logReader = new EventLogReader(eventsQuery); 10 11 for (EventRecord eventInstance = logReader.ReadEvent(); 12 null != eventInstance; eventInstance = logReader.ReadEvent()) 13 { 14 // Display event info 15 Console.WriteLine("-----------------------------------------------------"); 16 Console.WriteLine("Event ID: {0}", eventInstance.Id); 17 Console.WriteLine("Publisher: {0}", eventInstance.ProviderName); 18 Console.WriteLine("Description: {0}", eventInstance.FormatDescription()); 19 } 20 } 21 catch (EventLogNotFoundException e) 22 { 23 Console.WriteLine("Could not find the external log to query! " + e.Message); 24 return; 25 } 26 }
例外
System.Diagnostics.Eventing.Reader.EventLogException はハンドルされませんでした。
HResult=-2146233088
Message=指定されたクエリは無効です。
Source=System.Core
StackTrace:
場所 System.Diagnostics.Eventing.Reader.EventLogException.Throw(Int32 errorCode)
場所 System.Diagnostics.Eventing.Reader.NativeWrapper.EvtQuery(EventLogHandle session, String path, String query, Int32 flags)
場所 System.Diagnostics.Eventing.Reader.EventLogReader..ctor(EventLogQuery eventQuery, EventBookmark bookmark)
場所 System.Diagnostics.Eventing.Reader.EventLogReader..ctor(EventLogQuery eventQuery)
<以下省略>
XPathの記載のどこに問題があるかわかりますか??( ;∀;)
追記3:
調査した結果解決しました。
C#
1string queryString = "*[System[Provider[@Name='WSH'] and TimeCreated[@SystemTime>='2016-01-01T09:00:00.000Z' and @SystemTime<='2016-01-01T10:00:00.000Z']]]"; // XPATH Query
を
C#
1string queryString = @"*[System[Provider[@Name='WSH'] and TimeCreated[@SystemTime >= '2015-12-31T15:00:00.000Z' and @SystemTime <= '2015-12-31T16:00:00.999Z']]]"; // XPATH Query
に変えたところ動作しました。
不等号が「<」などで表記されていたためでした。
ブラウザなどでイベントビューアのフィルターのXMLを開くと、ちゃんと不等号で表示されるようです。
ありがとうございました。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。