Как узнать, какой процесс прослушивает порт в Windows?
Новый ответ, powershell
Get-Process -Id (Get-NetTCPConnection -LocalPort portNumber).OwningProcess
Старый ответ, cmd
C:\> netstat -a -b
(Добавьте -n, чтобы остановить попытки разрешения имен хостов, что сделает его намного быстрее.)
Обратите внимание на рекомендацию датчанина для TCPView . Это выглядит очень полезно!
-a Отображает все соединения и порты прослушивания.
-b Отображает исполняемый файл, участвующий в создании каждого соединения или порта прослушивания. В некоторых случаях известные исполняемые файлы содержат несколько независимых компонентов, и в этих случаях отображается последовательность компонентов, участвующих в создании соединения или порта прослушивания. В этом случае имя исполняемого файла находится в [] внизу, вверху - компонент, который он вызвал, и так далее, пока не будет достигнут TCP / IP. Обратите внимание, что этот параметр может занять много времени и завершится ошибкой, если у вас нет достаточных разрешений.
-n Отображает адреса и номера портов в числовой форме.
-o Отображает идентификатор процесса-владельца, связанный с каждым соединением.
1234
- тогда вы можете использовать, tasklist /fi "pid eq 1234"
чтобы узнать название и другие детали процесса. Для Windows:
netstat -aon | find /i "listening"
netstat -aon | find /i "abhören"
для немецкого. FIND: Parameter format not correct
Используйте TCPView, если вы хотите графический интерфейс для этого. Это старое приложение Sysinternals, которое Microsoft купила.
Если вы хотите использовать инструмент с графическим интерфейсом, для этого есть TCPView Sysinternals .
Откройте окно командной строки (от имени администратора). В поле «Пуск \ Поиск» введите «cmd», затем щелкните правой кнопкой мыши «cmd.exe» и выберите «Запуск от имени администратора».
Введите следующий текст и нажмите Enter.
netstat -abno
-a Отображает все соединения и порты прослушивания.
-b Отображает исполняемый файл, участвующий в создании каждого соединения или порта прослушивания. В некоторых случаях известные исполняемые файлы содержат несколько независимых компонентов, и в этих случаях отображается последовательность компонентов, участвующих в создании соединения или порта прослушивания. В этом случае имя исполняемого файла находится в [] внизу, вверху - компонент, который он вызвал, и так далее, пока не будет достигнут TCP / IP. Обратите внимание, что этот параметр может занять много времени и завершится ошибкой, если у вас нет достаточных разрешений.
-n Отображает адреса и номера портов в числовой форме.
-o Отображает идентификатор процесса-владельца, связанный с каждым соединением.
Найдите порт, который вы слушаете, в разделе «Локальный адрес».
Посмотрите на имя процесса прямо под этим.
ПРИМЕЧАНИЕ. Чтобы найти процесс в диспетчере задач
Обратите внимание на PID (идентификатор процесса) рядом с портом, который вы просматриваете.
Откройте диспетчер задач Windows.
Выберите вкладку «Процессы».
Найдите PID, который вы указали, когда выполняли netstat на шаге 1.
Если вы не видите столбец PID, нажмите View / Select Columns. Выберите PID.
Убедитесь, что выбран параметр «Показывать процессы от всех пользователей».
Используйте следующие инструменты: Из cmd : C:\> netstat -anob
с правами администратора .
Все из sysinternals.com.
Если вы просто хотите узнать, какой процесс запущен и какие потоки находятся под каждым процессом, я рекомендую вам узнать об этом wmic
. Это замечательный инструмент командной строки, который дает вам гораздо больше, чем вы можете себе представить.
Пример:
c:\> wmic process list brief /every:5
Приведенная выше команда будет отображать список всех процессов в течение коротких 5 секунд. Чтобы узнать больше, вы можете просто пойти с /?
командой Windows, например,
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"
ограничит результаты только теми, которые содержат определенный номер порта. Обратите внимание, что при этом он также будет фильтровать результаты, которые имеют номер порта в любом месте строки ответа.
FIND: Parameter format not correct
. Вам нужно добавить пробел после критерия поиска. Это оставит вас с netstat -aon | find /i "listening" | find "1234 "
. {back tick}
" listening {back tick}
"" | find " {back tick}
" port {back tick}
" «(<- обратите внимание на экранированные кавычки - извините за термин, back tick
поскольку я не могу добавить фактического персонажа, так как он считает, что это отрывок)netstat -ao
и netstat -ab
сообщит вам приложение, но если вы не являетесь системным администратором, вы получите «Запрошенная операция требует повышения прав».
Это не идеально, но если вы используете Process Explorer от Sysinternals, вы можете перейти к свойствам определенных процессов и посмотреть на вкладку TCP, чтобы увидеть, используют ли они интересующий вас порт. Это что-то вроде иголки и стога сена. вещь, но, возможно, это поможет кому-то ...
Чтобы получить список всех идентификаторов процессов-владельцев, связанных с каждым соединением:
netstat -ao |find /i "listening"
Если вы хотите убить какой-либо процесс, имейте ID и используйте эту команду, чтобы порт стал свободным
Taskkill /F /IM PID of a process
Есть родной графический интерфейс для Windows:
- Меню Пуск → Все программы → Стандартные → Системные инструменты → Монитор ресурсов
Или запустить resmon.exe
, или из вкладки производительности диспетчера задач .
Сначала мы находим идентификатор процесса той конкретной задачи, которую нам нужно устранить, чтобы освободить порт:
Тип
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
из каждой строки
%a
извлекается PID ( имя здесь не важно) (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 очень просто.
Ниже приведены шаги:
Перейти к запуску → введите CMD → нажмите Enter.
Напишите следующую команду ...
netstat -aon | findstr [port number]
(Примечание: не используйте квадратные скобки.)
Нажмите Enter...
Затем cmd сообщит вам подробности службы, работающей на этом порту, вместе с PID.
Откройте диспетчер задач, перейдите на вкладку службы и сопоставьте PID с идентификатором cmd, и все.
Для тех, кто использует 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
В 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
Введите в команду: 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"
Используйте приведенный ниже пакетный скрипт, который принимает имя процесса в качестве аргумента и выдает 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 разрешить имена хостов (числовая форма)
-в владении процессом
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-подобного языка
Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess | Stop-Process
Откройте командную строку - старт → Run →
cmd
или меню Пуск → Все программы → Принадлежности → Command Prompt .Тип
netstat -aon | findstr '[port_number]'
Замените [port_number]
фактическим номером порта, который вы хотите проверить, и нажмите Enter.
- Если порт используется каким-либо приложением, то будут показаны подробности этого приложения. Номер, который показан в последнем столбце списка, представляет собой PID (идентификатор процесса) этого приложения. Запишите это.
Тип
tasklist | findstr '[PID]'
Замените на [PID]
число из вышеприведенного шага и нажмите Enter.
- Вам будет показано имя приложения, которое использует номер вашего порта.
Основываясь на ответах с информацией и убийством , для меня полезно объединить их в одну команду . И вы можете запустить это из 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
Вы также можете поместить эти команды в файл летучей мыши (они будут немного отличаться - заменить %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
.\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. Я также попробовал это в обычной командной строке, но результат был тот же: вывод содержимого скрипта. Я уверен, что мне не хватает важной информации, чтобы сделать эту работу. for /f "tokens=3 delims=LISTENING" %i in ('netstat -ano ^| findStr "8080" ^| findStr "["') do tasklist /fi "pid eq %i"
В моем случае порт (3000) вообще не использовался и не виден в netstat. Но! Деинсталлятор Docker для Windows решил проблему.