這是來自PowerShell的后續問題| EVTX | 將訊息與陣列進行比較(如)
我稍微改變了策略,現在我正在收集所有安裝的服務,
$7045 = Get-WinEvent -FilterHashtable @{ Path="1system.evtx"; Id = 7045 } | select
@{N=’Timestamp’; E={$_.TimeCreated.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')}},
Id,
@{N=’Machine Name’; E={$_.MachineName}},
@{N=’Service Name’; E={$_.Properties[0].Value}},@{N=’Image Path’;E=$_.Properties[1].Value}},
@{N=’RunAsUser’; E={$_.Properties[4].Value}},@{N=’Installed By’; E={$_.UserId}}
現在,我將每個物件與任何可疑特征進行匹配,如果找到,則添加一個值為“是”的“可疑”列。這是因為我想讓分析師做出決定,并且很確定壞人可能會使用我們以前從未見過的東西。
foreach ($Evt in $7045)
{
if ($Evt.'Image Path' -match $sus)
{
$Evt | Add-Member -MemberType NoteProperty -Name 'Suspicious' -Value 'Yes'
}
}
現在,除非我特別指定Select它們,否則我無法讓 PowerShell 顯示所有列
$7045 | Format-Table
CSV 匯出也是如此。前兩個不包含SuspiciousColumn 但第三個包含但那是因為我明確要求它。
$7045 | select * | Export-Csv -Path test.csv -NoTypeInformation
$7045 | Export-Csv -Path test.csv -NoTypeInformation
$7045 | Select-Object Timestamp, Id, 'Machine Name', 'Service Name', 'Image Path', 'RunAsUser', 'Installed By', Suspicious | Export-Csv -Path test.csv -NoTypeInformation
我閱讀了 MS 上的 Export-CSV 檔案。在 StackOverFlow 上搜索了一些提示,我認為這與 PS 檢查第一行然后比較第二行是否存在屬性有關,依此類推。謝謝
uj5u.com熱心網友回復:
您遇到的問題部分是因為物件在控制臺上的顯示方式,第一個物件的屬性將決定控制臺上顯示的屬性(列)。但是,更大的問題是,Export-Csv除非您Select-Object按照問題中指出的那樣明確使用,否則不會匯出不屬于管道上第一個物件的那些屬性。
例子:
$test = @(
[pscustomobject]@{
Col = 'Val'
}
[pscustomobject]@{
Col = 'Val'
Col2 = 'Val2'
}
[pscustomobject]@{
Col3 = 'Val3'
Col4 = 'Val4'
Col5 = 'Val4'
}
)
Format-Table不會顯示Col2到Col5:
PS /> $test | Format-Table
Col
---
Val
Val
Format-List將按原樣顯示物件:
PS /> $test | Format-List
Col : Val
Col : Val
Col2 : Val2
Col3 : Val3
Col4 : Val4
Col5 : Val4
Export-Csv并且ConvertTo-Csv也會錯過Col2到Col5:
PS /> $test | ConvertTo-Csv
"Col"
"Val"
"Val"
您有不同的選擇作為解決方法,您可以將Suspicious屬性添加到所有物件,對于那些不可疑的事件,您可以添加$null為Value。另一種解決方法是使用Select-Object顯式呼叫Suspicious屬性(這是有效的,因為您知道該屬性在那里并且您知道它是Name)。如果您不知道物件有多少屬性,另一種解決方法是遍歷它們并使用.PSObject.Properties.Name以下方法發現它們的屬性:
$test | ForEach-Object -Begin {
$props = [System.Collections.Generic.HashSet[string]]::new(
[System.StringComparer]::InvariantCultureIgnoreCase
)
} -Process {
foreach($i in $_.PSObject.Properties.Name)
{
$null = $props.Add($i)
}
} -End {
$test | Select-Object ([object[]]$props) | Format-Table
}
uj5u.com熱心網友回復:
繼續我之前的回答,Suspicious如果您取出Where-Object過濾器并簡單地向Select-Objectcmdlet添加另一個計算屬性,則可以立即添加一列:
# create a regex for the suspicious executables:
$sus = '(powershell|cmd|psexesvc)\.exe'
# alternatively you can join the array items like this:
# $sus = ('powershell.exe','cmd.exe','psexesvc.exe' | ForEach-Object {[regex]::Escape($_)}) -join '|'
$7045 = Get-WinEvent -FilterHashtable @{ LogName = 'System';Id = 7045 } |
Select-Object Id,
@{N='Timestamp';E={$_.TimeCreated.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')}},
@{N='Machine Name';E={$_.MachineName}},
@{N='Service Name'; E={$_.Properties[0].Value}},
@{N='Image Path'; E={$_.Properties[1].Value}},
@{N='RunAsUser'; E={$_.Properties[4].Value}},
@{N='Installed By'; E={$_.UserId}},
@{N='Suspicious'; E={
if ($_.Properties[1].Value -match $sus) { 'Yes' } else {'No'}
}}
$7045 | Export-Csv -Path 'X:\Services.csv' -UseCulture -NoTypeInformation
因為您有很多列,如果您這樣做,這將不再適合控制臺寬度$7045 | Format-Table,但 CSV 檔案將包含您想要的所有列。
我-UseCulture在 Export-Csv cmdlet 中添加了 switch ,這確保您只需雙擊 csv 檔案即可在 Excel 中正確打開。
作為旁注:請不要在代碼中使用那些卷曲的所謂“智能引號”,因為它們可能會導致不可預見的錯誤。拉直這些’東西并使用普通的雙引號或單引號("和')
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/393819.html
