在服务器上运行的 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
}
我是 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:
中的散列tableComputerName 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
}