【问题标题】:PowerShell Export-CSV - Missing Columns [duplicate]PowerShell Export-CSV - 缺少列 [重复]
【发布时间】:2022-01-25 18:43:04
【问题描述】:

这是PowerShell | EVTX | Compare Message with Array (Like)的后续问题

我稍微改变了策略,现在我正在收集所有安装的服务,

$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'

    }
}

现在,我无法让 PowerShell 显示所有列,除非我专门 Select 他们

$7045 | Format-Table

CSV 导出也是如此。前两个不包含 Suspicious 列,但第三个包含,但那是因为我明确要求它。

$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 检查第一行然后比较第二行的属性是否存在等有关。 谢谢

【问题讨论】:

标签: powershell export-csv


【解决方案1】:

您遇到的问题部分是由于对象在控制台上的显示方式,第一个对象的属性将决定控制台上显示的属性(列)。但更大的问题是,Export-Csv 不会导出那些不属于管道上第一个对象的属性,除非您明确使用Select-Object,正如您在问题中指出的那样。

例子:

$test = @(
    [pscustomobject]@{
        Col = 'Val'
    }
    [pscustomobject]@{
        Col = 'Val'
        Col2 = 'Val2'
    }
    [pscustomobject]@{
        Col3 = 'Val3'
        Col4 = 'Val4'
        Col5 = 'Val4'
    }
)
  • Format-Table 不会显示 Col2Col5
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-CsvConvertTo-Csv 也会错过 Col2Col5
PS /> $test | ConvertTo-Csv

"Col"
"Val"
"Val"

您有不同的选项作为解决方法,您可以将Suspicious 属性添加到所有对象,对于那些不可疑的事件,您可以将$null 添加为价值。另一种解决方法是使用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
}

【讨论】:

  • 谢谢你们,这巩固了我对这个概念的理解。
【解决方案2】:

从我的previous answer 开始,如果您取出Where-Object 过滤器并简单地将另一个计算属性添加到Select-Object cmdlet,则可以立即添加一个列Suspicious

# 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 文件将包含您想要的所有列。
我在 Export-Csv cmdlet 中添加了开关 -UseCulture,它确保您可以简单地双击 csv 文件,使其在 Excel 中正确打开。

作为旁注:请不要在代码中使用那些卷曲的所谓“智能引号”,因为它们可能会导致无法预料的错误。拉直这些 东西并使用普通的双引号或单引号("'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2018-02-08
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2020-12-03
    相关资源
    最近更新 更多