C# 如何实时查看事件日志中的特定条目,同时获取XML数据?

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

我正在构建一个应用程序,它应该监视文件的访问、读取、写入和删除

我使用的是Windows7Pro上的内置审计系统。在gpedit.msc中打开它,然后为要查看的文件设置审核标志,然后在安全日志中获取条目

我想做的是实时查看安全日志,我喜欢这样做:

static EventLog securityLog = new EventLog("Security", System.Environment.MachineName);

securityLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten);
securityLog.EnableRaisingEvents = true;
这将起作用并调用my
onentrywrited
-函数

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 
    }
}