EVTX 的两类时间字段
事件日志里存在两类时间:一类是日志服务写入该事件的时间,另一类是事件数据内部记录的、动作实际发生的时间,例如进程创建时刻。两者语义不同,在跨机器汇聚或日志延迟写入时会出现明显偏差。分析前先看 XML 里的字段名,再决定取哪一个。
基本信息
| 系统写入时间 | 日志服务在记录时打上,受系统时钟与写入延迟影响 |
|---|---|
| 事件内时间 | 由提供程序写入事件数据,字段名随组件不同 |
| 混淆风险 | 两者都可能是时间字符串,取错会把事件挂到错误时刻 |
| 推荐做法 | 按 XML 字段名解析,不按固定下标取属性 |
| 对照方式 | 与文件时间、抓包时间互为旁证 |
典型使用场景
- 分析执行类事件时取动作实际发生的时间
- 排查日志延迟写入造成的时间偏差
- 编写批量解析脚本时按字段名取值,保证稳健
- 与文件系统时间对齐,构建统一时间线
- 在报告中说明时间来源,支撑置信度判断
查看字段结构
查看字段结构
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; Id=1} -MaxEvents 1 | ForEach-Object { $_.ToXml() } | Select-String 'UtcTime|TimeCreated'
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} -MaxEvents 1 | Select-Object TimeCreated, Id
# 批量取值时按 XML 字段名解析,不要按属性下标取
# 取到的时间再与文件时间或抓包时间做单点比对两类时间对照
| 时间 | 来源 | 使用场景 |
|---|---|---|
| 系统写入时间 | 日志服务的记录时刻 | 判断日志延迟与汇聚过程 |
| 事件内时间 | 事件数据中的时间字段 | 判断动作实际发生的时刻 |
| 两者偏差小 | 写入及时 | 优先采用事件内时间 |
| 两者偏差大 | 日志延迟或时钟调整 | 两处都要记录并说明原因 |
不同提供程序的事件数据结构不同,属性顺序也不同:脚本按固定下标取值,在组件升级或版本差异下必然错位。按字段名解析虽然写得稍长,但长期可用。
事件内时间由提供程序写入,没有经过日志服务校验,理论上可被伪造,也会受系统时钟影响。把关键结论建立在单一时间字段上风险较高,需要与独立来源交叉验证后再采用。