要約
対処療法な感じがすごいので良いのかどうかはわからないが、
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週間ぐらいなのでコードの構文規則とか
見る人が見たら全然ダメかもしれません。
(自分でも何かダメな気はしています。)
通りすがりの方で、指摘や改善点などあればコメント欄で頂けると幸いです。