Как узнать, какой процесс прослушивает порт в Windows?

2275

Как узнать, какой процесс прослушивает порт в Windows?

Readonly
источник
3
Currports - это инструмент, который также помогает искать и фильтровать. Nirsoft.net/utils/cports.html
Blue Clouds,
1
Я столкнулся с этим, пытаясь запустить Tomcat в режиме отладки под IntelliJ. Лучшим решением для меня оказалось изменение конфигурации транспортного средства отладки (File-> Settings-> Build / exe / deploy-> Debugger) с "socket" на "Общая память".
TMN

Ответы:

2624

Новый ответ, powershell

Get-Process -Id (Get-NetTCPConnection -LocalPort portNumber).OwningProcess

Старый ответ, cmd

 C:\> netstat -a -b

(Добавьте -n, чтобы остановить попытки разрешения имен хостов, что сделает его намного быстрее.)

Обратите внимание на рекомендацию датчанина для TCPView . Это выглядит очень полезно!

-a Отображает все соединения и порты прослушивания.

-b Отображает исполняемый файл, участвующий в создании каждого соединения или порта прослушивания. В некоторых случаях известные исполняемые файлы содержат несколько независимых компонентов, и в этих случаях отображается последовательность компонентов, участвующих в создании соединения или порта прослушивания. В этом случае имя исполняемого файла находится в [] внизу, вверху - компонент, который он вызвал, и так далее, пока не будет достигнут TCP / IP. Обратите внимание, что этот параметр может занять много времени и завершится ошибкой, если у вас нет достаточных разрешений.

-n Отображает адреса и номера портов в числовой форме.

-o Отображает идентификатор процесса-владельца, связанный с каждым соединением.

Брэд Уилсон
источник
252
-о, чтобы получить PID
Лоран К
121
и taskkill / PID <pid>, чтобы затем завершить процесс, используя / F, если необходимо.
BitMask777
81
Возможно, вам придется запустить оболочку командной строки от имени администратора, в противном случае вы можете получить сообщение об ошибке о недостаточных привилегиях. Используйте параметр «Запуск от имени администратора» при щелчке правой кнопкой мыши cmd.exe.
Грубер
6
Работает, но требует повышенного разрешения. Shift + щелчок правой кнопкой мыши на значке команды -> запуск от имени администратора
Кристиан Бонджорно
18
Получив PID - скажем так 1234- тогда вы можете использовать, tasklist /fi "pid eq 1234"чтобы узнать название и другие детали процесса.
Стив Чемберс
2204

Есть родной графический интерфейс для Windows:

  • Меню Пуск → Все программыСтандартныеСистемные инструментыМонитор ресурсов

Или запустить resmon.exe , или из вкладки производительности диспетчера задач .

Введите описание изображения здесь

bcorso
источник
41
Также показывает состояние брандмауэра привязки (последний столбец). Очень полезный
Рафаэль
8
Вы должны быть администратором (или в этой группе), чтобы запустить это.
КришПрабакар
2
@bcorso, что значит привязка к " не указанному адресу "?
Pacerier
5
Также может быть запущен из вкладки «Диспетчер задач», по крайней мере, в Windows 10. (Не проверял другие версии.)
Матье К.
10
Комментарий @ user4836454, приведенный выше, НЕ верен: монитор ресурсов показывает порты со слушателями, даже если к этим портам нет сетевого подключения. Просто загляните в раздел «Порты прослушивания» вместо раздела «TCP-соединения».
Jpsy
235

Используйте TCPView, если вы хотите графический интерфейс для этого. Это старое приложение Sysinternals, которое Microsoft купила.

датчанин
источник
9
На мой взгляд, это лучший вариант, тем более что все процессы находятся в одном списке, и вы можете закрыть процессы, щелкнув по ним правой кнопкой мыши.
Андреас Лундгрен
8
Кроме того, это не требует прав администратора!
Янак Мина
222

Для Windows:

netstat -aon | find /i "listening"
Ака
источник
25
+1 Но имейте в виду, что если ваши окна работают на языке, отличном от английского, вам придется изменить «прослушивание» на родной термин. Например, netstat -aon | find /i "abhören"для немецкого.
Левит
2
В моем случае это не сработало, возможно, из-за знака кавычек, но решение netstat -aon | findstr LISTENING работает отлично!
Крестный отец
Это работает, не требуя повышенных привилегий.
Влад Шнаковски
1
Я получаю сообщение об ошибке при попытке выполнить эту команду на W10 15063.729 с помощью PowerShell:FIND: Parameter format not correct
Nicke Manarin
1
Как этот ответ относится к "выяснить, какой процесс [имя] прослушивает порт в Windows?"
Павел Cioch
137

