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

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

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

Показать лучший ответ

Currports - это инструмент, который помогает искать и фильтровать тоже nirsoft.net/utils/cports.html

Аватар TMN

Я столкнулся с этим, пытаясь запустить Tomcat в режиме отладки под IntelliJ. Лучшим решением для меня оказалось изменение конфигурации транспортного средства отладки (File-> Settings-> Build / exe / deploy-> Debugger) с "socket" на "Общая память".

PowerShell

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

CMD

  C:\> netstat -a -b
  

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

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

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

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

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

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

-о, чтобы получить PID

и taskkill / PID , чтобы затем завершить процесс, используя / F, если необходимо.

Возможно, вам придется запустить оболочку командной строки от имени администратора, в противном случае вы можете получить сообщение об ошибке о недостаточных привилегиях. Используйте параметр «Запуск от имени администратора» при щелчке правой кнопкой мыши cmd.exe.

Работает, но требует повышенного разрешения. Shift + щелчок правой кнопкой мыши на значке команды -> запустить от имени администратора

При использовании -o для отображения PID вы можете затем направить его в grep для номера порта (если установлен cygwin или msys), поскольку pid отображается в той же строке, а не в имени процесса, которое отображается в отдельной строке.

Иногда я не могу запустить свой сервер Apache httpd, потому что PID 4 по какой-то причине использует порт 80. Проблема в том, что процесс с PID 4 хорошо работает «Система». Перезапуск помогает, но если кто-то знает причину или способ выяснить, почему Система использует порт 80, я весь слух.

@BradWilson "-b" - неверный параметр, используйте netstat -a -d

@BradWilson и @Sathish Похоже, что параметры netstat не такие стандартные. Я должен был использовать netstat -a -n -p . Опции -b и -d недоступны. Опция -o была для таймеров. Опции -p отображают название программы и PID. (на Debian 8).

netstat 1.42 (2001-04-15) не имеет флага -b

Получив PID, скажем, 1234 , вы можете использовать tasklist /fi "pid eq 1234" , чтобы узнать название и другие детали процесса.

В моей системе выходные данные этой команды, помимо того, что их было ужасно сложно прочитать из-за переноса, переполнили буфер командной строки. Обычно я предпочитаю инструменты командной строки (хотя, по общему признанию, в командной строке Linux мне гораздо удобнее, чем в Windows), но в этом случае я нашел графический интерфейс Resource Monitor, предложенный @bcorso, гораздо более полезным.

@sebastian_t Для системного процесса (PID 4) есть netsh http show urlacl . Это показывает системное резервирование URL.

Использование | grep :80 полезно для поиска определенного порта. если установлен grep .

netstat -a -b переполнила весь экран cmd. Я не мог найти пид, который искал, прежде чем он ушел. Мне нужен был способ найти порт определенного процесса с использованием pid.

Код PowerShell на самом деле не работает, я получаю эту ошибку: Get-NetTCPConnection: Невозможно обработать преобразование аргумента для параметра 'LocalPort'. Невозможно преобразовать значение "portNumber" в тип "System.UInt16 []". Ошибка: «Невозможно преобразовать значение« portNumber »в тип« System.UInt16 ». Ошибка:« Входная строка была в неправильном формате. »»

Это не работает в PS3.0 - почему пользователи Windows больше не перечисляют версии? Для какой версии PowerShell эти команды?

@RodionSychev Команда powershell ожидает, что вы замените «номер_порта» номером порта, который вы ищете. Ошибка гласит, что «номер_порта» не является числом.

Аватар aku

Для Windows:

 netstat -aon | find /i "listening"
  

+1 Но имейте в виду, что если ваши окна работают на языке, отличном от английского, вам придется изменить «прослушивание» на родной термин. Например. netstat -aon | find /i "abhören" для немецкого языка.

В моем случае это не сработало, возможно, из-за знака кавычек, но решение netstat -aon | findstr LISTENING работает отлично!

Это работает, не требуя повышенных привилегий.

Я получаю сообщение об ошибке при попытке выполнить эту команду на W10 15063.729 с PowerShell: FIND: Parameter format not correct

Как этот ответ относится к "выяснить, какой процесс [имя] прослушивает порт в Windows?"

Аватар joe

Используйте // i вместо / i, если в Windows используется git bash

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

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

Кроме того, это не требует прав администратора!

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

  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, нажмите Просмотр / Выбор столбцов. Выберите PID.

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

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

Process Explorer

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

Монитор портов

Все с сайта sysinternals.com.

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

Пример:

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

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

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

И так далее, и тому подобное. :)

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

 netstat -a -o
  

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

Запомните идентификатор процесса и перейдите на Диспетчер задач и вкладку «Службы» или «Сведения» и завершите процесс с тем же PID.

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

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

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

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

FWIW при попытке запустить это в PowerShell v2.0 выдает ошибку FIND: Parameter format not correct . Вам нужно добавить пробел после критерия поиска. Это оставит вас с netstat -aon | find /i "listening" | find "1234 " .

Замените "порт" выше на ваш порт, например, "5000"

@self. Я все еще получаю эту ошибку с PS 5.1, даже после добавления пробела после канала. Вы знаете, что происходит?

