2930

如何找出哪个进程正在侦听 Windows 上的 TCP 或 UDP 端口?

4

34 回答 34

3388

新答案,powershell

TCP

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

UDP

Get-Process -Id (Get-NetUDPEndpoint -LocalPort YourPortNumberHere).OwningProcess

旧答案,cmd

 C:\> netstat -a -b

(添加-n以阻止它尝试解析主机名,这将使其更快。)

请注意 Dane 对TCPView的建议。它看起来非常有用!

-a 显示所有连接和监听端口。

-b 显示创建每个连接或侦听端口所涉及的可执行文件。在某些情况下,众所周知的可执行文件包含多个独立组件,在这些情况下,会显示创建连接或侦听端口所涉及的组件序列。在这种情况下,可执行文件名称在底部的 [] 中,顶部是它调用的组件,依此类推,直到到达 TCP/IP。请注意,此选项可能会很耗时并且会失败,除非您有足够的权限。

-n 以数字形式显示地址和端口号。

-o 显示与每个连接关联的拥有进程 ID。

于 2008-09-07T06:28:33.970 回答
2674

Windows 有一个原生 GUI:

  • 开始菜单 →所有程序附件系统工具资源监视器

  • 或运行resmon.exe

  • 或从任务管理器性能选项卡。

在此处输入图像描述

于 2014-05-18T05:02:54.030 回答
298

对于 Windows:

netstat -aon | find /i "listening"
于 2008-09-07T06:32:10.763 回答
270

如果您想要一个 GUI,请使用TCPView 。这是微软收购的旧Sysinternals应用程序。

于 2008-09-07T06:38:37.893 回答
197

大多数答案中提到的 -b 开关要求您在机器上具有管理权限。您真的不需要提升权限来获取进程名称!

查找端口号(如8080)中运行的进程的pid

netstat -ano | findStr "8080"

通过pid查找进程名

tasklist /fi "pid eq 2216"

通过 TCP/IP 端口查找进程

于 2018-01-24T03:50:42.503 回答
99

如果您运行以下命令,您可以获得更多信息:

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

使用“查找”命令可以过滤结果。find /i "listening"将仅显示“正在侦听”的端口。请注意,您需要/i忽略大小写,否则您将键入 find "LISTENING"。| find "port"会将结果限制为仅包含特定端口号的结果。请注意,在此它还将过滤在响应字符串中任何位置具有端口号的结果。

于 2013-10-08T18:56:07.277 回答
87
  1. 打开命令提示符窗口(以管理员身份) 从“开始\搜索框”输入“cmd”,然后右键单击“cmd.exe”并选择“以管理员身份运行”

  2. 输入以下文本,然后按 Enter。

    netstat -abno

    -a 显示所有连接和监听端口。

    -b 显示创建每个连接或侦听端口所涉及的可执行文件。在某些情况下,众所周知的可执行文件包含多个独立组件,在这些情况下,会显示创建连接或侦听端口所涉及的组件序列。在这种情况下,可执行文件名称在底部的 [] 中,顶部是它调用的组件,依此类推,直到到达 TCP/IP。请注意,此选项可能会很耗时并且会失败,除非您有足够的权限。

    -n 以数字形式显示地址和端口号。

    -o 显示与每个连接关联的拥有进程 ID。

  3. 在“本地地址”下找到您正在监听的端口

  4. 查看直接在其下方的进程名称。

注意:在任务管理器下查找进程

  1. 请注意您正在查看的端口旁边的 PID(进程标识符)。

  2. 打开 Windows 任务管理器。

  3. 选择进程选项卡。

  4. 查找在步骤 1 中执行 netstat 时记下的 PID。

    • 如果您没有看到 PID 列,请单击查看/选择列。选择 PID。

    • 确保选中“显示所有用户的进程”。

于 2012-11-08T01:49:31.480 回答
63

获取 PID 和图像名称

只使用一个命令:

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

where9000应该替换为您的端口号。

输出将包含如下内容:

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
于 2016-02-10T10:17:05.730 回答
59

