在我的计算机上,当程序崩溃时,Application Error
会记录一个事件 (id=1000)。它包含EventData\Data
具有以下属性的元素Name
:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Application Error" Guid="{a0e9b465-b939-57d7-b27d-95d8e925ff57}" />
<EventID>1000</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>100</Task>
<Opcode>0</Opcode>
<Keywords>0x8000000000000000</Keywords>
<TimeCreated SystemTime="2023-11-23T07:21:17.8580874Z" />
<EventRecordID>115450</EventRecordID>
<Correlation />
<Execution ProcessID="40036" ThreadID="30520" />
<Channel>Application</Channel>
<Computer>COMPUTER</Computer>
<Security UserID="S-1-5-21-3767373869-1191893141-2221839827-9409" />
</System>
<EventData>
<Data Name="AppName">explorer.exe</Data>
<Data Name="AppVersion">10.0.22621.2715</Data>
<Data Name="AppTimeStamp">29e0887d</Data>
<Data Name="ModuleName">ntdll.dll</Data>
<Data Name="ModuleVersion">10.0.22621.2506</Data>
<Data Name="ModuleTimeStamp">bced4b82</Data>
<Data Name="ExceptionCode">c0000005</Data>
<Data Name="FaultingOffset">0000000000033aca</Data>
<Data Name="ProcessId">0x7f30</Data>
<Data Name="ProcessCreationTime">0x1da1ddd33a534b8</Data>
<Data Name="AppPath">C:\WINDOWS\explorer.exe</Data>
<Data Name="ModulePath">C:\WINDOWS\SYSTEM32\ntdll.dll</Data>
<Data Name="IntegratorReportId">9b4b87a8-7f38-494b-8d48-b451b07baf2c</Data>
<Data Name="PackageFullName" />
<Data Name="PackageRelativeAppId" />
</EventData>
</Event>
通过 XPath 查询特定应用程序的这些内容非常容易:查找 Data['AppName'] == 'MyApp.exe' 的事件。
但是在另一台机器上,我得到了事件没有任何名称属性。这使得查询变得困难。是什么使得这些属性出现/不出现在这些日志中?数据元素的顺序/数量是否保证对于特定 ID 是固定的,例如,应用程序错误 (id=1000) 事件始终具有相同顺序的相同数据?
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Application Error" />
<EventID Qualifiers="0">1000</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>100</Task>
<Opcode>0</Opcode>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2023-11-23T07:31:42.9685382Z" />
<EventRecordID>306438</EventRecordID>
<Correlation />
<Execution ProcessID="0" ThreadID="0" />
<Channel>Application</Channel>
<Computer>OTHERCOMPUTER</Computer>
<Security />
</System>
<EventData>
<Data>explorer.exe</Data>
<Data>10.0.22621.2715</Data>
<Data>29e0887d</Data>
<Data>ntdll.dll</Data>
<Data>10.0.22621.2506</Data>
<Data>bced4b82</Data>
<Data>c0000005</Data>
<Data>0000000000033aca</Data>
<Data>c00000fd</Data>
<Data>00007ffd56b4fd5a</Data>
<Data>3a20</Data>
<Data>01da1ddc5cb4da50</Data>
<Data>C:\WINDOWS\explorer.exe</Data>
<Data>C:\WINDOWS\SYSTEM32\ntdll.dll</Data>
<Data>c6e1d9d7-5bdb-405d-aa92-73d7d44d6fca</Data>
<Data />
<Data />
</EventData>
</Event>
编辑:澄清:这个问题是关于从微软部分查找文档,而不是关于编码(从编程角度来看,我已经提出了可能或可能不是一个脆弱的解决方案,我只需要知道它有多脆弱)。
答案1
在 Windows 10 上,我得到的 XML 数据与第二个示例中的相同。我认为您不能依赖标签Name
上存在的属性<Data>
,而需要找到一个通用解决方案。
我不是 XPath 专家,但您可以使用 而不是
Data['AppName'] == 'MyApp.exe'
,搜索<Data>
包含指示进程名称的字符串的标签,例如“.exe”或“.dll”。
我找到的一篇参考文章是 Xpath 包含的定义。 也许这个帖子 也会有帮助。