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
}
不过,我还没有从性能角度对这两种方法进行比较。看起来好多了-非常感谢。我不太关心执行需要多长时间。