【问题标题】:How to fix Get-ChildItem -Recurse to handle more than the first level如何修复 Get-ChildItem -Recurse 以处理多于第一级的问题
【发布时间】:2019-04-18 11:26:26
【问题描述】:

我尝试使用 Get-ChildItem 递归地从给定文件结构的事件日志中过滤 Windows 事件 (id=4633)。

文件结构如下:

C:\Temp\raw_data\2018-09\Securitylog\Securitylog_2018-09-14_13-30.evtx

问题是,Get-ChildItem 只处理第一级。第一层之下的每一层似乎都被忽略了。

我尝试使用-Recurse 参数但没有成功。我没有收到任何错误,所以我相信语法是正确的。代码示例如下。

$out = New-Object System.Text.StringBuilder
$out.AppendLine("ServerName,EventID,TimeCreated,UserName,File_or_Folder,AccessMask")
$ns = @{e = "http://schemas.microsoft.com/win/2004/08/events/event"}
Get-ChildItem "C:\temp\raw_data" -Recurse | ForEach-Object {
    {
        $evts = Get-WinEvent -FilterHashtable @{Path=$_;id="4663"} -Oldest
        foreach ($evt in $evts) {
            $xml = $evt.ToXml()
            $SubjectUserName = Select-Xml -Xml $xml -Namespace $ns -XPath "//e:Data[@Name='SubjectUserName']/text()" |
                               Select-Object -ExpandProperty Node |
                               Select-Object -ExpandProperty Value
            $ObjectName = 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
            $out.AppendLine("$($svr),$($evt.id),$($evt.TimeCreated),$SubjectUserName,$ObjectName,$AccessMask")
            Write-Host $svr
            Write-Host $evt.id, $evt.TimeCreated, $SubjectUserName, $ObjectName,$AccessMask
        }
    }
}
$out.ToString() | Out-File -FilePath "C:\Temp\X4663Events.csv"

我不知道,为什么没有文件被处理。该文件将被创建,但标题为空。

【问题讨论】:

  • docs.microsoft.com/en-us/powershell/module/… Get-ChildItem -Path C:\Test*.txt -Recurse -Force 此示例显示位于当前目录及其子目录中的 .txt 文件
  • 您确认Get-ChildItem "C:\temp\raw_data" -Recurse 确实没有列出您期望的文件吗?单独运行该语句时是否遇到错误?
  • @AnsgarWiechers get-Childitem "c:\temp\raw_data" -recurse 显示所有相关文件。但是导出文件仍然没有结果。它是空的
  • @YasushiHiroNakamura - 所以......当第一个文件被处理时,$evts 有什么东西吗?如果是这样,在它后面的foreach 中的第一个$evt 中是否有任何内容? ///// 这是标准诊断 [grin] ...你找到故障点在哪里了吗?
  • 删除$evts = ...; foreach (...) {...} 周围的脚本块,然后重试。为什么首先会有一个嵌套的脚本块?

标签: powershell export-to-csv powershell-3.0 event-log


【解决方案1】:

不必那么难。典型的 powershell 看起来更像这样。构建一个对象,然后导出到 csv。了解您在做什么,并验证每一部分。

$evts = get-winevent security -MaxEvents 3

$objs = foreach ($evt in $evts) {
  [xml]$xml = $evt.toxml()

  $subjectusername = $xml.event.EventData.data |
    where name -eq subjectusername |
    select -expand '#text'
  $subjectdomainname = $xml.event.EventData.data |
    where name -eq subjectdomainname |
    select -expand '#text'

  [pscustomobject]@{
    SubjectUserName = $subjectusername
    SubjectDomainName = $subjectdomainname
  }

}

$objs
$objs | export-csv mylog.csv
get-content mylog.csv


SubjectUserName SubjectDomainName
--------------- -----------------
SYSTEM          NT AUTHORITY
MYCOMP$         AD
MYCOMP$         AD


#TYPE System.Management.Automation.PSCustomObject
"SubjectUserName","SubjectDomainName"
"SYSTEM","NT AUTHORITY"
"MYCOMP$","AD"
"MYCOMP$","AD"

【讨论】:

    猜你喜欢
    • 2014-01-08
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    相关资源
    最近更新 更多