@NickeManarinin & @self либо сначала перейдите с powershell на cmd (просто введите cmd и нажмите enter, затем повторите команду), либо вместо этого используйте powershell: netstat -aon | find / i "{back tick} " listen {back tick} "" | find "{back tick} " port {back tick} "" (<- обратите внимание на экранированные кавычки - извините термин back tick , так как я не могу добавьте фактического персонажа, так как он считает, что это отрывок)

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

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

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

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

 netstat -ao |find /i "listening"
  

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

 Taskkill /F /IM PID of a process
  

это не учитывает прослушивание портов UDP

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

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

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

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

Также показывает состояние брандмауэра привязки (последний столбец). Очень полезный

Вы должны быть администратором (или в этой группе), чтобы запустить это.

@bcorso, что означает привязка к не указанному адресу ?

Можно также запустить с вкладки «Диспетчер задач», по крайней мере, в Windows 10. (Другие версии не проверялись.)

Аватар RBT

Вы также можете запустить монитор ресурсов на вкладке производительности диспетчера задач, нажав кнопку Open Resource Monitor . Из командной строки perfmon /res также можно открыть монитор ресурсов.

Комментарий @ user4836454 выше НЕ верен: монитор ресурсов показывает порты со слушателями, даже если к этим портам нет сетевого подключения. Просто загляните в раздел «Порты прослушивания» вместо раздела «TCP-соединения».

Похоже, что некоторые из портов TCP, которые используются иногда, не используются, даже если они используются настолько, что другие приложения, которым они нужны, не могут запускаться.

По какой-то причине искомый pid не был указан в мониторе ресурсов. В конечном итоге пришлось запустить команду netstat.

@Pacerier Один интерфейс Ethernet может иметь несколько IP-адресов, назначенных ему (обычно на серверах). «Unspecified» означает, что он прослушивает порт по любому адресу, который использует сервер. Противоположным было бы показывать IP-адрес (а), на которые программа ответит.

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

Тип

 netstat -n -a -o
  

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

Теперь введите

 taskkill /F /PID 3312
  

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

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

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

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

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

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

Получить 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
      
  • из каждой строки извлекается PID (%a - имя здесь не важно) (PID является элементом 5 th в этой строке) и передается следующей команде

     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
  

Хороший ответ, но вы должны изменить его на findstr :9000 , если нет, вы даже найдете приложения, содержащие номер (например, при поиске «80» вы найдете приложения также на портах 80, 800, 8000).

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

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

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

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

     netstat -aon | findstr [port number]
      

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

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

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

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

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

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

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

     OwningProcess  
  • Отформатируйте вывод в таблицу со свойствами, которые вы ищете:

     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
       

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

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

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

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

 netstat -na | find "1234"
  

Просто откройте командную оболочку и введите (скажем, ваш порт 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
  

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

К вашему сведению / для всех, кто заинтересован: это либо findstr 123456 (без кавычек), либо find "123456" (с кавычками). (@Josh)

Использование 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 конечную строку для каждого совпадения с шаблоном.

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

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

 netstat -ano | findStr "8080"
  

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

 tasklist /fi "pid eq 2216"
  

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

Используйте приведенный ниже пакетный скрипт, который принимает имя процесса в качестве аргумента и выдает 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
  

Netstat:

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

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

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

Программно вам нужны материалы из iphlpapi.h Например, GetTcpTable2 (). Такие структуры, как MIB_TCP6ROW2 содержат PID владельца .

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

 netstat -anon | findstr 1234
  

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

Следует отметить, что вам не нужно устанавливать флаг -n дважды. -ano достаточно.

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

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

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

Вы, вероятно, не хотите убивать процесс автоматически. Я бы отделил эту команду kill и объяснил бы это. Не хочу, чтобы кто-то плохо копировал это, не задумываясь.

И если вы собираетесь полностью изменить решение PowerShell, перейдите на Stop-Process Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess | Stop-Process

  1. Откройте командную строку - запуск → Выполнить cmd или меню «Пуск» → Все программы Стандартные Командная строка .

  2. Тип

     netstat -aon | findstr '[port_number]'
      

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

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

     tasklist | findstr '[PID]'
      

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

  1. Вам будет показано имя приложения, которое использует номер вашего порта.

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

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

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

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

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

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

Файл portInfo.bat

 for /f "tokens=3 delims=LISTENING" %%i  in (
    'netstat -ano ^| findStr "%1" ^| findStr "["'
) do (
    tasklist /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

Это может быть полезным сценарием. Тем не менее, я попробовал это в CMD, а также PowerShell 6 без удачи. Возможно, вы могли бы улучшить свой ответ, предоставив немного больше деталей.

Первая часть работает? Это только проблема с "летучей мышью"? Есть некоторые различия в передаче переменных: (%% i)

@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

Извините, не повезло. Я поместил эту команду в файл с именем portInfo.bat в терминале powershell, а затем выполнил .\portInfo.bat 8080 . Вывод был просто содержимым командного файла. Очень хорошо, что я что-то упускаю. Обратите внимание, что я использую PowerShell 6.2.3 в Windows 10. Я также попробовал это в обычной командной строке, но результат был тот же: вывод содержимого скрипта. Я уверен, что мне не хватает важной информации, чтобы сделать эту работу.

@Manfred Содержимое файла должно быть напечатано, как я показал в предыдущем коммите. Возможно, на порту 8080 ничего не было. Вы пробовали первую команду? И он вернул что-то для этого порта? for /f "tokens=3 delims=LISTENING" %i in ('netstat -ano ^| findStr "8080" ^| findStr "["') do tasklist /fi "pid eq %i"