Как исправить Get-ChildItem -Recurse для обработки больше, чем первый уровень - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь отфильтровать события Windows (id = 4633) из журналов событий из заданной файловой структуры рекурсивно с Get-ChildItem.

Структура файла выглядит следующим образом:

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"

Понятия не имею, почему файл не обрабатывается.Файл будет создан, но он пуст, за исключением заголовка.

1 Ответ

0 голосов
/ 18 апреля 2019

Это не должно быть так сложно. Типичный 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"
...