Ключ -b, упомянутый в большинстве ответов, требует наличия прав администратора на компьютере. Вам не нужны повышенные права, чтобы получить имя процесса!

Найдите pid процесса, запущенного по номеру порта (например, 8080)

netstat -ano | findStr "8080"

Найти имя процесса по pid

tasklist /fi "pid eq 2216"

найти процесс по порту TCP / IP

Рам Шарма
источник
82

Вы можете получить больше информации, если выполните следующую команду:

netstat -aon | find /i "listening" |find "port"

Использование команды «Найти» позволяет фильтровать результаты. find /i "listening"будут отображаться только порты, которые «слушают». Обратите внимание, что вам нужно /iигнорировать регистр, иначе вы наберете find "LISTENING". | find "port"будет ограничивать результаты только теми, которые содержат конкретный номер порта. Обратите внимание, что при этом он также будет фильтровать результаты, которые имеют номер порта в любом месте строки ответа.

Nathan24
источник
8
FWIW при попытке запустить это в PowerShell v2.0 выдает ошибку FIND: Parameter format not correct. Вам нужно добавить пробел после критерия поиска. Это оставит вас с netstat -aon | find /i "listening" | find "1234 ".
Я.
2
Замените "порт" выше на свой порт, например, "5000"
jbooker
1
@self. Я все еще получаю эту ошибку с PS 5.1, даже после добавления пробела после канала. Вы знаете, что происходит?
Nicke Manarin
2
@NickeManarinin & @self либо сначала перейдите с powershell на cmd (просто введите cmd и нажмите enter, затем повторите команду), либо вместо этого используйте powershell: netstat -aon | find / i " {back tick}" listening {back tick}"" | find " {back tick}" port {back tick}" «(<- обратите внимание на экранированные кавычки - извините за термин, back tickпоскольку я не могу добавить фактического персонажа, так как он считает, что это отрывок)
Тристан ван Дам
72
  1. Откройте окно командной строки (от имени администратора). В поле «Пуск \ Поиск» введите «cmd», затем щелкните правой кнопкой мыши «cmd.exe» и выберите «Запуск от имени администратора».

  2. Введите следующий текст и нажмите Enter.

    netstat -abno

    -a Отображает все соединения и порты прослушивания.

    -b Отображает исполняемый файл, участвующий в создании каждого соединения или порта прослушивания. В некоторых случаях известные исполняемые файлы содержат несколько независимых компонентов, и в этих случаях отображается последовательность компонентов, участвующих в создании соединения или порта прослушивания. В этом случае имя исполняемого файла находится в [] внизу, вверху - компонент, который он вызвал, и так далее, пока не будет достигнут TCP / IP. Обратите внимание, что этот параметр может занять много времени и завершится ошибкой, если у вас нет достаточных разрешений.

    -n Отображает адреса и номера портов в числовой форме.

    -o Отображает идентификатор процесса-владельца, связанный с каждым соединением.

  3. Найдите порт, который вы слушаете, в разделе «Локальный адрес».

  4. Посмотрите на имя процесса прямо под этим.

ПРИМЕЧАНИЕ. Чтобы найти процесс в диспетчере задач

  1. Обратите внимание на PID (идентификатор процесса) рядом с портом, который вы просматриваете.

  2. Откройте диспетчер задач Windows.

  3. Выберите вкладку «Процессы».

  4. Найдите PID, который вы указали, когда выполняли netstat на шаге 1.

    • Если вы не видите столбец PID, нажмите View / Select Columns. Выберите PID.

    • Убедитесь, что выбран параметр «Показывать процессы от всех пользователей».

Киборг
источник
56

Получить PID и имя изображения

Используйте только одну команду:

for /f "tokens=5" %a in ('netstat -aon ^| findstr 9000') do tasklist /FI "PID eq %a"

где 9000следует заменить номер вашего порта.

Выход будет содержать что - то вроде этого:

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
java.exe                      5312 Services                   0    130,768 K

Объяснение:

  • он перебирает каждую строку из вывода следующей команды:

    netstat -aon | findstr 9000
    
  • из каждой строки %aизвлекается PID ( имя здесь не важно) (PID является элементом 5th в этой строке) и передается следующей команде

    tasklist /FI "PID eq 5312"
    

Если вы хотите , чтобы пропустить на заголовок и возвращение командной строки , вы можете использовать:

echo off & (for /f "tokens=5" %a in ('netstat -aon ^| findstr 9000') do tasklist /NH /FI "PID eq %a") & echo on

Вывод:

