複数の Windows システムからイベント ログ (セキュリティ) をキャプチャするアプリを開発しています。EntryWritten へのハンドラーがあります。ほとんどのフィールドをイベント ビューアから .net の EntryWrittenEventArgs エントリにマップできます。ただし、イベント ビューアーに表示されるレベル、OpCode、およびタスク カテゴリ フィールドのマッピングが見つからないようです。vb.netまたはc#でこれを取得する方法についてのアイデアはありますか? ありがとう
質問する
2155 次
1 に答える
3
名前空間のEventLog
クラスに、またはSystem.Diagnostics
のフィールドが含まれていません。ただし、名前空間には、これらのフィールドを返すことができるクラスがあります。この名前空間は、主にリモート マシンからイベント ログを取得するために使用されることに注意してください。これを使用してローカル マシンのログを取得することもできますが、システムへのローカル パイプを開くため、クラスよりも遅くなります。ただし、これらのフィールドに本当にアクセスする必要がある場合は、このクラスの一般的な使用方法を次に示します。Level
OpCode
Task
EventRecord
System.Diagnostics.Eventing.Reader
EventLog
private void LoadEventLogs()
{
List<EventRecord> eventLogs = new List<EventRecord>();
EventLogSession session = new EventLogSession();
foreach (string logName in session.GetLogNames())
{
EventLogQuery query = new EventLogQuery(logName, PathType.LogName);
query.TolerateQueryErrors = true;
query.Session = session;
EventLogWatcher logWatcher = new EventLogWatcher(query);
logWatcher.EventRecordWritten +=
new EventHandler<EventRecordWrittenEventArgs>(LogWatcher_EventRecordWritten);
try
{
logWatcher.Enabled = true;
}
catch (EventLogException) { }
// This is how you'd read the logs
//using (EventLogReader reader = new EventLogReader(query))
//{
// for (EventRecord eventInstance = reader.ReadEvent(); eventInstance != null; eventInstance = reader.ReadEvent())
// {
// eventLogs.Add(eventInstance);
// }
//}
}
}
そしてLogWatcher_EventRecordWritten
イベントハンドラ:
private void LogWatcher_EventRecordWritten(object sender, EventRecordWrittenEventArgs e)
{
var level = e.EventRecord.Level;
var task = e.EventRecord.TaskDisplayName;
var opCode = e.EventRecord.OpcodeDisplayName;
// Other properties
}
logWatcher.Enabled = true;
すべてのソースがエントリ作成リスナーを許可しているわけではないため、ステートメントをブロックでラップしたことに注意してくださいtry-catch
(セキュリティは正常に機能するはずです)。コメントアウトされたセクションには、必要に応じてすべてのログを読み取る例が示されています。
于 2013-08-14T00:39:42.857 に答える