В 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.






