4

Вступление

Цель: проверить, находится ли порт в LISTENING state on localhost с помощью функции PowerShell

Следующая команда:

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>

Вопрос

Какую функцию PowerShell можно использовать для проверки того, находится ли определенный порт в состоянии LISTENING на localhost?

4 ответа4

8

Если вы используете PowerShell v3.0+ в Windows 8/Server 2012 или более поздней версии, тогда вместо попытки подключиться к порту для определения состояния вы можете просто использовать Get-NetTCPConnection:

Get-NetTCPConnection -State Listen

Для меня это точнее, так как он читает состояние порта на компьютере. Использование соединения для тестирования может создать впечатление, что оно не "LISTENING", когда оно есть, если ему мешает брандмауэр или что-то подобное.

2

Сначала создайте и сохраните соединение:

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

я был полностью готов дать один из ответов Get-NetTCPConnection, после всего, что он работал на моей машине. К сожалению, он не работал на серверах Windows 2008, на которых работал Powershell 3.0, который должен был выполнить проверку.

Однако следующее работало отлично

([Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()).GetActiveTcpListeners() | Where Port -EQ 10389

1

Я пытался добавить это к ответу технаря, так что это расширение его. Вы можете точно настроить вывод так:

Get-NetTCPConnection -State Listen | Where-Object {$_.LocalAddress -eq "192.168.56.1" -and $_.LocalPort -eq "139"}

Это вернуло бы массив данных, если бы он прослушивал этот порт. Если нет слушателя, он возвращает ноль и, следовательно, нет необходимости в обработке ошибок.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .