Открытый порт — это процесс, который принимает входящие соединения. Если порт занят неожиданной программой, это либо конфликт при запуске сервиса, либо повод разобраться, что именно слушает сеть.
Что решает эта инструкция
Вы узнаете, какие TCP-порты сейчас открыты на машине, в каком они состоянии и какой процесс за каждым стоит. Это база для диагностики конфликтов портов и для проверки, не слушает ли лишнего что-то неожиданное.
Когда это нужно
- Сервис не стартует с ошибкой вида
address already in use - Нужно проверить, действительно ли приложение слушает нужный порт
- Аудит: какие службы принимают соединения извне
- Проверка после настройки файрвола
Что потребуется
- Локальный доступ к Windows или RDP
- Командная строка или PowerShell от имени администратора — без повышения прав вы не увидите PID чужих процессов
Способ 1: netstat
Работает во всех версиях Windows, включая старые.
netstat -ano | findstr LISTENING
Разбор ключей:
-a— показать все соединения и слушающие порты-n— не резолвить имена, выводить числовые адреса и порты (сильно быстрее)-o— добавить колонку PID процесса
Типичный вывод:
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1084
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 1516
Адрес 0.0.0.0 означает «на всех интерфейсах», то есть порт доступен извне. Если там 127.0.0.1 — порт слушает только локально и снаружи недоступен.
Чтобы узнать имя процесса по PID:
tasklist /FI "PID eq 1516"
Способ 2: PowerShell
Удобнее, когда нужно сразу видеть имя процесса без второго шага.
Get-NetTCPConnection -State Listen |
Select-Object LocalAddress, LocalPort, OwningProcess,
@{Name='Process'; Expression={ (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName }} |
Sort-Object LocalPort |
Format-Table -AutoSize
Вычисляемое свойство Process подтягивает имя процесса по его PID. -ErrorAction SilentlyContinue нужен потому, что часть системных процессов недоступна даже администратору — без него консоль засыплет красными ошибками.
Проверить один конкретный порт:
Get-NetTCPConnection -LocalPort 443 -ErrorAction SilentlyContinue
Совет. Get-NetTCPConnection появился в Windows 8 и Server 2012. На более старых системах остаётся только netstat.
Способ 3: Resource Monitor
Графический вариант, когда нужно быстро осмотреться.
- Нажмите Win + R, введите
resmon - Перейдите на вкладку Сеть
- Разверните раздел Порты прослушивания
Там же видно, разрешён порт в брандмауэре или заблокирован — колонка «Состояние брандмауэра».
Проверка результата
Найдите процесс, который держит нужный порт:
$port = 8080
Get-NetTCPConnection -LocalPort $port -State Listen -ErrorAction SilentlyContinue |
ForEach-Object { Get-Process -Id $_.OwningProcess }
Если вывод пустой — порт свободен, и ошибка «порт занят» приходит откуда-то ещё.
Возможные проблемы
PID = 0 или 4
PID 4 — это процесс System, за ним стоит ядро и драйвер http.sys. Порты 445 (SMB) и 135 (RPC) висят именно на нём. Такой порт нельзя «убить» через диспетчер задач, нужно отключать соответствующую службу.
Порт занят, но процесса не видно
Скорее всего это HTTP.sys — системный драйвер, который резервирует URL-префиксы. Посмотрите резервации:
netsh http show urlacl
Порт в состоянии TIME_WAIT
Это не занятость, а хвост закрытого соединения. Освободится сам через 2 минуты. Ждать не обязательно: приложение может биндиться с опцией SO_REUSEADDR.
Осторожно. Не завершайте процессы с PID 4 и не отключайте службы вслепую — можно потерять доступ к машине по RDP или сломать доменную аутентификацию. Сначала выясните, что за служба, потом решайте.
Итог
Для быстрой проверки — netstat -ano | findstr LISTENING. Для регулярной работы и скриптов — Get-NetTCPConnection, он сразу отдаёт объекты, которые можно фильтровать и экспортировать. Ключевое, на что смотреть: локальный адрес (0.0.0.0 против 127.0.0.1) и PID владельца.