ConvertFrom-StringData to hashtable 解析事件日志
ConvertFrom-StringData to hashtable to parse event log
我正在拆解可用的脚本 here 以尝试解析某些文件审核事件的安全事件日志。我想做的是将输出限制为与特定文件名和访问掩码匹配的事件。
事件解析器使用 System.Text.StringBuilder
构造结果对象 ($evt
),我想过滤它以获得我真正想要的事件。
这是一些原始输出:
23/09/2015 10:50:23 AM userid F:\dir1 0x1
23/09/2015 10:50:23 AM userid F:\dir1\dir2 0x1
23/09/2015 10:50:23 AM userid F:\dir1\dir2\doc.docx 0x20000
示例中的最后一行是我要捕获的那种。
我根据以下内容将每一行创建为 key/data 对
$out.AppendLine("TimeCreated = $($evt.TimeCreated),Username = $SubjectUserName,File = $ObjectName,AccessMask = $AccessMask")
然后我发现 ConvertFrom-StringData
对文件路径中的反斜杠不满意,因此修复了它以创建哈希表:
$output = $out.ToString() -replace '\', '\'
$hash = convertfrom-stringdata -stringdata $output
但现在我收到以下错误:
convertfrom-stringdata : Data item 'TimeCreated' in line 'TimeCreated =
09/23/2015 10:50:23,Username = userid,File = F:\dir1,AccessMask = 0x1'
is already defined.
我怀疑我需要回到第一原则来过滤具有已知 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")
}
更笼统地说,我想说一个更 PoSh 的方法是将数据创建为自定义对象并将 CSV 创建留给 Export-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:\Temp63Events.csv' -NoType -Append
}
不过,我还没有比较这两种方法的性能。
我正在拆解可用的脚本 here 以尝试解析某些文件审核事件的安全事件日志。我想做的是将输出限制为与特定文件名和访问掩码匹配的事件。
事件解析器使用 System.Text.StringBuilder
构造结果对象 ($evt
),我想过滤它以获得我真正想要的事件。
这是一些原始输出:
23/09/2015 10:50:23 AM userid F:\dir1 0x1
23/09/2015 10:50:23 AM userid F:\dir1\dir2 0x1
23/09/2015 10:50:23 AM userid F:\dir1\dir2\doc.docx 0x20000
示例中的最后一行是我要捕获的那种。
我根据以下内容将每一行创建为 key/data 对
$out.AppendLine("TimeCreated = $($evt.TimeCreated),Username = $SubjectUserName,File = $ObjectName,AccessMask = $AccessMask")
然后我发现 ConvertFrom-StringData
对文件路径中的反斜杠不满意,因此修复了它以创建哈希表:
$output = $out.ToString() -replace '\', '\'
$hash = convertfrom-stringdata -stringdata $output
但现在我收到以下错误:
convertfrom-stringdata : Data item 'TimeCreated' in line 'TimeCreated =
09/23/2015 10:50:23,Username = userid,File = F:\dir1,AccessMask = 0x1'
is already defined.
我怀疑我需要回到第一原则来过滤具有已知 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")
}
更笼统地说,我想说一个更 PoSh 的方法是将数据创建为自定义对象并将 CSV 创建留给 Export-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:\Temp63Events.csv' -NoType -Append
}
不过,我还没有比较这两种方法的性能。