导出特定 Windows 安全事件日志

Export Specific Windows Security Event Logs

我需要有关完成 PowerShell 脚本的帮助,我可以在其中获取特定的安全事件日志并将其导出到 CSV 文件。目前,我有这条线,

Get-EventLog -LogName Security 4720,4722,4725 -After ((Get-Date).AddDays(-1)) | Export-CSV "C:\EventLogs.csv"

这确实得到了我想要得到的安全事件。但是,它提供的信息是不完整的。它不在输出中包含这 2 个,

  1. 账户名 - 进行更改的账户
  2. 目标帐户 - 已更改的帐户

有没有办法包含上面这两个?

有人告诉我 Get-WinEvent 更适合执行此操作,但我对 PowerShell 脚本编写还很陌生,因此非常感谢您的帮助。谢谢

通常,Export-Csv 将:

  • 查看第一个输入对象
  • 检查其类型并根据该类型具有的所有属性 确定要导出的列。

但是,在您的情况下,听起来感兴趣的信息可能包含在 类型的 Message 属性.

因此,您必须使用带有精心制作的哈希表的中间 Select-Object 调用,以便将感兴趣的信息提取为单独的属性,然后 Export-Csv 将导出这些属性:

这是一个从 Message 属性 中提取帐户名称并将其导出为单独列的示例:

Get-EventLog -LogName Security 4720,4722,4725 -After ((Get-Date).AddDays(-1)) |
 Select-Object EventId, Time, @{ 
   n='AccountName';
   e={ ($_.message -replace '\n', ' ') -replace '.*?account name:\t+([^\s]+).*', '' } 
 }, @{
   n='TargetAccount';
   e={ ($_.message -replace '\n', ' ') -replace '.*account name:\t+([^\s]+).*', '' } 
 } | Export-Csv 'C:\EventLogs.csv'

注意传递给 -replace 的第一个正则表达式是 非贪婪的 (.*?),这意味着 第一个 出现将被匹配,而第二个是贪婪的(仅 .*),这意味着将匹配 last 出现。

用空格替换换行符的额外步骤是必要的,因为 -replace 显然总是逐行匹配。