首先,我们找到我们需要消除的特定任务的进程 ID,以便释放端口:

类型

netstat -n -a -o

在 Windows 命令行提示符 (cmd) 中执行此命令后,选择我认为最后一列的 pid。假设这是 3312。

现在输入

taskkill /F /PID 3312

您现在可以通过键入netstat命令进行交叉检查。

注意:有时 Windows 不允许您直接在 CMD 上运行此命令,因此首先您需要执行以下步骤:

从开始菜单 -> 命令提示符(右键单击命令提示符,并以管理员身份运行)

于 2014-08-23T15:25:04.957 回答
36

要获取与每个连接关联的所有拥有进程 ID 的列表:

netstat -ao |find /i "listening"

如果要杀死任何具有该 ID 的进程并使用此命令,则该端口变为空闲

Taskkill /F /IM PID of a process
于 2014-04-17T14:38:27.660 回答
33

在 Windows 中从 PID 获取端口号非常简单。

以下是步骤:

  1. 去运行→输入cmd→按Enter

  2. 编写以下命令...

    netstat -aon | findstr [port number]
    

    (注意:不要包括方括号。)

  3. Enter...

  4. 然后 cmd 将为您提供在该端口上运行的服务的详细信息以及 PID。

  5. 打开任务管理器并点击服务选项卡并将PID与cmd的PID匹配,就是这样。

于 2016-05-30T06:36:12.170 回答
26

在 Windows 10 或 Windows Server 2016 上使用 PowerShell 5,运行Get-NetTCPConnectioncmdlet。我想它也应该适用于较旧的 Windows 版本。

由于某种原因,默认输出Get-NetTCPConnection不包括进程 ID,这有点令人困惑。但是,您始终可以通过格式化输出来获得它。您正在寻找的物业是OwningProcess

  • 如果要找出正在侦听端口 443 的进程的 ID,请运行以下命令:

      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
    
于 2016-11-02T19:19:44.610 回答
24

要找出哪个特定进程 (PID) 正在使用哪个端口:

netstat -anon | findstr 1234

其中 1234 是您的进程的 PID。[转到任务管理器 → 服务/进程选项卡以找出您的应用程序的 PID。]

于 2018-12-14T06:55:15.467 回答
22

netstat -aof | findstr :8080(为任何端口更改 8080)

于 2021-02-16T23:59:10.217 回答
20

只需打开一个命令外壳并输入(假设您的端口是 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

这是这里提到的。

于 2017-01-25T00:13:23.273 回答
17

如果您想使用 GUI 工具来执行此操作,可以使用Sysinternals 的 TCPView

于 2008-09-07T06:40:26.577 回答
17
  1. 打开命令提示符——开始→运行cmd,或开始菜单→所有程序附件命令提示符

  2. 类型

    netstat -aon | findstr '[port_number]'
    

将 替换为[port_number]您要检查并点击的实际端口号Enter

  1. 如果任何应用程序正在使用该端口,则将显示该应用程序的详细信息。显示在列表最后一列的数字是该应用程序的 PID(进程 ID)。记下这一点。
  2. 类型

    tasklist | findstr '[PID]'
    

将 替换为[PID]上述步骤中的数字并点击Enter

  1. 您将看到使用您的端口号的应用程序名称。
于 2019-05-09T12:18:07.953 回答
17

如果有人像我一样需要 macOS 的等价物,这里是:

lsof -i tcp:8080

获得PID进程后,您可以使用以下命令将其杀死:

kill -9 <PID>

于 2020-08-12T11:22:03.303 回答
16

网络统计:

  • -a 显示所有连接和监听端口
  • -b 显示可执行文件
  • -n 停止解析主机名(数字形式)
  • -o 拥有进程

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

Currports工具有助于搜索和过滤

于 2018-09-23T05:05:33.523 回答
15

输入命令:netstat -aon | findstr :DESIRED_PORT_NUMBER

例如,如果我想查找端口 80:netstat -aon | findstr :80

这个答案最初是针对这个问题发布的。

于 2016-11-22T15:36:53.010 回答
13

netstat -aonetstat -ab告诉你应用程序,但如果你不是系统管理员,你会得到“请求的操作需要提升”。

这并不理想,但是如果您使用 Sysinternals 的Process Explorer,您可以转到特定进程的属性并查看 TCP 选项卡以查看它们是否正在使用您感兴趣的端口。这有点像大海捞针事情,但也许它会帮助某人......

于 2014-03-13T19:57:41.127 回答
11

我推荐NirSoft 的CurrPorts

CurrPorts 可以过滤显示的结果。TCPView没有这个功能。

注意:您可以右键单击进程的套接字连接并选择“关闭选定的 TCP 连接”(您也可以在 TCPView 中执行此操作)。这通常可以解决我在切换 VPN 后遇到的 Outlook 和 Lync 连接问题。使用 CurrPorts,您还可以使用“/close”参数从命令行关闭连接。

于 2015-06-29T22:07:20.653 回答
11

一个对我有帮助的单行解决方案就是这个。只需将 3000 替换为您的端口:

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

编辑:更改killStop-Process更多类似 PowerShell 的语言

于 2019-02-03T14:46:41.020 回答
10

遵循这些工具: 从cmdC:\> netstat -anob具有管理员权限。

进程浏览器

进程转储

端口监视器

全部来自 sysinternals.com。

如果你只是想知道进程运行和每个进程下的线程,我建议学习wmic. 它是一个很棒的命令行工具,它为您提供了比您知道的更多的东西。

例子:

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

上述命令将每 5 秒简要显示一次所有进程列表。要了解更多信息,您可以使用/?windows 命令,例如,

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

等等等等。:)

