无法将Powershell输出写入csv文件

无法将Powershell输出写入csv文件,powershell,Powershell,我是一个PowerShell新手,尝试编写一个简单的脚本来查找特定用户登录工作站的次数,并以一种有用的方式将该信息导出到CSV文件中,以便轻松操作。CSV文件实际上只需要包含登录时间和安全日志条目“消息”部分中提到的用户名 我的问题是,我似乎可以得到一个带有截断的“消息”的CSV文件,其中不包含用户名,或者我可以得到我想要打印到主机上的所有信息,而不是导出到CSV。我相信解决方案可能非常基本,但就像我说的,我是个新手 在这里发布的代码中,我得到了需要打印到主机上的所有内容,但我似乎无法将其放入C

我是一个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

尝试将结果填充到一个数组中,如以下未经测试的代码

    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 
  • 不要将{scrript 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

首先,您没有向
导出CSV
cmdlet发送任何内容。[grin]////其次,您没有创建要发送到上述cmdlet的对象。///第三,您的代码在我的win7、ps5.1系统上生成了大量关于
$WorkstationName
&
$SourceNetworkAddress
行的红色错误文本。//第四,
$Subject
$NewLogin
行生成的是
-
0x0
,而不是您想要的该代码在您的系统上实际工作吗?不要在
{scrript block}
中重用foreach的变量
$item
,用于其他目的。奇怪的是,我的机器上没有任何错误。这是域名加入Win 10 1809 Pro Plus。修复了一个带有可变名称的打字错误。我感谢您的回复!这最终会得到一个几乎空白的CSV,但我可以稍微处理一下,看看是否可以让它导出正确的信息。非常感谢。哇,效果很好。在混合中也有Out Gridview,让技术人员立即看到他们需要的信息!非常感谢。