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

要約

対処療法な感じがすごいので良いのかどうかはわからないが、
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週間ぐらいなのでコードの構文規則とか
見る人が見たら全然ダメかもしれません。
(自分でも何かダメな気はしています。)

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.