LoginSignup
1
2

More than 5 years have passed since last update.

System.Diagnostics.EventLogの取得結果がWindows10 2018Springから全件取れなくなったっぽい件

Last updated at Posted at 2018-05-02

要約

対処療法な感じがすごいので良いのかどうかはわからないが、
Windows10の2018 Springアップデートから
System.Diagnostics.EventLogのEntriesを使うとデータが全件取れない現象が起きており、
PowerShellのGet-WinEventをつかってデータを取るとうまく逃げられるよ

以下、経緯

EventLog.EntriesをForEachループで回して全件処理 が今までの鉄板だった感じですが、
ちょうどそんな処理を書いてテストしてる最中にWindows10 2018Springアップデートしたら
130件ぐらいでForEachループが終わるようになりました。

ちなみにこんな処理も通んない… (のはさすがにどうかと思うんだが。)

System.Diagnostics.EventLog log = new System.Diagnostics.EventLog(logName_sec, machineName);

for(int i=0;i<=log.Entries.Count;i++){
    Console.WriteLine(log.Entries[i].TimeGenerated);
}

※注:logName_secは単にセキュリティログを抜きたいので"Security"です。当然管理者権限での実行。

結局どうした(ようとしている)のか

WindowsPowerShellでならWindowsログを従前のようにそれなりに取得可能。
ただし、取得順序がSystem.Diagnostics.EventLogで取ると昔→今のログ
WindowsPowerShellのGet-WinEventで取ると今→昔のログになるみたい。

で、結局下記のようなコードになりました。
時間でソートしてたりいろいろと力業感が強いです。

string script = @"Get-WinEvent Security |select-object TimeCreated,ID|sort-object TimeCreated";

using(RunspaceInvoke ivk = new RunspaceInvoke())
{
    System.Collections.ObjectModel.Collection<System.Management.Automation.PSObject> psList = ivk.Invoke(script);
    foreach (var pso in psList) //System.Diagnostics.Eventing.Reader.EventLogRecord
    {
        EventID = (int)pso.Properties["ID"].Value;
        dtGetLog = (DateTime)pso.Properties["TimeCreated"].Value;   //ログの日付取得

//~~~~~~~~~~~~~~~~~~
// なんかやりたい本処理
//~~~~~~~~~~~~~~~~~~

    }

}

ログの生成時間とログIDが取れれば充分だったので、
とりあえず要件は満たせた形です。

あと、私はC#触ってまだ2週間ぐらいなのでコードの構文規則とか
見る人が見たら全然ダメかもしれません。
(自分でも何かダメな気はしています。)

通りすがりの方で、指摘や改善点などあればコメント欄で頂けると幸いです。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2