#powershell #export-to-csv #powershell-3.0 #event-log
#powershell #экспорт в csv #powershell-3.0 #журнал событий
Вопрос:
Я пытаюсь рекурсивно фильтровать события Windows (id = 4633) из журналов событий из заданной файловой структуры Get-ChildItem
.
Файловая структура выглядит следующим образом:
C:Tempraw_data2018-09SecuritylogSecuritylog_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:tempraw_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:TempX4663Events.csv"
Я понятия не имею, почему файл не обрабатывается. Файл будет создан, но это пустой execpt для заголовка.
Комментарии:
1. docs.microsoft.com/en-us/powershell/module /… Получить-дочерний элемент -Путь C:Test * .txt -Recurse -Force В этом примере отображаются файлы .txt, расположенные в текущем каталоге и его подкаталогах
2. Вы убедились, что
Get-ChildItem "C:tempraw_data" -Recurse
это действительно не список файлов, которые вы ожидаете? Получаете ли вы ошибки при выполнении этого оператора в одиночку?3. @AnsgarWiechers получить-Childitem «c:tempraw_data » -recurse показывает все соответствующие файлы. Но экспортный файл по-прежнему не дает никакого результата. его пустота
4. @YasushiHiroNakamura — так … есть ли
$evts
что-нибудь при обработке 1-го файла? если да, то есть ли что-нибудь в 1$evt
foreach
-м из того, что следует за ним? ///// это стандартная диагностика [ усмешка ] … вы выяснили, где находится точка отказа?5. Удалите scriptblock вокруг
$evts = ...; foreach (...) {...}
и повторите попытку. Почему вообще существует вложенный блок сценариев?
Ответ №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"