Як можна дізнатися, який процес прослуховування в порту в 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, якщо ви хочете для цього GUI. Microsoft викупила стару програму Sysinternals .
Для 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
ігнорувати регістр, інакше ви введете "LISTENING". | find "port"
обмежує результати лише тими, що містять конкретний номер порту. Зауважте, на цьому воно також буде фільтрувати результати, які мають номер порту в будь-якій точці відповіді.
FIND: Parameter format not correct
. Вам потрібно додати пробіл після критеріїв пошуку. Це залишить вас netstat -aon | find /i "listening" | find "1234 "
.
{back tick}
" прослуховування {back tick}
"" | | знайти " {back tick}
" порт {back tick}
" "(<- зауважте, що втекли котирування - вибачте за термін, back tick
оскільки я не можу додати фактичного персонажа, як вважаю, що його прорив)
Відкрийте вікно командного рядка (як адміністратор) У меню "Пуск \ поле пошуку" введіть "cmd", а потім клацніть правою кнопкою миші на "cmd.exe" та виберіть "Запустити як адміністратор"
Введіть наступний текст і натисніть Enter.
netstat -abno
-a Відображає всі з'єднання та порти прослуховування.
-б Відображає виконуваний файл, який бере участь у створенні кожного порту підключення чи прослуховування. У деяких випадках відомі виконувані файли розміщують кілька незалежних компонентів, і в цих випадках відображається послідовність компонентів, що беруть участь у створенні порту зв'язку або прослуховування. У цьому випадку ім'я виконуваного файлу знаходиться внизу [], вгорі - компонент, який він викликав, і так далі, поки не буде досягнуто TCP / IP. Зауважте, що ця опція може забирати багато часу та не працюватиме, якщо у вас не буде достатньо дозволів.
-n Відображає адреси та номери портів у числовій формі.
-o Відображає ідентифікатор процесу володіння, пов'язаний з кожним з'єднанням.
Знайдіть порт, який ви слухаєте, у розділі "Місцева адреса"
Подивіться на ім'я процесу прямо під цим.
ПРИМІТКА. Щоб знайти процес у диспетчері завдань
Зверніть увагу на PID (ідентифікатор процесу) поруч із портом, який ви шукаєте.
Відкрийте диспетчер завдань Windows.
Виберіть вкладку Процеси.
Шукайте PID, який ви зазначили, коли ви робили netstat на кроці 1.
Якщо ви не бачите стовпця PID, натисніть на Перегляд / Вибір стовпців. Виберіть 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
й елемент в цьому рядку) і передається наступній команді
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"
Якщо ви хочете вбити будь-який процес, отримайте ідентифікатор і скористайтеся цією командою, щоб порт став вільним
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
якоїсь причини не включає ідентифікатор Process, і це трохи заплутано. Однак ви завжди можете отримати це, відформатувавши вихід. Ви шукаєте власність 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 допомагає шукати та фільтрувати
Відкрийте командний рядок - пуск → Запуск → cmd
або меню Пуск → Усі програми → Аксесуари → Командний рядок .
Тип
netstat -aon | findstr '[port_number]'
Замініть на [port_number]
фактичний номер порту, який ви хочете перевірити, і натисніть Enter.
Тип
tasklist | findstr '[PID]'
Замініть [PID]
цифру на вказаному вище кроці та натисніть Enter.
netstat -ao
і netstat -ab
скажу вам програму, але якщо ви не системний адміністратор, ви отримаєте "Запрошена операція вимагає підвищення".
Це не ідеально, але якщо ви використовуєте « Провідник процесів 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
Ви також можете помістити ці команди в файл bat (вони будуть дещо іншими - замініть %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
у терміналі powerhell, потім виконаний .\portInfo.bat 8080
. Вихід був лише вмістом пакетного файлу. Дуже добре, я щось переглядаю. Зауважте, я використовую PowerShell 6.2.3 в Windows 10. Я також спробував це у звичайній командній лінії, але результат був такий же: Виведення вмісту скрипту. Я впевнений, що мені не вистачає важливої інформації, щоб зробити цю роботу.
/nh
: @tasklist /nh /fi "pid eq %i"
? І саме двері:Findstr ":8080"
У моєму випадку порт (3000) взагалі не використовувався і не був видимий у netstat. Але! Видалення Docker для Windows для вирішення проблеми.