C# 如何实时查看事件日志中的特定条目,同时获取XML数据?
我正在构建一个应用程序,它应该监视文件的访问、读取、写入和删除 我使用的是Windows7Pro上的内置审计系统。在gpedit.msc中打开它,然后为要查看的文件设置审核标志,然后在安全日志中获取条目 我想做的是实时查看安全日志,我喜欢这样做:C# 如何实时查看事件日志中的特定条目,同时获取XML数据?,c#,.net,xml,event-log,C#,.net,Xml,Event Log,我正在构建一个应用程序,它应该监视文件的访问、读取、写入和删除 我使用的是Windows7Pro上的内置审计系统。在gpedit.msc中打开它,然后为要查看的文件设置审核标志,然后在安全日志中获取条目 我想做的是实时查看安全日志,我喜欢这样做: static EventLog securityLog = new EventLog("Security", System.Environment.MachineName); securityLog.EntryWritten += new Entry
static EventLog securityLog = new EventLog("Security", System.Environment.MachineName);
securityLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten);
securityLog.EnableRaisingEvents = true;
这将起作用并调用myonentrywrited
-函数
public static void OnEntryWritten(object source, EntryWrittenEventArgs entry)
entry.entry
是entrywriteneventargs.entry
属性,它似乎不允许我访问我需要的条目的XML属性,因为它包含其他信息
之后我尝试通过另一个EventLogReader
查询事件日志,因为我可以获取entry.entry.Index
,它应该是我从EventLogReader
获取的事件的eventInstance.RecordId
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">">*[System[(EventRecordID=181616)]]</Select>
</Query>
</QueryList>
当我尝试获取xml时,这失败了,为什么
我得到一个“对象引用未设置为对象的实例”。这是一个系统。NullReferenceException
。我不确定这个错误到底是怎么发生的
如果我像这样查询日志
EventLogQuery eventsQuery = new EventLogQuery("Security",
PathType.LogName,
"*[EventData[Data[@Name='ObjectType'] and (Data='File')]] ");
它毫无问题地工作
做这件事的最佳方法是什么?您检查了
XDocument.Parse(logReader.ReadEvent().ToXml())的输出了吗?ToXml()
是否生成正确的XDocument(带有标题、根元素…)?这可能就是问题所在
但是,如果您不坚持使用此解决方案,可以尝试使用或Microsoft的官方文件监视工具:InstanceId不会返回与索引值相同的值
请尝试以下代码段以获取正确的ID
UInt16 eventid = (UInt16)(entry.Entry.InstanceId)
每次调用ReadEvent()时,您都在检索下一个事件。您的查询只返回一个事件。线路
xml = XDocument.Parse(logReader.ReadEvent().ToXml());
是罪魁祸首
您的代码应该更像这样:
string query = "*[System[(EventRecordID=" + entry.Entry.Index + ")]]";
// Create Event Log Query and Reader
EventLogQuery eventsQuery = new EventLogQuery("Security",
PathType.LogName,
query);
EventLogReader logReader = new EventLogReader(eventsQuery);
EventRecord eventInstance = logReader.ReadEvent();
if (eventInstance != null)
{
XDocument xml;
try
{
xml = XDocument.Parse(eventInstance.ToXml());
}
catch (Exception e)
{
//This probably won't happen now.
break; //We seem to have a newline character in the
}
}
谢谢你的回答,我对我的问题进行了更详细的编辑。首先,我没有得到xml,而是一个无聊的System.NullReferenceException
,但当我更改查询时它确实起作用。我必须使用事件日志,FileSystemWatcher和其他都是不可能的。
string query = "*[System[(EventRecordID=" + entry.Entry.Index + ")]]";
// Create Event Log Query and Reader
EventLogQuery eventsQuery = new EventLogQuery("Security",
PathType.LogName,
query);
EventLogReader logReader = new EventLogReader(eventsQuery);
EventRecord eventInstance = logReader.ReadEvent();
if (eventInstance != null)
{
XDocument xml;
try
{
xml = XDocument.Parse(eventInstance.ToXml());
}
catch (Exception e)
{
//This probably won't happen now.
break; //We seem to have a newline character in the
}
}