Что умеет командлет и где он доступен
Test-NetConnection — встроенный командлет PowerShell для проверки связи. Он заменяет сразу три привычных инструмента: ping для проверки достижимости, telnet для проверки порта и tracert для маршрута. Для него не нужно ничего устанавливать, а сокращённое имя tnc набирается быстрее.
Командлет входит в модуль сетевых средств Windows и доступен в Windows PowerShell 5.1 на современных версиях системы, а также в PowerShell 7 при запуске в Windows. В macOS и Linux его нет: там пользуйтесь nc, ping и traceroute.
Запуск без параметров проверяет доступ в интернет: он отправляет пробы на служебный узел и показывает результат. Чаще всего нужны параметры, приведённые ниже.
| Параметр | Что делает |
|---|---|
| -ComputerName | Имя или адрес узла (можно указать первым словом) |
| -Port | Номер TCP-порта для проверки |
| -CommonTCPPort | Готовое имя порта: HTTP, RDP, SMB, WINRM |
| -TraceRoute | Добавляет трассировку маршрута |
| -Hops N | Ограничивает число переходов при трассировке |
| -InformationLevel | Quiet возвращает True или False, Detailed — больше сведений |
Проверка порта: команда и разбор вывода
Основной вариант: Test-NetConnection example.com -Port 443. Командлет сначала разрешает имя, затем пробует ping, затем открывает TCP-соединение на указанном порту. Результат выводится списком полей.
Пример вывода (пример): ComputerName: example.com; RemoteAddress: 203.0.113.10; RemotePort: 443; InterfaceAlias: Ethernet; SourceAddress: 192.168.1.25; TcpTestSucceeded: True. Адрес взят из блока документации и служит иллюстрацией.
Главное поле — TcpTestSucceeded. Значение True означает, что соединение установлено. Значение False говорит, что подключиться не удалось, и рядом с ним PowerShell выдаст предупреждение вида TCP connect to (адрес : порт) failed. Поле PingSucceeded показывает результат проверки ICMP: узел может отвечать на ping и при этом быть недоступным по порту, либо наоборот, не отвечать на ping из-за фильтра, но принимать соединения. Поэтому ориентируйтесь именно на порт.
Поле InterfaceAlias подсказывает, через какой сетевой адаптер пошёл запрос, а SourceAddress — какой у вас адрес. Это удобно, если в системе несколько адаптеров, например Ethernet, Wi-Fi и виртуальные.
Скрипты и быстрые проверки
Для скриптов нужен короткий ответ. Команда Test-NetConnection example.com -Port 443 -InformationLevel Quiet вернёт только True или False. Такой результат можно использовать в условии: if (Test-NetConnection 192.168.1.20 -Port 3389 -InformationLevel Quiet) { "доступен" }. Чтобы проверить несколько портов, подойдёт цикл: 22,80,443 | ForEach-Object { Test-NetConnection example.com -Port $_ | Select-Object RemotePort, TcpTestSucceeded }.
Для трассировки: Test-NetConnection example.com -TraceRoute выводит список узлов маршрута в поле TraceRoute. Это удобное дополнение к tracert, хотя менее подробное: нет времён по каждому шагу.
Для типовых служб пригодятся готовые имена: Test-NetConnection 192.168.1.30 -CommonTCPPort RDP проверит порт удалённого рабочего стола, а WINRM — порт удалённого управления. Так меньше шансов ошибиться в номере порта.
- Откройте PowerShell (не обязательно от имени администратора).
- Выполните команду с нужным узлом и портом.
- Найдите поле TcpTestSucceeded и запишите значение.
- Если False, выполните проверку с другого устройства в той же сети и с проводного подключения, чтобы отделить проблему узла от проблемы канала.
- Повторите проверку после изменений правил брандмауэра или проброса портов.
Чем результат может обмануть
Успех проверки подтверждает только TCP-соединение. Служба за портом может быть неисправна, а веб-сервер способен отвечать ошибкой 500 при открытом порту. Неудача не всегда означает отсутствие службы: причиной бывает брандмауэр Windows, антивирус, фильтр на роутере или на стороне провайдера.
Командлет не проверяет UDP: порты этого типа он не поддерживает. Для DNS-проверки используйте Resolve-DnsName, а для UDP-служб — специальные инструменты. Обратите внимание и на то, что при проверке по имени команда использует кэш DNS-клиента: если запись недавно менялась, сбросьте кэш командой Clear-DnsClientCache.
Если после -Port для устройства в локальной сети получаете False, а с других компьютеров тот же порт открыт, проверьте профиль сети на проблемном компьютере и правила исходящих соединений. Иногда защитное программное обеспечение блокирует исходящие подключения на нестандартные порты.
Отличия от других систем и итоговый порядок проверки
В macOS и Linux аналогом служит nc -zv узел порт, для маршрута — traceroute или mtr, для ping — ping. Логика та же, вывод отличается. Для смешанной среды заведите шпаргалку: имя порта, команда для Windows и для Linux.
Чтобы диагностика шла быстро, идите по цепочке: DNS разрешает имя, ping показывает достижимость, порт подтверждает доступность службы, а трассировка отвечает на вопрос, где обрывается путь. Test-NetConnection даёт ответы на все четыре вопроса одной командой. Выполняйте проверки только для своих и разрешённых узлов и не запускайте их массово по чужим сетям.
Пример разбора реальной ситуации
Допустим, удалённый рабочий стол на компьютере в соседней комнате не подключается. Выполните Test-NetConnection с адресом компьютера и параметром -CommonTCPPort RDP. Если значение True, сеть в порядке, ищите проблему в учётных данных, настройках доступа или в самой программе клиента. Если False, а PingSucceeded равен True, компьютер жив, но порт закрыт: вероятно, удалённый доступ выключен или его блокирует брандмауэр на самом компьютере.
Если и ping не проходит, проверьте, включён ли компьютер, тот же ли у него адрес (роутер мог выдать другой), не изменилась ли сеть подключения на общедоступную, для которой правила строже. Свежий адрес компьютера смотрите командой ipconfig на нём самом либо в списке клиентов роутера. Так вы за минуту исключите половину версий и сузите поиск.
Ещё одна ситуация: сайт открывается в браузере, но не работает приложение. Проверьте порт, который использует приложение: иногда он нестандартный, и корпоративный или домашний фильтр пропускает только 80 и 443. Test-NetConnection с нужным портом сразу это покажет.