You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell导出安全事件日志时间为空 需提取调用方账户名字段

安全事件日志导出脚本修复方案

现存问题

当前用于导出Windows安全事件查看器日志的PowerShell脚本存在两处异常:

  • 导出的CSV文件中日期时间字段全部为空
  • 导出字段缺失需要的**调用方账户名(Caller account name)**信息

原脚本代码如下:

Select-Object EventId, Time, @{ 
   n='AccountName';
   e={ ($_.message -replace '\n', ' ') -replace '.*?account name:\t+([^\s]+).*', '$1' } 
 }, @{
   n='TargetAccount';
   e={ ($_.message -replace '\n', ' ') -replace '.*account name:\t+([^\s]+).*', '$1' } 

 } | Export-Csv 'C:\EventLogs.csv'

问题原因

  • 时间字段为空:Windows事件日志对象中不存在名为Time的属性,事件生成时间实际存储在TimeCreated属性中,原脚本读取不存在的属性因此返回空值。
  • 字段缺失+取值不准:原脚本的正则匹配规则没有区分事件消息中不同位置的账户名字段,既没有单独匹配调用方账户的规则,原有两个账户字段的匹配逻辑也会因为正则贪婪/非贪婪匹配特性出现取值错位。

修复后完整脚本

# 拉取安全日志后做字段映射,最终导出到CSV
Get-WinEvent -FilterHashtable @{LogName='Security'} | Select-Object EventId, 
    @{
        n='Time';
        e={$_.TimeCreated}
    },
    @{
        n='CallerAccountName';
        e={ ($_.message -replace '\n', ' ') -replace '.*调用方帐户名:\s+([^\s]+).*', '$1' } 
    },
    @{
        n='TargetAccountName';
        e={ ($_.message -replace '\n', ' ') -replace '.*帐户名:\s+([^\s]+).*', '$1' } 
    } | Export-Csv 'C:\EventLogs.csv' -NoTypeInformation -Encoding UTF8

如果使用英文版本操作系统,将上述正则里的调用方帐户名:替换为Caller Account Name:、帐户名:替换为Account Name:即可正常匹配。

修复说明

  • 修正时间字段取值逻辑:直接读取事件对象自带的TimeCreated属性赋值给Time列,无需从消息文本中正则匹配,取值准确且性能更好。
  • 新增调用方账户名字段:单独增加CallerAccountName列,通过正则锚定「调用方帐户名」关键字后的取值,和目标账户字段做明确区分。
  • 优化导出参数:给Export-Csv增加-NoTypeInformation参数去掉CSV文件开头多余的类型描述行,增加-Encoding UTF8参数避免中文内容导出乱码。
  • 补全日志获取命令:原脚本缺失前置的日志读取命令,补充Get-WinEvent命令拉取安全日志内容,脚本可直接运行。

内容的提问来源于stack exchange,提问作者Arunkumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:06:28