3

複数の Windows システムからイベント ログ (セキュリティ) をキャプチャするアプリを開発しています。EntryWritten へのハンドラーがあります。ほとんどのフィールドをイベント ビューアから .net の EntryWrittenEventArgs エントリにマップできます。ただし、イベント ビューアーに表示されるレベル、OpCode、およびタスク カテゴリ フィールドのマッピングが見つからないようです。vb.netまたはc#でこれを取得する方法についてのアイデアはありますか? ありがとう

4

1 に答える 1

3

名前空間のEventLogクラスに、またはSystem.Diagnosticsのフィールドが含まれていません。ただし、名前空間には、これらのフィールドを返すことができるクラスがあります。この名前空間は、主にリモート マシンからイベント ログを取得するために使用されることに注意してください。これを使用してローカル マシンのログを取得することもできますが、システムへのローカル パイプを開くため、クラスよりも遅くなります。ただし、これらのフィールドに本当にアクセスする必要がある場合は、このクラスの一般的な使用方法を次に示します。LevelOpCodeTaskEventRecordSystem.Diagnostics.Eventing.ReaderEventLog

    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 に答える