java.exe                      5312 Services                   0    130,768 K
ROMANIA_engineer
источник
2
Хороший ответ, но вы должны изменить его, findstr :9000если нет, вы даже найдете приложения, содержащие номер (например, при поиске «80» вы найдете приложения и на портах 80, 800, 8000).
Radon8472
48

Сначала мы находим идентификатор процесса той конкретной задачи, которую нам нужно устранить, чтобы освободить порт:

Тип

netstat -n -a -o

После выполнения этой команды в командной строке Windows (cmd) выберите pid, который я считаю последним столбцом. Предположим, это 3312.

Сейчас типа

taskkill /F /PID 3312

Теперь вы можете перепроверить, набрав netstatкоманду.

ПРИМЕЧАНИЕ: иногда Windows не позволяет вам запускать эту команду непосредственно на CMD, поэтому сначала вам нужно выполнить следующие шаги:

Из меню «Пуск» -> командная строка (щелкните правой кнопкой мыши на командной строке и запустите от имени администратора)

Панкай Патерия
источник
30

Чтобы получить список всех идентификаторов процессов-владельцев, связанных с каждым соединением:

netstat -ao |find /i "listening"

Если вы хотите убить какой-либо процесс, имейте ID и используйте эту команду, чтобы порт стал свободным

Taskkill /F /IM PID of a process
Монис Маджид
источник
1
это не учитывает прослушивание портов UDP
evandrix
27

Получить номер порта из PID в Windows очень просто.

Ниже приведены шаги:

  1. Перейти к запуску → введите CMD → нажмите Enter.

  2. Напишите следующую команду ...

    netstat -aon | findstr [port number]
    

    (Примечание: не используйте квадратные скобки.)

  3. Нажмите Enter...

  4. Затем cmd сообщит вам подробности службы, работающей на этом порту, вместе с PID.

  5. Откройте диспетчер задач, перейдите на вкладку службы и сопоставьте PID с идентификатором cmd, и все.

Нишат Лахани
источник
18

Просто откройте командную оболочку и введите (скажем, ваш порт 123456):

netstat -a -n -o | find "123456"

Вы увидите все, что вам нужно.

Заголовки:

 Proto  Local Address          Foreign Address        State           PID
 TCP    0.0.0.0:37             0.0.0.0:0              LISTENING       1111

Это как упомянуто здесь .

Тайвеер Сингх Ниджар
источник
1
К вашему сведению / для всех, кто заинтересован: либо findstr 123456(без кавычек), либо find "123456"(с кавычками). (@Josh)
Кевин Круйссен
18

Чтобы узнать, какой конкретный процесс (PID) использует какой порт:

netstat -anon | findstr 1234

Где 1234 - PID вашего процесса. [Перейдите в Диспетчер задач → Служба / вкладка Процессы, чтобы узнать PID вашего приложения.]

Талха Имам
источник
2
Следует отметить, что вам не нужно устанавливать -nфлаг дважды. -anoдостаточно.
mwieczorek
16

В PowerShell 5 в Windows 10 или Windows Server 2016 запустите Get-NetTCPConnectionкомандлет. Я думаю, что это также должно работать на старых версиях Windows.

Вывод по умолчанию Get-NetTCPConnectionне включает идентификатор процесса по некоторым причинам, и это немного сбивает с толку. Однако вы всегда можете получить его, отформатировав вывод. Собственность, которую вы ищете, есть OwningProcess.

  • Если вы хотите узнать идентификатор процесса, который прослушивает порт 443, выполните эту команду:

    PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-List
    
    LocalAddress   : ::
    LocalPort      : 443
    RemoteAddress  : ::
    RemotePort     : 0
    State          : Listen
    AppliedSetting :
    OwningProcess  : 4572
    CreationTime   : 02.11.2016 21:55:43
    OffloadState   : InHost
    
  • Отформатируйте вывод в таблицу со свойствами, которые вы ищете:

    PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-Table -Property LocalAddress, LocalPort, State, OwningProcess
    
    LocalAddress LocalPort  State OwningProcess
    ------------ ---------  ----- -------------
    ::                 443 Listen          4572
    0.0.0.0            443 Listen          4572
    
  • Если вы хотите узнать имя процесса, выполните эту команду:

    PS C:\> Get-Process -Id (Get-NetTCPConnection -LocalPort 443).OwningProcess
    
    Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
    -------  ------    -----      -----     ------     --  -- -----------
    143      15     3448      11024              4572   0 VisualSVNServer
    
bahrep
источник
13

Введите в команду: netstat -aon | findstr :DESIRED_PORT_NUMBER

