はじめに
Aim: PowerShell関数を使用して、ポートが_LISTENING state on localhost
_にあるかどうかを確認します
次のコマンド:
New-Object Net.Sockets.TcpClient.Connect("127.0.0.1",10389)
結果:
_PS C:\Windows\system32> New-Object Net.Sockets.TcpClient.Connect("127.0.0.1",10389)
At line:1 char:33
+ New-Object Net.Sockets.TcpClient.Connect("127.0.0.1",10389)
+ ~
Unexpected token ')' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
PS C:\Windows\system32>
_
質問
特定のポートがローカルホストでLISTENING状態にあるかどうかを確認するために使用できるPowerShell関数はどれですか?
Windows 8/Server2012以降でPowerShellv3.0 +を使用している場合は、ポートに接続して状態を確認する代わりに、 Get-NetTCPConnection
:
Get-NetTCPConnection -State Listen
私にとって、これはコンピューターのポートのステータスを読み取るため、より正確です。接続を使用してテストすると、ファイアウォールなどが邪魔になった場合に、「リッスン」していないように見える可能性があります。
まず、接続を作成して保存します。
$connection = (New-Object Net.Sockets.TcpClient)
$connection.Connect("127.0.0.1",10389)
次に、接続されているかどうかを確認します
if ($connection.Connected) {
"We're connected"
}
またはColyn1337によって提案されたように
Try {
$connection = (New-Object Net.Sockets.TcpClient)
$connection.Connect("127.0.0.1",10389)
"Connected"
}
Catch {
"Can't Connect"
}
get-NetTCPConnectionの回答のいずれかが私のマシンで機能した後、賛成票を投じる準備が整いました。残念ながら、チェックを実行する必要のあるPowershell3.0を実行しているWindows2008サーバーでは機能しませんでした。
ただし、以下は完全に機能しました
([Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()).GetActiveTcpListeners() | Where Port -EQ 10389
ポート番号が占有されているかどうかを確認している場合、-eq“ $ null”が機能しない場合は正常です。
たとえば、次のコマンドを実行している場合
$PortNumberOutPut = Get-NetTCPConnection | where Localport -eq $portNumber
変数がnullかどうかを確認したい
if (!$PortNumberOutPut) { Write-Host "variable is null" }
また、$ PortNumberOutPutに$ null以外の値があるかどうかを確認する場合
if ($PortNumberOutPut) { Write-Host "variable is NOT null" }
私はこれを技術者の答えに追加しようとしたので、これは彼の拡張です。次のように出力を微調整できます。
Get-NetTCPConnection -State Listen | Where-Object {$_.LocalAddress -eq "192.168.56.1" -and $_.LocalPort -eq "139"}
そのポートでリッスンしている場合は、データの配列が返されます。リスナーがない場合はnullを返すため、エラー処理は必要ありません。