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

在服务器上运行的PowerShell脚本检查TCP连接,然后将其输出到CSV,powershell,networking,system-administration,Powershell,Networking,System Administration,我对PowerShell非常陌生,所以我还没有完全了解它,这是一次学习经验,也可能是我将来可以改进以实用的东西,但我正试图通过SCCM将此脚本启动到数百台服务器,并让它将结果写入CSV中共享驱动器 在开始之前,让我说nmap和大多数第三方工具是不可能的 脚本的目的是查看它是否可以连接到我们的DCs正在侦听的指定端口。我希望输出列出启动连接的服务器的主机名、它试图连接的特定DC以及它是否成功。在一台服务器上运行它会像这样: ComputerName TcpTestSucceeded H

我对PowerShell非常陌生,所以我还没有完全了解它,这是一次学习经验,也可能是我将来可以改进以实用的东西,但我正试图通过SCCM将此脚本启动到数百台服务器,并让它将结果写入CSV中共享驱动器

在开始之前,让我说nmap和大多数第三方工具是不可能的

脚本的目的是查看它是否可以连接到我们的DCs正在侦听的指定端口。我希望输出列出启动连接的服务器的主机名、它试图连接的特定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
目前我得到的是表中的哈希表:

ComputerName                         TcpTestSucceeded             Hostname      
------------                         ----------------              --------      
{@{ComputerName=DC01}, @{ComputerName=DC02}} {@{TcpTestSucceeded=False}, @{TcpTestSucceeded=False}} Host1

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

您正在向新对象添加成员,这些成员本身就是对象

要解决这个问题,您需要在select语句上使用-expandProperty开关

由于将$resultObject放置在ForEach循环之外,所以在作用域方面也存在问题。这就是为什么输出中只有一项。 您还将属性添加到arraylist,而不是该arraylist中的项

但简言之,你不必要地把一些事情复杂化了 由于已经有一个对象具有所需的大多数属性,因此可以从中选择属性

试试这个:

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

$resultObject=New Object…
向上移动一行(因此它在
ForEach(){}
循环体中),这是我最初使用它的地方,我得到了完全相同的输出。我在select语句的第一个解决方案中得到了意外的标记错误,并且“赋值表达式无效”。输入赋值运算符必须是能够接受赋值的对象,例如变量或属性。在第二个运算符中。很抱歉,我没有通过健全筛选器运行它,因此我只修复了两个选项中的一个。。我已经做了编辑,现在应该可以了。另外,欢迎来到PowerShell!非常感谢!我知道这和我的物体操纵有关,但我仍在努力控制它。我最初有一个与您的第二个解决方案非常相似的解决方案,但后来放弃了,因为我不知道语法。