
В PowerShell можно использовать команду Test-NetConnection Команда для проверки доступности (открытости) порта на удаленном компьютере. Вы можете использовать эту команду для проверки ответа и доступности удаленного сервера или сетевой службы, проверки того, не заблокирован ли TCP-порт брандмауэром, проверки доступности ICMP и маршрутизации. На самом деле, Test-NetConnection
заменяет несколько популярных инструментов сетевого администрирования, таких как ping
, tracert
, telnet
, pathping
, сканер TCP-портов и т. д.
Проверка наличия открытого TCP-порта с помощью Test-NetConnection
Вы можете использовать команду Test-NetConnection для проверки только TCP-портов. Например, чтобы проверить, открыт ли TCP-порт 25 (протокол SMTP) на удаленном почтовом сервере:
Test-NetConnection -ComputerName ny-msg01 -Port 25
Команда Test-NetConnection имеет псевдоним TNC. Сокращенная версия той же команды выглядит следующим образом:
TNC ny-msg01 -Port 25
Давайте посмотрим на результат выполнения команды:
ComputerName : ny-msg01 RemoteAddress : 10.20.1.7 RemotePort : 25 InterfaceAlias : CORP SourceAddress : 10.20.1.79 PingSucceeded : True PingReplyDetails (RTT) : 0 ms TcpTestSucceeded : True
Как видите, команда преобразует имя сервера в IP-адрес, проверяет ICMP-ответ (аналогично ping
), и проверяет ответ с TCP-порта (доступность порта). Указанный сервер отвечает по протоколу ICMP (PingSucceeded = True
) и порт TCP 25 открыт (RemotePort=25, TcpTestSucceeded= True
).
Если вы запустите программу Test-NetConnection без параметров, он проверит, подключен ли компьютер к Интернету (проверяет доступность internetbeacon.msedge.net
хоста).
Вы можете добавить параметр —ИнформацияУровень детализации опция для отображения подробной информации при проверке удаленного TCP-порта:
TNC 192.168.32.101 -Port 3389 -InformationLevel Detailed
Команда имеет специальный параметр —CommonTCPPort, который позволяет указать имя известного сетевого протокола (HTTP, RDP, SMB, WINRM).
Например, для проверки доступности веб-сервера HTTP можно использовать команду:
Test-NetConnection -ComputerName woshub.com -CommonTCPPort HTTP
Или проверьте доступность порта RDP по умолчанию (TCP/3389):
Test-NetConnection ny-rds1 –CommonTCPPort RDP
Вы можете перечислить все параметры, которые возвращает команда Test-NetConnection:
Test-NetConnection ny-man01 -port 445|Format-List *
Если вам нужно только проверить, доступен ли порт, его можно проверить быстрее:
TNC ny-msg1 -Port 25 -InformationLevel Quiet
Команда возвращает True
, что означает, что удаленный TCP-порт открыт.
(New-Object System.Net.Sockets.TcpClient).Connect('ny-msg01', 25)
Команду Test-NetConnection можно использовать для трассировки маршрута к удаленному серверу с помощью параметра —TraceRoute параметр (аналогичный встроенному tracert
команда в Windows). Вы можете ограничить максимальное количество переходов при проверке маршрута с помощью параметра -Hops параметр.
Test-NetConnection ny-man01 –TraceRoute
Команда возвращает суммарную задержку доступа к сети в миллисекундах (PingReplyDetails (RTT): 41 ms
), а также все IP-адреса маршрутизаторов на пути к узлу назначения.
PowerShell: Проверка наличия открытых портов на нескольких хостах
Вы можете использовать PowerShell для проверки доступности определенного порта на нескольких удаленных компьютерах. Сохраните список имен хостов или IP-адресов в обычном текстовом файле с именем servers.txt
.
Например, ваша задача — найти хосты, на которых порт TCP/25 не отвечает или закрыт в списке серверов:
Get-Content c:\PS\list_servers.txt | where { -NOT (Test-Netconnection $_ -Port 25 -InformationLevel Quiet)}| Format-Table -AutoSize
Можно использовать простой сценарий мониторинга PowerShell, который проверяет доступность удаленных серверов и выводит всплывающее уведомление, если какой-либо из серверов недоступен.
Например, можно проверить доступность основных служб на всех контроллерах домена во время проверки работоспособности AD (список DC можно получить с помощью команды Get-ADDomainController). Давайте проверим следующие службы на DC (есть аналогичная команда ‘Домен и трасты‘ правило в инструменте PortQry):
- RPC — TCP/135
- LDAP — TCP/389
- LDAP — TCP/3268
- DNS — TCP/53
- Kerberos — TCP/88
- SMB — TCP/445
$Ports = "135","389","636","3268","53","88","445","3269", "80", "443"
$AllDCs = Get-ADDomainController -Filter * | Select-Object Hostname,Ipv4address
ForEach($DC in $AllDCs){
Foreach ($P in $Ports){
$check=Test-NetConnection $DC.Ipv4address -Port $P -WarningAction SilentlyContinue
If ($check.tcpTestSucceeded -eq $true)
{Write-Host $DC.hostname $P -ForegroundColor Green -Separator " => "}
else
{Write-Host $DC.hostname $P -Separator " => " -ForegroundColor Red}
}
}
Сценарий проверяет указанные TCP-порты на контроллерах домена, и если какой-либо из портов недоступен, он выделяет его красным цветом (вы можете запустить этот сценарий PowerShell в качестве службы Windows).
Простой сканер портов TCP/IP в PowerShell
С помощью PowerShell можно реализовать простой IP-сканер, который сканирует удаленные хосты или IP-подсети на наличие открытых/закрытых TCP-портов.
Чтобы просканировать диапазон IP-адресов между 192.168.1.100 и 192.168.1.150, отобразите компьютеры, на которых открыт порт 3389:
foreach ($ip in 100..150) {Test-NetConnection -Port 3389 -InformationLevel "Detailed" 192.168.1.$ip}
Сканирование диапазона TCP-портов (от 1 до 1024) на удаленном хосте:
foreach ($port in 1..1024) {If (($a=Test-NetConnection srvfs01 -Port $port -WarningAction SilentlyContinue).tcpTestSucceeded -eq $true){ "TCP port $port is open!"}}
Как составить список открытых портов в Windows с помощью PowerShell
Используйте Get-NetTCPConnection Команда перечислит порты, открытые на локальном компьютере (это эквивалент PowerShell для NETSTAT
). Список всех открытых TCP-портов на компьютере можно просмотреть следующим образом:
Get-NetTcpConnection -State Listen | Select-Object LocalAddress,LocalPort| Sort-Object -Property LocalPort | Format-Table
Если вы хотите узнать, какая программа (процесс) прослушивает определенный порт на вашем компьютере, используйте следующую команду (где 443 — номер порта, который вы хотите проверить):
Get-Process -Id (Get-NetTCPConnection -LocalPort 443).OwningProcess | ft Id, ProcessName, UserName, Path