Например, если я хочу найти порт 80: netstat -aon | findstr :80

Этот ответ был первоначально отправлен на этот вопрос .

Technotronic
источник
11

Netstat:

  • -a отображает все порты подключения и прослушивания
  • -b отображает исполняемые файлы
  • -n stop разрешить имена хостов (числовая форма)
  • -в владении процессом

    netstat -bano | findstr "7002"
    
    netstat -ano > ano.txt 
    

Инструмент Currports помогает искать и фильтровать

Синие облака
источник
11
  1. Откройте командную строку - старт → Runcmdили меню Пуск → Все программыПринадлежностиCommand Prompt .

  2. Тип

    netstat -aon | findstr '[port_number]'
    

Замените [port_number]фактическим номером порта, который вы хотите проверить, и нажмите Enter.

  1. Если порт используется каким-либо приложением, то будут показаны подробности этого приложения. Номер, который показан в последнем столбце списка, представляет собой PID (идентификатор процесса) этого приложения. Запишите это.
  2. Тип

    tasklist | findstr '[PID]'
    

Замените на [PID]число из вышеприведенного шага и нажмите Enter.

  1. Вам будет показано имя приложения, которое использует номер вашего порта.
Анатоль АБЕ
источник
3
На Win 10: Ваша команда на шаге 2 и шаге 4 не будет работать, если вы не замените простые кавычки на двойные. Должен сказать, netstat -aon | findstr "[номер_порта]"
Леонардо Лопес
Это решение не требует повышенного разрешения. Tks!
Всего
10

netstat -aoи netstat -abсообщит вам приложение, но если вы не являетесь системным администратором, вы получите «Запрошенная операция требует повышения прав».

Это не идеально, но если вы используете Process Explorer от Sysinternals, вы можете перейти к свойствам определенных процессов и посмотреть на вкладку TCP, чтобы увидеть, используют ли они интересующий вас порт. Это что-то вроде иголки и стога сена. вещь, но, может быть, это поможет кому-то ...

Тони Делрой
источник
Если вы не являетесь администратором, вы не сможете использовать Process Explorer (или даже Windows Task Manager> Resource Manager), чтобы получить эту информацию от любого процесса, который не принадлежит вам с самого начала.
Авель
9

Я рекомендую CurrPorts от NirSoft.

CurrPorts может фильтровать отображаемые результаты. TCPView не имеет этой функции.

Примечание. Вы можете щелкнуть правой кнопкой мыши соединение сокета процесса и выбрать «Закрыть выбранные соединения TCP» (вы также можете сделать это в TCPView). Это часто устраняет проблемы с подключением к Outlook и Lync после переключения VPN. С помощью CurrPorts вы также можете закрывать соединения из командной строки с помощью параметра «/ close».

мистифицировать
источник
7

Единственное решение, которое мне помогает, это одно. Просто замените 3000 своим портом:

$P = Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess; Stop-Process $P.Id

Изменить: Изменены killк Stop-Processдля более PowerShell-подобного языка

Ангел венчев
источник
6
Вы, вероятно, не хотите убивать процесс автоматически. Я бы отделил эту команду kill и объяснил бы это. Не хочу, чтобы кто-то плохо копировал это, не задумываясь.
TinkerTenorSoftwareGuy
1
И если вы собираетесь полностью заменить решение PowerShell на Stop-Process Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess | Stop-Process
CubanX
6

Используйте следующие инструменты: Из cmd : C:\> netstat -anobс правами администратора .

Process Explorer

Дамп процесса

Порт Монитор

Все из sysinternals.com.

Если вы просто хотите узнать, какой процесс запущен и какие потоки находятся под каждым процессом, я рекомендую вам узнать об этом wmic. Это замечательный инструмент командной строки, который дает вам гораздо больше, чем вы можете себе представить.

Пример:

c:\> wmic process list brief /every:5

Приведенная выше команда будет отображать список всех процессов в течение коротких 5 секунд. Чтобы узнать больше, вы можете просто пойти с /?командой Windows, например,

c:\> wmic /?
c:\> wmic process /?
c:\> wmic prcess list /?

И так далее. :)

Perl Fanatic
источник
PortMon (ссылка за Port Monitor) предназначен для мониторинга последовательных и параллельных портов, а не сетевых портов.
Джеймс
6

Использование:

netstat -a -o

Это показывает PID процесса, запущенного на определенном порту.

Имейте в виду идентификатор процесса и перейдите к диспетчеру задач и вкладке служб или сведений и завершите процесс с тем же идентификатором PID.

Таким образом, вы можете убить процесс, запущенный на определенном порту в Windows.

Ниша
источник
6

