В PowerShell есть удобный командлет Test-NetConnection
, который позволяет проверять доступность удаленного сервера или службы, тестировать блокировку TCP-портов (например, файрволом), а также проверять работу ICMP (ping) и маршрутизацию. Он фактически заменяет традиционные утилиты вроде ping, tracert, telnet, а также функции сканера портов.
- Проверка TCP-порта через Test-NetConnection
- Проверка порта на множестве хостов
- Сканер IP-диапазона через PowerShell
- Вывод списка прослушиваемых портов
Проверка TCP-порта через Test-NetConnection
Командлет Test-NetConnection
работает только с **TCP**. Чтобы проверить, открыт ли на удаленном хосте порт TCP (например, порт 25 — SMTP), можно выполнить:
Test-NetConnection -ComputerName msk-msg01 -Port 25
Сокращенный вариант — TNC msk-mail1 -Port 25
. Обратите внимание: **для UDP-портов** этот командлет **не подходит**.
Пример вывода:
ComputerName : msk-msg01 RemoteAddress : 10.10.1.7 RemotePort : 25 InterfaceAlias : CORP SourceAddress : 10.10.1.70 PingSucceeded : True PingReplyDetails (RTT) : 0 ms TcpTestSucceeded : True
В этом отчёте видно, что: — удалённый сервер успешно отвечает на ICMP (ping) — PingSucceeded = True
, — TCP-порт 25 доступен — TcpTestSucceeded = True
. Если PingSucceeded = False
, но TcpTestSucceeded = True
, это может означать, что ICMP-пакеты блокируются (например, firewall’ом).
Если запустить Test-NetConnection
без аргументов, он проверит, есть ли подключение к Интернету, опрашивая узел internetbeacon.msedge.net
.
Для вывода расширенной диагностики используется параметр -InformationLevel Detailed
, например:
TNC 192.168.31.102 -Port 3389 -InformationLevel Detailed
Также есть параметр -CommonTCPPort
, который позволяет быстро проверить популярные сервисы (HTTP, RDP, SMB и др.). Например:
Test-NetConnection -ComputerName winitpro.ru -CommonTCPPort HTTP Test-NetConnection msk-rds1 -CommonTCPPort RDP
Вывести **все** свойства проверки можно так:
Test-NetConnection msk-man01 -Port 445 | Format-List *
А чтобы получить минимальный результат (да/нет для TCP-порта), можно использовать:
TNC msk-mail1 -Port 25 -InformationLevel Quiet
> ⚠️ В старых версиях PowerShell (до версии 4.0) аналог можно получить через: > (New-Object System.Net.Sockets.TcpClient).Connect('msk-msg01', 25)
Командлет также поддерживает трассировку маршрута — -TraceRoute
(аналог tracert). Можно ограничить число хопов через -Hops
:
Test-NetConnection msk-man01 -TraceRoute
Проверка порта на множестве хостов
Можно автоматизировать проверку TCP-порта на списке серверов. Поместите список хостов или IP в текстовый файл, например, servers.txt
, и выполните:
Get-Content c:\Distr\servers.txt | Where { -not (Test-NetConnection $_ -Port 25 -InformationLevel Quiet) } | Format-Table -AutoSize
Этот однострочник выведет те хосты, на которых порт 25 **закрыт** или недоступен. Его можно встроить в простую систему мониторинга, чтобы оповещать при недоступности серверов.
Например, для контроллеров домена (DC) можно проверить множество общих сервисов (RPC, LDAP, DNS, SMB и др.):
$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 "=>" } else { Write-Host $DC.Hostname $P -ForegroundColor Red "=>" } } }
Этот небольшой скрипт проверит указанные TCP-порты на каждом контроллере домена и выделит недоступные порты красным цветом. Его можно запустить как службу Windows.
Сканер IP-диапазона через PowerShell
Можно сканировать диапазон IP-адресов на наличие открытого порта. Пример: просканировать IP с 10.10.10.5
до 10.10.10.30
на порт 3389:
foreach ($ip in 5..30) { Test-NetConnection -Port 3389 -InformationLevel Detailed 10.10.10.$ip }
Также можно просканировать множество портов на одном сервере (например, порты 1–1024):
foreach ($port in 1..1024) { $a = Test-NetConnection srvfs01 -Port $port -WarningAction SilentlyContinue If ($a.TcpTestSucceeded -eq $true) { "TCP порт $port открыт!" } }
SEO-тег: powershell-tcp-scan
Вывод списка прослушиваемых портов на локальной машине
Если нужно увидеть локальные открытые TCP-порты (эквивалент netstat
в PowerShell), используйте командлет:
Get-NetTcpConnection -State Listen | Select-Object LocalAddress,LocalPort | Sort-Object -Property LocalPort | Format-Table
Чтобы узнать, какой процесс держит конкретный порт (например, 443), можно выполнить:
Get-Process -Id (Get-NetTcpConnection -LocalPort 443).OwningProcess | Format-Table Id, ProcessName, UserName, Path
SEO-тег: get-nettcpconnection-прослушиваемые-порты
Командлет Test-NetConnection
— мощный инструмент для администраторов и инженеров, который позволяет проверять доступность TCP-портов, маршрутизацию, и даже служит простейшим сканером портов. В сочетании с PowerShell-скриптами он может упрощать мониторинг сетевой доступности в инфраструктуре.
Если нужна помощь с интеграцией этих решений под твою систему — напиши, помогу адаптировать скрипты под твой сценарий.
FAQ — Часто задаваемые вопросы
Что делает команда Test-NetConnection?
Она проверяет доступность удалённого узла или службы, диагностирует сетевое соединение и позволяет протестировать TCP-порт.
Можно ли проверить UDP-порты через Test-NetConnection?
Нет, командлет работает только с TCP. Для проверки UDP нужны другие инструменты.
Чем Test-NetConnection лучше ping или telnet?
Он объединяет возможности ping, tracert и telnet, предоставляет расширенную информацию и удобнее в автоматизации через PowerShell-скрипты.
Что делать, если ping не проходит, но TCP-порт открыт?
Это нормальная ситуация — часто ICMP-пакеты блокируются файрволом, но TCP-сервисы остаются доступны.
Как проверить сразу несколько серверов или портов?
Можно использовать цикл PowerShell (foreach) и командлет Get-Content для списка хостов или диапазонов IP-адресов.
Можно ли использовать Test-NetConnection для мониторинга?
Да, с помощью простых скриптов можно настроить регулярные проверки и даже автоматические оповещения.
Как узнать, какой процесс занимает конкретный порт?
Для этого используется командлет Get-NetTcpConnection
с указанием номера порта и последующим получением процесса через Get-Process
.