【问题标题】:Having trouble writing Powershell output to csv file将 Powershell 输出写入 csv 文件时遇到问题
【发布时间】:2019-05-08 21:19:37
【问题描述】:

我是一名 PowerShell 新手,试图编写一个简单的脚本来查找特定用户登录工作站的次数,并以一种有用的方式将该信息导出到 CSV 文件,以便轻松操作。 CSV 文件只需要包含登录时间和安全日志条目的“消息”部分中提到的用户名。

我的问题是,我似乎可以得到一个 CSV 文件,其中包含一个不包含用户名的截断“消息”,或者我得到了我想要打印到主机而不是导出到 CSV 的所有信息。我确信解决方案可能非常基本,但就像我说的我是新手。

在这里发布的代码中,我得到了我需要打印到主机的所有内容,但我似乎无法将其放入 CSV 文件中。任何帮助将不胜感激。

New-Item -Name "UserLoginHistory" -Path C:\ -ItemType Directory -Force | Out-Null
$UserName = Read-Host -Prompt 'Which user are you searching for?'
$a =Get-EventLog -LogName Security -Message "*$UserName*" | Where-Object {$_.EventID -eq 4624} 
foreach($item in $a)
{
        $timeLog = $item.TimeGenerated
     $item = $item.Message.Split(":")

     $subject = $item[3].split()
     #$subject[2]
     $NewLogin = $item[14].split()
     #$NewLogin[2]
     $WorkstationName = $item[26].split()
     #$WorkstationName[1]
     $SourceNetworkAddress = $item[27].split()
     #$SourceNetworkAddress[1]


    "Time: $timeLog Subject: $($subject[2]) NewLogin: $($NewLogin[2]) WorkstationName $($WorkstationName[1]) SourceNetworkAddress $($SourceNetworkAddress[1])"

}
 Export-Csv -Path C:\UserLoginHistory\LoginHistory.csv

【问题讨论】:

  • 首先,您不会向Export-CSV cmdlet 发送任何内容。 [grin] ///// 其次,您没有创建要发送到上述 cmdlet 的对象。 ///// 第三,您的代码在我的 win7、ps5.1 系统上生成大量关于 $WorkstationName$SourceNetworkAddress 行的红色错误文本。 ///// 第四,$Subject$NewLogin 行正在生成 -0x0 而不是您想要的。 ///// 该代码是否真的在您的系统上工作?
  • 不要将{scrript block}中foreach的变量$item用于其他目的。
  • 这很奇怪,我的机器上没有任何错误。它的域加入了 Win 10 1809 Pro Plus。

标签: powershell


【解决方案1】:
  • 不要将 {script block} 中 foreach 的变量 $item 用于其他目的。
  • 创建一个 [PSCustomObject] 并将其发送到整个 foreach 的收集变量

未经测试的模板:

New-Item -Name "UserLoginHistory" -Path C:\ -ItemType Directory -Force | Out-Null
$UserName = Read-Host -Prompt 'Which user are you searching for?'
$Events = Get-EventLog -LogName Security -Message "*$UserName*" | Where-Object {$_.EventID -eq 4624} 

$Data = foreach($Event in $Events){
    $item = $Event.Message.Split(":")
    [PSCustomObject]@{
        Time                 = $Event.TimeGenerated
        Subject              = $item[3].split()[2]
        NewLogin             = $item[14].split()[2]
        WorkstationName      = $item[26].split()[1] 
        SourceNetworkAddress = $item[27].split()[1]
    }
}
$Data | Format-Table -Autosize *
$Data | Out-Gridview
$Data | Export-Csv -Path C:\UserLoginHistory\LoginHistory.csv -NoTypeInformation

【讨论】:

  • 哇,效果很好。还结合了 Out-Gridview,让技术人员立即看到他们需要的信息!谢谢!
【解决方案2】:

尝试将你的结果填充到一个数组中,就像这个未经测试的代码一样。

    New-Item -Name "UserLoginHistory" -Path C:\ -ItemType Directory -Force | Out-Null
$UserName = Read-Host -Prompt 'Which user are you searching for?'
$a =Get-EventLog -LogName Security -Message "*$UserName*" | Where-Object {$_.EventID -eq 4624} 
$ReportOutPut = @() # An array to hold your output.
foreach($item in $a)
{
        $timeLog = $item.TimeGenerated
     $item = $item.Message.Split(":")

     $subject = $item[3].split()
     #$subject[2]
     $NewLogin = $item[14].split()
     #$NewLogin[2]
     $WorkstationName = $item[26].split()
     #$WorkstationName[1]
     $SourceNetworkAddress = $item[27].split()
     #$SourceNetworkAddress[1]


   "Time: $timeLog Subject: $($subject[2]) NewLogin: $($NewLogin[2]) WorkstationName $($WorkstationName[1]) SourceNetworkAddress $($SourceNetworkAddress[1])"

    $ReportOutput += [pscustomobject] @{
        Time = $timeLog;
        Subject = $subject[2];
        NewLogin = $NewLogin[2];
        WorkstationName =  $WorkstationName[1];
        SourceNetworkAddress = $SourceNetworkAddress[1]
        } # Custom objec to be exported via csv

    }

Export-Csv -InputObject $ReportOutPut -NoTypeInformation -Path C:\UserLoginHistory\LoginHistory.csv 

【讨论】:

  • 修正了变量名的错字。
  • 感谢您的回复!这最终得到一个大部分空白的 CSV,但我可以稍微弄乱一下,看看我是否可以让它导出正确的信息。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 2021-11-27
  • 2013-12-14
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多