Для тех, кто использует PowerShell, попробуйте Get-NetworkStatistics:

> Get-NetworkStatistics | where Localport -eq 8000


ComputerName  : DESKTOP-JL59SC6
Protocol      : TCP
LocalAddress  : 0.0.0.0
LocalPort     : 8000
RemoteAddress : 0.0.0.0
RemotePort    : 0
State         : LISTENING
ProcessName   : node
PID           : 11552
mikemaccana
источник
5

Используя PowerShell ... ... это будет ваш друг (замените 8080 на номер вашего порта):

 netstat -abno | Select-String -Context 0,1 -Pattern 8080

Образец вывода

>   TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING         2920
   [tnslsnr.exe]
>   TCP    [::]:8080              [::]:0                 LISTENING         2920
   [tnslsnr.exe]

Таким образом, в этом примере tnslsnr.exe (база данных OracleXE) прослушивает порт 8080.

Быстрое объяснение

  • Select-Stringиспользуется для фильтрации длинного вывода netstatдля соответствующих строк.
  • -Pattern проверяет каждую строку на соответствие регулярному выражению
  • -Context 0,1 будет выводить 0 ведущих строк и 1 завершающую строку для каждого совпадения паттерна.
Jpsy
источник
2

Для Windows, если вы хотите найти материал, прослушивающий или подключенный к порту 1234, выполните следующую команду в командной строке:

netstat -na | find "1234"
Zoomzoom
источник
1

Используйте приведенный ниже пакетный скрипт, который принимает имя процесса в качестве аргумента и выдает netstatрезультат для процесса.

@echo off
set procName=%1
for /f "tokens=2 delims=," %%F in ('tasklist /nh /fi "imagename eq %1" /fo csv') do call :Foo %%~F
goto End

:Foo
set z=%1
echo netstat for : "%procName%" which had pid "%1"
echo ----------------------------------------------------------------------

netstat -ano |findstr %z%
goto :eof

:End
дешеприя дебеш
источник
1

Основываясь на ответах с информацией и убийством , для меня полезно объединить их в одну команду . И вы можете запустить это из cmd, чтобы получить информацию о процессе, который прослушивает данный порт (пример 8080):

for /f "tokens=3 delims=LISTENING" %i  in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @tasklist /nh /fi "pid eq %i"

Или, если вы хотите убить его:

for /f "tokens=3 delims=LISTENING" %i  in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @Taskkill /F /IM %i

Вы также можете поместить эти команды в файл летучей мыши (они будут немного отличаться - заменить %iна %%i):

файл portInfo.bat

for /f "tokens=3 delims=LISTENING" %%i  in (
    'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @tasklist /nh /fi "pid eq %%i"

файл portKill.bat

for /f "tokens=3 delims=LISTENING" %%i  in (
    'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @Taskkill /F /IM %%i

Тогда вы из cmd можете сделать это:

portInfo.bat 8080

или

portKill.bat 8080

lczapski
источник
1
Это может быть полезным сценарием. Тем не менее, я попробовал это в CMD, а также PowerShell 6 без удачи. Возможно, вы могли бы улучшить свой ответ, предоставив немного больше деталей.
Манфред
Первая часть работает? Это только проблема с "летучей мышью"? Существуют некоторые различия в передаче переменных: (%% i)
lczapski
@Manfred Я пробовал это на 3 разных Windows 10. Например, .\portInfo.bat 800в PowerShell это дает что-то вроде этого:C:\work>for /F "tokens=3 delims=LISTENING" %i in ('netstat -ano | findStr "800" | findStr "["') do (tasklist /fi "pid eq %i" ) C:\work>(tasklist /fi "pid eq 4" ) Image Name PID Session Name Session# Mem Usage ========================= ======== ================ =========== ============ System 4 Services 0 1,820 K
lczapski
Извините, не повезло. Я поместил эту команду в файл с именем portInfo.batв терминале powershell, а затем выполнил .\portInfo.bat 8080. Вывод был просто содержимым командного файла. Очень хорошо, что я что-то упускаю. Обратите внимание, я использую PowerShell 6.2.3 в Windows 10. Я также пробовал это в обычной командной строке, но результат был тот же: вывод содержимого скрипта. Я уверен, что мне не хватает важной информации, чтобы сделать эту работу.
Манфред
1
Почему бы не добавить /nh: @tasklist /nh /fi "pid eq %i"? И именно дверь:Findstr ":8080"
Это был не я
0

В моем случае порт (3000) вообще не использовался и не виден в netstat. Но! Деинсталлятор Docker для Windows решил проблему.

Тони Сепия
источник