Powershell 将StringData转换为哈希表以分析事件日志

Powershell 将StringData转换为哈希表以分析事件日志,powershell,powershell-5.0,Powershell,Powershell 5.0,我正在分解用于尝试解析某些文件审核事件的安全事件日志的脚本。我试图做的是将输出限制为与特定文件名和访问掩码匹配的事件 事件解析器使用System.Text.StringBuilder来构造结果对象($evt),我想对其进行过滤,以获得实际需要的事件 以下是一些原始输出: 2015年9月23日上午10:50:23用户ID F:\dir1 0x1 2015年9月23日上午10:50:23用户ID F:\dir1\dir2 0x1 2015年9月23日上午10:50:23用户ID F:\dir1\di

我正在分解用于尝试解析某些文件审核事件的安全事件日志的脚本。我试图做的是将输出限制为与特定文件名和访问掩码匹配的事件

事件解析器使用
System.Text.StringBuilder
来构造结果对象(
$evt
),我想对其进行过滤,以获得实际需要的事件

以下是一些原始输出:

2015年9月23日上午10:50:23用户ID F:\dir1 0x1
2015年9月23日上午10:50:23用户ID F:\dir1\dir2 0x1
2015年9月23日上午10:50:23用户ID F:\dir1\dir2\doc.docx 0x20000
示例中的最后一行是我试图捕获的类型

我按照以下步骤将每一行创建为键/数据对

$out.AppendLine(“TimeCreated=$($evt.TimeCreated),Username=$subjectarchitecturename,File=$ObjectName,AccessMask=$AccessMask”)
然后我发现
convertfromstringdata
对文件路径中的反斜杠不满意,因此修复了创建哈希表的问题:

$output=$out.ToString()-替换“\\”、“\\”
$hash=convertfrom-stringdata$output
但现在我得到了以下错误:

convertfrom stringdata:TimeCreated行中的数据项'TimeCreated'=
2015年9月23日10:50:23,Username=userid,File=F:\\dir1,AccessMask=0x1'
已定义。
我想我需要回到第一原则,用已知的eventID和特定内容过滤事件数据,而不是用字符串和哈希表(可能是自定义的PSObject?)进行过滤,但是有人能说明这个错误是怎么回事吗?还是更好的方法?

在创建输出字符串之前过滤结果:

$filename = 'F:\dir1\dir2\doc.docx'
$mask     = '0x20000'

...

if ($ObjectName -eq $filename -and $AccessMask -eq $mask) {
  $out.AppendLine("$($svr),$($evt.id),$($evt.TimeCreated),$SubjectUserName,$ObjectName,$AccessMask")
}

更一般地说,我想说一种更时髦的方法是将数据创建为自定义对象,并将CSV创建留给
导出CSV

foreach ($svr in $server) {
  Get-WinEvent -Computer $svr -FilterHashtable @{logname="security";id="4663"} -Oldest | ForEach-Object {
    $xml = [xml]$_.ToXml()

    $props = [ordered]@{
      'ServerName'     = $svr
      'EventID'        = $_.Id
      'TimeCreated'    = $_.TimeCreated
      'UserName'       = Select-Xml -Xml $xml -Namespace $ns -XPath "//e:Data[@Name='SubjectUserName']/text()" | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty Value
      'File_or_Folder' = Select-Xml -Xml $xml -Namespace $ns -XPath "//e:Data[@Name='ObjectName']/text()" | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty Value
      'AccessMask'     = Select-Xml -Xml $xml -Namespace $ns -XPath "//e:Data[@Name='AccessMask']/text()" | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty Value
    }

    New-Object -Type PSCustomObject -Property $props
  } | Where-Object {
    $_.'File_or_Folder' -eq $filename -and
    $_.AccessMask -eq $mask
  } | Export-Csv 'C:\Temp\4663Events.csv' -NoType -Append
}

不过,我还没有从性能角度对这两种方法进行比较。

看起来好多了-非常感谢。我不太关心执行需要多长时间。