在服务器上运行的 PowerShell 脚本检查 TCP 连接,然后将其输出到 CSV

PowerShell script that runs on a server checks TCP connection and then outputs it to CSV

我是 PowerShell 的新手,所以我还不太了解它,这是一次学习经历,也可能是我可以改进以在将来实用的东西,但我正在尝试启动这个脚本通过 SCCM 发送到几百台服务器,并让它写入结果以在 CSV 中共享驱动器。

在开始之前先声明 nmap 和大多数第三方工具是不可能的。

脚本的目的是查看它是否可以连接到我们的 DC 正在侦听的指定端口。我希望输出列出启动连接的服务器的主机名、它尝试连接的特定 DC,以及它是成功还是失败。 运行 它在一台服务器上看起来像这样:

ComputerName    TcpTestSucceeded    Hostname
DC1                 TRUE             Host1
DC2                 FALSE            Host1
DC3                 True             Host1

我想在解决外部写入问题之前得到我的输出,现在它有点时髦,因为我试图做一些对象操作。

我目前拥有的:

$hostname=$env:computername

$DC01='DC1'
$DC02='DC2'

$Result=New-Object System.Collections.ArrayList 
$Result|Add-Member -MemberType NoteProperty -Name Hostname -Value $hostname

$dcArray=$DC01,$DC02

ForEach ($dc in $dcArray){
    $Result+=Test-NetConnection -ComputerName $dc -Port 54001
    $computerName= $Result|Select -Property ComputerName
    $tcpTestSucceeded=$Result|Select -Property TcpTestSucceeded


}
$resultObject=New-Object psObject -Property@{'Hostname'=$hostname;'ComputerName'=$computerName;'TcpTestSucceeded'=$tcpTestSucceeded}

$resultObject|Write-Output

目前我得到的是 table:

中的散列table
ComputerName                         TcpTestSucceeded             Hostname      
------------                         ----------------              --------      
{@{ComputerName=DC01}, @{ComputerName=DC02}} {@{TcpTestSucceeded=False}, @{TcpTestSucceeded=False}} Host1

如果有人感到困惑,'ComputerName' 应该是接收连接的 DC 的名称,'Hostname' 是尝试连接的服务器。

您正在向新对象添加本身就是对象的成员。

要解决此问题,您需要在 select 语句中使用 -expandProperty 开关。

您还遇到了范围问题,因为您将 $resultObject 放在了 ForEach 循环之外。这就是为什么您的输出中只有 1 个项目。 您还将属性添加到数组列表而不是该数组列表中的项目。

但简而言之,你把一些事情不必要地复杂化了 由于您已经拥有一个包含所需大部分属性的对象,因此您可以从中获取 select 个属性。

试试这个:

$hostname=$env:computername

$DC01='DC1'
$DC02='DC2'
$dcArray=$DC01,$DC02

$Result=@()    
ForEach ($dc in $dcArray){
    $Result+=Test-NetConnection -ComputerName $dc -Port 54001

}

$result | select @{Name="Hostname";Expression={$Hostname}}, ComputerName, PingSucceeded

如果你想更详细/更具体地输出成员,你可以这样做:

$hostname=$env:computername

$DC01='DC1'
$DC02='DC2'
$dcArray=$DC01,$DC02

ForEach ($dc in $dcArray){
    $Result=Test-NetConnection -ComputerName $dc -Port 54001
    $Out = new-object PSObject -Property @{Hostname=$hostname;ComputerName=$($Result.computerName);TcpTestSucceeded=$($Result.PingSucceeded)}
    $out
}