Как узнать, какой процесс прослушивает порт в Windows?
Как узнать, какой процесс прослушивает порт в Windows?
Ответы:
Get-Process -Id (Get-NetTCPConnection -LocalPort portNumber).OwningProcess
C:\> netstat -a -b
(Добавьте -n, чтобы остановить попытки разрешения имен хостов, что сделает его намного быстрее.)
Обратите внимание на рекомендацию датчанина для TCPView . Это выглядит очень полезно!
-a Отображает все соединения и порты прослушивания.
-b Отображает исполняемый файл, участвующий в создании каждого соединения или порта прослушивания. В некоторых случаях известные исполняемые файлы содержат несколько независимых компонентов, и в этих случаях отображается последовательность компонентов, участвующих в создании соединения или порта прослушивания. В этом случае имя исполняемого файла находится в [] внизу, вверху - компонент, который он вызвал, и так далее, пока не будет достигнут TCP / IP. Обратите внимание, что этот параметр может занять много времени и завершится ошибкой, если у вас нет достаточных разрешений.
-n Отображает адреса и номера портов в числовой форме.
-o Отображает идентификатор процесса-владельца, связанный с каждым соединением.
1234
- тогда вы можете использовать, tasklist /fi "pid eq 1234"
чтобы узнать название и другие детали процесса.
Есть родной графический интерфейс для Windows:
Или запустить resmon.exe
, или из вкладки производительности диспетчера задач .
Используйте TCPView, если вы хотите графический интерфейс для этого. Это старое приложение Sysinternals, которое Microsoft купила.
Для Windows:
netstat -aon | find /i "listening"
netstat -aon | find /i "abhören"
для немецкого.
FIND: Parameter format not correct
Ключ -b, упомянутый в большинстве ответов, требует наличия прав администратора на компьютере. Вам не нужны повышенные права, чтобы получить имя процесса!
Найдите pid процесса, запущенного по номеру порта (например, 8080)
netstat -ano | findStr "8080"
Найти имя процесса по pid
tasklist /fi "pid eq 2216"
Вы можете получить больше информации, если выполните следующую команду:
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
поскольку я не могу добавить фактического персонажа, так как он считает, что это отрывок)
Откройте окно командной строки (от имени администратора). В поле «Пуск \ Поиск» введите «cmd», затем щелкните правой кнопкой мыши «cmd.exe» и выберите «Запуск от имени администратора».
Введите следующий текст и нажмите Enter.
netstat -abno
-a Отображает все соединения и порты прослушивания.
-b Отображает исполняемый файл, участвующий в создании каждого соединения или порта прослушивания. В некоторых случаях известные исполняемые файлы содержат несколько независимых компонентов, и в этих случаях отображается последовательность компонентов, участвующих в создании соединения или порта прослушивания. В этом случае имя исполняемого файла находится в [] внизу, вверху - компонент, который он вызвал, и так далее, пока не будет достигнут TCP / IP. Обратите внимание, что этот параметр может занять много времени и завершится ошибкой, если у вас нет достаточных разрешений.
-n Отображает адреса и номера портов в числовой форме.
-o Отображает идентификатор процесса-владельца, связанный с каждым соединением.
Найдите порт, который вы слушаете, в разделе «Локальный адрес».
Посмотрите на имя процесса прямо под этим.
ПРИМЕЧАНИЕ. Чтобы найти процесс в диспетчере задач
Обратите внимание на PID (идентификатор процесса) рядом с портом, который вы просматриваете.
Откройте диспетчер задач Windows.
Выберите вкладку «Процессы».
Найдите PID, который вы указали, когда выполняли netstat на шаге 1.
Если вы не видите столбец PID, нажмите View / Select Columns. Выберите 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).
Сначала мы находим идентификатор процесса той конкретной задачи, которую нам нужно устранить, чтобы освободить порт:
Тип
netstat -n -a -o
После выполнения этой команды в командной строке Windows (cmd) выберите pid, который я считаю последним столбцом. Предположим, это 3312.
Сейчас типа
taskkill /F /PID 3312
Теперь вы можете перепроверить, набрав netstat
команду.
ПРИМЕЧАНИЕ: иногда Windows не позволяет вам запускать эту команду непосредственно на CMD, поэтому сначала вам нужно выполнить следующие шаги:
Из меню «Пуск» -> командная строка (щелкните правой кнопкой мыши на командной строке и запустите от имени администратора)
Чтобы получить список всех идентификаторов процессов-владельцев, связанных с каждым соединением:
netstat -ao |find /i "listening"
Если вы хотите убить какой-либо процесс, имейте ID и используйте эту команду, чтобы порт стал свободным
Taskkill /F /IM PID of a process
Получить номер порта из PID в Windows очень просто.
Ниже приведены шаги:
Перейти к запуску → введите CMD → нажмите Enter.
Напишите следующую команду ...
netstat -aon | findstr [port number]
(Примечание: не используйте квадратные скобки.)
Нажмите Enter...
Затем cmd сообщит вам подробности службы, работающей на этом порту, вместе с PID.
Откройте диспетчер задач, перейдите на вкладку службы и сопоставьте PID с идентификатором cmd, и все.
Просто откройте командную оболочку и введите (скажем, ваш порт 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)
Чтобы узнать, какой конкретный процесс (PID) использует какой порт:
netstat -anon | findstr 1234
Где 1234 - PID вашего процесса. [Перейдите в Диспетчер задач → Служба / вкладка Процессы, чтобы узнать PID вашего приложения.]
-n
флаг дважды. -ano
достаточно.
В 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
Если вы хотите использовать инструмент GUI, для этого есть TCPView Sysinternals .
Введите в команду: netstat -aon | findstr :DESIRED_PORT_NUMBER
Например, если я хочу найти порт 80: netstat -aon | findstr :80
Этот ответ был первоначально отправлен на этот вопрос .
Netstat:
-в владении процессом
netstat -bano | findstr "7002"
netstat -ano > ano.txt
Инструмент Currports помогает искать и фильтровать
Откройте командную строку - старт → Run → cmd
или меню Пуск → Все программы → Принадлежности → Command Prompt .
Тип
netstat -aon | findstr '[port_number]'
Замените [port_number]
фактическим номером порта, который вы хотите проверить, и нажмите Enter.
Тип
tasklist | findstr '[PID]'
Замените на [PID]
число из вышеприведенного шага и нажмите Enter.
netstat -ao
и netstat -ab
сообщит вам приложение, но если вы не являетесь системным администратором, вы получите «Запрошенная операция требует повышения прав».
Это не идеально, но если вы используете Process Explorer от Sysinternals, вы можете перейти к свойствам определенных процессов и посмотреть на вкладку TCP, чтобы увидеть, используют ли они интересующий вас порт. Это что-то вроде иголки и стога сена. вещь, но, может быть, это поможет кому-то ...
Я рекомендую CurrPorts от NirSoft.
CurrPorts может фильтровать отображаемые результаты. TCPView не имеет этой функции.
Примечание. Вы можете щелкнуть правой кнопкой мыши соединение сокета процесса и выбрать «Закрыть выбранные соединения TCP» (вы также можете сделать это в TCPView). Это часто устраняет проблемы с подключением к Outlook и Lync после переключения VPN. С помощью CurrPorts вы также можете закрывать соединения из командной строки с помощью параметра «/ close».
Единственное решение, которое мне помогает, это одно. Просто замените 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
Используйте следующие инструменты: Из 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.
Для тех, кто использует 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
Программно вам нужен материал из iphlpapi.h , например GetTcpTable2 (). Структуры, подобные MIB_TCP6ROW2, содержат PID владельца.
Используя 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 завершающую строку для каждого совпадения паттерна.Используйте приведенный ниже пакетный скрипт, который принимает имя процесса в качестве аргумента и выдает 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
Основываясь на ответах с информацией и убийством , для меня полезно объединить их в одну команду . И вы можете запустить это из 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
.\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. Я также пробовал это в обычной командной строке, но результат был тот же: вывод содержимого скрипта. Я уверен, что мне не хватает важной информации, чтобы сделать эту работу.
/nh
: @tasklist /nh /fi "pid eq %i"
? И именно дверь:Findstr ":8080"
В моем случае порт (3000) вообще не использовался и не виден в netstat. Но! Деинсталлятор Docker для Windows решил проблему.