于 2013-08-11T18:39:52.687 回答
10

使用 Windows 的默认 shell (powershell) 并且不使用外部应用程序

对于那些使用 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
于 2016-08-25T13:36:42.513 回答
9

采用:

netstat -a -o

这显示了在特定端口上运行的进程的 PID。

记住进程 ID 并转到任务管理器和服务或详细信息选项卡并结束具有相同 PID 的进程。

因此,您可以终止在 Windows 中特定端口上运行的进程。

于 2013-08-13T02:32:08.607 回答
8

查找使用8000端口的pid

netstat -aon | findstr '8000'

在 Windows 中终止该进程

taskkill /pid pid /f

其中 pid 是您从第一个命令中获得的进程 ID

于 2020-07-14T06:13:43.157 回答
7

使用 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 个尾随行。
于 2017-12-28T09:06:54.927 回答
7

以编程方式,您需要iphlpapi.h中的内容,例如GetTcpTable2 ()。MIB_TCP6ROW2之类的结构包含所有者 PID。

于 2018-11-05T18:16:10.827 回答
6

您还可以使用以下命令检查保留端口。例如,Hyper-V 保留了一些端口。

netsh int ipv4 show excludedportrange protocol=tcp

于 2020-11-24T14:50:09.113 回答
3

对于 Windows,如果要查找正在侦听或连接到端口 1234 的内容,请在 cmd 提示符下执行以下命令:

netstat -na | find "1234"
于 2017-01-24T21:10:18.077 回答
2

使用下面的批处理脚本,它将进程名称作为参数并为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
于 2018-05-04T18:15:53.627 回答
2

根据infokill的答案,对我来说将它们组合在一个命令中很有用。您可以从 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

于 2019-09-19T10:58:43.703 回答
1

电源外壳

如果你想有一个很好的概述,你可以使用这个:

Get-NetTCPConnection -State Listen | Select-Object -Property *, `
    @{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}} `
    | select ProcessName,LocalAddress,LocalPort

比你得到一张这样的桌子:

ProcessName              LocalAddress  LocalPort
-----------              ------------  ---------
services                 ::                49755
jhi_service              ::1               49673
svchost                  ::                  135
services                 0.0.0.0           49755
spoolsv                  0.0.0.0           49672

对于 udp,它是:

Get-NetUDPEndpoint | Select-Object -Property *, `
   @{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}} `
   | select ProcessName,LocalAddress,LocalPort
于 2022-02-27T22:16:55.223 回答