【发布时间】: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