我正在开发一个应用程序来捕获来自多个 Windows 系统的事件日志(安全性)。我有一个 EntryWritten 的处理程序。我能够将大多数字段从事件查看器映射到 .net 中的 EntryWrittenEventArgs 条目。但是,我似乎找不到事件查看器中显示的级别、操作码和任务类别字段的映射。关于如何在 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 回答