PowerShell导出事件日志转HTML时属性表头行缺失问题
问题原因
当前脚本存在两处逻辑错误,直接导致导出的HTML表格缺失属性表头:
ConvertTo-Html命令被错误放置在foreach循环内部,命令执行时$teste变量还处于赋值过程中,只能拿到零散的不完整数据,无法生成包含表头的完整表格结构- 循环内手动拼接输出的逗号分隔字符串,会和循环中零散生成的HTML片段混杂在一起,直接破坏最终输出文件的HTML结构
修正方法
调整代码执行顺序:foreach循环只负责构造结构化的事件自定义对象,所有事件对象全部收集完成后,再统一调用一次ConvertTo-Html完成格式转换,不要在循环内部做格式转换、输出无关内容。如果需要同时导出逗号分隔的CSV文件,直接使用内置的Export-Csv命令即可,无需手动拼接字符串,避免格式错误。
修正后的完整可运行脚本:
# 拉取安全日志中ID为4663的事件 $event0 = Get-WinEvent -FilterHashTable @{Logname = 'Security'; ID = 4663 } # 过滤AccessMask值为65536的事件条目 $events = $event0 | Where-Object { $_.Properties[9].Value -eq 65536 } # 循环构造结构化事件对象,不做任何格式转换操作 $eventList = foreach ($event in $events) { [PSCustomObject]@{ TimeCreated = $event.TimeCreated EventID = $event.Id User = $event.Properties[1].Value Domain = $event.Properties[2].Value LoginID = $event.Properties[3].Value ObjectName = $event.Properties[6].Value HandleID = $event.Properties[7].Value ProcessName = $event.Properties[11].Value AccessMASK = $event.Properties[9].Value } } # 所有事件对象收集完成后,统一生成带标准表头的HTML内容 $htmlContent = $eventList | ConvertTo-Html -Property TimeCreated, EventID, User, Domain, LoginID, ObjectName, HandleID, ProcessName, AccessMASK # 将HTML内容写入输出文件 $htmlContent | Out-File -FilePath "Rel.html" -Encoding UTF8 # 如需同步导出CSV格式文件,取消注释下面行即可 # $eventList | Export-Csv -Path "Rel.csv" -NoTypeInformation -Encoding UTF8
执行修正后的脚本,生成的Rel.html文件会自动在表格首行展示各列对应的属性名称表头,和下方的事件条目数据一一对应。
内容的提问来源于stack exchange,提问作者Bryan Almeida
相关产品推荐
相关产品推荐

