【问题标题】:ConvertFrom-StringData to hashtable to parse event logConvertFrom-StringData 到 hashtable 来解析事件日志
【发布时间】:2015-09-23 02:37:08
【问题描述】:

我正在蚕食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

示例中的最后一行是我要捕获的那种。

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

$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?),但谁能说明这个错误是关于什么的?还是更好的方法?

【问题讨论】:

    标签: powershell powershell-5.0


    【解决方案1】:

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

    $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:\Temp\4663Events.csv' -NoType -Append
    }
    

    不过,我还没有比较这两种方法的性能。

    【讨论】:

    • 看起来好多了 - 非常感谢。我不太关心执行需要多长时间。
    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2022-12-28
    • 1970-01-01
    • 2021-07-19
    • 2016-01-09
    相关资源
    最近更新 更多