您如何找出Windows上正在侦听端口的进程?


2270

您如何找出Windows上正在侦听端口的进程?


3
Currports是一个有助于搜索和过滤的工具nirsoft.net/utils/cports.html
Blue Clouds

1
我在尝试在IntelliJ下以调试模式运行Tomcat时遇到了这个问题,对我来说,最好的解决方案是将调试传输配置(文件->设置->构建/ exe /部署->调试器)从“套接字”更改为“共享内存”。
TMN

Answers:


2617

新答案,PowerShell

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

旧答案,cmd

 C:\> netstat -a -b

(添加-n可以阻止它尝试解析主机名,这将使其速度大大提高。)

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

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

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

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

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


252
-o获取PID
Laurent K

121
然后使用taskkill / PID <pid>终止进程,并在适当时使用/ F。
BitMask777

81
您可能必须以管理员身份运行命令行外壳程序,否则可能会收到有关权限不足的错误消息。右键单击cmd.exe时,请使用“以管理员身份运行”选项。
Gruber 2014年

6
可行,但需要提升的权限。按住Shift并右键单击命令图标->以管理员身份运行
Christian Bongiorno,2015年

18
有了PID(比方说是)1234,那么您就可以tasklist /fi "pid eq 1234"用来找出过程的名称和其他详细信息。
史蒂夫·钱伯斯

2201

Windows有一个本机GUI:

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

运行 resmon.exe,或从任务管理器的性能标签中。

Enter image description here


41
还显示绑定的防火墙状态(最后一列)。非常实用。
拉斐尔2014年

8
您需要成为管理员(或属于该组)才能运行此程序。
KrishPrabakar

2
@bcorso,绑定到“ 未指定地址 ”是什么意思?
Pacerier '16

5
至少在Windows 10中,也可以从“任务管理器”的“性能”选项卡启动。(尚未检查其他版本。)
Mathieu

10
上面@ user4836454的注释不正确:资源监视器确实显示带有侦听器的端口,即使这些端口之间没有网络连接也是如此。只需查看“侦听端口”部分而不是“ TCP连接”部分。
Jpsy

235

如果要为此使用GUI,请使用TCPView。这是微软购买的旧Sysinternals应用程序。


9
根据我的说法,这是最佳选择,尤其是因为所有进程都在同一列表中,并且您可以通过右键单击它们直接关闭进程。
Andreas Lundgren

8
另外,这不需要管理员权限!
Janac Meena

222

对于Windows:

netstat -aon | find /i "listening"

25
+1但请记住,如果您的Windows以英语以外的其他语言运行,则必须将“侦听”更改为母语。例如netstat -aon | find /i "abhören"德语。
莱维特2014年

2
在我的情况下,它可能不起作用,可能是因为引号引起来,但是解决方案netstat -aon | findstr LISTENING工作完美!
The Godfather 2015年

这可以工作而无需如此提升的特权。
Vlad Schnakovszki

1
尝试使用PowerShell在W10 15063.729上运行此命令时遇到错误:FIND: Parameter format not correct
Nicke Manarin

1
这个答案与“找出Windows上的端口正在侦听哪个进程[名称]”有什么关系?
Pawel Cioch

137

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

在端口号(例如8080)中找到正在运行的进程的pid

netstat -ano | findStr "8080"

通过pid查找进程名称

tasklist /fi "pid eq 2216"

通过TCP / IP端口查找进程


82

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

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

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


8
FWIW尝试在PowerShell v2.0中运行它会产生错误FIND: Parameter format not correct。您需要在查找条件之后添加一个空格。这将使您离开netstat -aon | find /i "listening" | find "1234 "
自我。

2
将上面的“端口”替换为您的端口,例如“ 5000”
jbooker

1
@自。即使在管道后添加空格,PS 5.1仍然会出现该错误。你知道发生了什么吗?
Nicke Manarin

2
@NickeManarinin&@self首先从powershell更改为cmd(只需键入cmd并按Enter,然后重做命令),或者在powershell中使用以下命令:netstat -aon | find / i“ {back tick}” listening {back tick}“” | find“ {back tick}” port {back tick}“ “(<-请注意转义的引号-请原谅该词,back tick因为我不能添加实际的字符,因为它认为这是令人生厌的)
Tristan van Dam Dam

72
  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。

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


56

获取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第一个元素),并将其传递给以下命令

    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

2
好的答案,但是您应该将其更改为“ findstr :9000否”,甚至可以找到包含数字的应用程序(例如,当搜索“ 80”时,也会在端口80、800、8000上找到应用程序)。
Radon8472

48

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

类型

netstat -n -a -o

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

现在输入

taskkill /F /PID 3312

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

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

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


30

要获取与每个连接关联的所有拥有进程ID的列表,请执行以下操作:

netstat -ao |find /i "listening"

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

Taskkill /F /IM PID of a process

1
这不考虑侦听UDP端口
evandrix

27

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

步骤如下:

  1. 转到运行→键入cmd→按Enter

  2. 编写以下命令...

    netstat -aon | findstr [port number]
    

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

  3. Enter...

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

  5. 打开任务管理器,然后单击服务选项卡,将PID与cmd的PID匹配,仅此而已。


18

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

这就是这里提到的。


1
仅供参考/对于任何有兴趣的人:(findstr 123456不带引号)或find "123456"(带引号)。(@Josh)
Kevin Cruijssen

18

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

netstat -anon | findstr 1234

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


1
请注意,您不需要将-n标志设置两次。-ano足够。
mwieczorek '19

16

使用Windows 10或Windows Server 2016上的PowerShell 5运行 Get-NetTCPConnection cmdlet。我猜它也应该在较旧的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
    


13

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

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

该答案最初发布于此问题


11

Netstat:

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

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

Currports工具有助于搜索和过滤器


11
  1. 打开命令提示符-开始→ 运行cmd或开始菜单→ 所有程序附件命令提示符

  2. 类型

    netstat -aon | findstr '[port_number]'
    

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

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

    tasklist | findstr '[PID]'
    

将其替换为[PID]上述步骤中的数字,然后按Enter

  1. 系统会显示使用端口号的应用程序名称。

3
在Win 10上:除非您用双引号替换简单的引号,否则步骤2和步骤4中的命令将不起作用。应该说netstat -aon | findstr“ [port_number]”
莱昂纳多·洛佩兹

此解决方案无需提升的权限。Tks!
Totalys

10

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

这并不理想,但是如果您使用Sysinternals的Process Explorer,则可以转到特定进程的属性,然后查看“ TCP”选项卡以查看它们是否正在使用您感兴趣的端口。这有点麻烦东西,但也许会帮助某人...


如果您不是管理员,则将无法使用Process Explorer(甚至Windows Task Manager> Resource Manager)从任何不是您本人的进程中获取此信息。
亚伯

9

我推荐NirSoft提供的CurrPorts

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

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


7

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

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

编辑:更改killStop-Process更多的PowerShell的语言一样


6
您可能不想自动终止进程。我将把kill命令分开并解释它。不想让一些可怜的用户未经仔细考虑就粘贴粘贴。
TinkerTenorSoftwareGuy

1
而且,如果您要使用完整的PowerShell解决方案Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess | Stop-Process
请将Kill

6

请遵循以下工具:从cmdC:\> netstat -anob具有管理员权限。

流程浏览器

流程转储

端口监控器

全部来自sysinternals.com。

如果您只想了解进程的运行情况以及每个进程下的线程,建议您学习有关内容wmic。这是一个很棒的命令行工具,它为您提供了远远超过您所知道的。

例:

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

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

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

等等等等。:)


6

采用:

netstat -a -o

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

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

因此,您可以杀死Windows中特定端口上运行的进程。


6

对于使用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


5

使用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条尾线。

2

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

netstat -na | find "1234"

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

1

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


1
这可能是一个有用的脚本。但是,我在CMD和PowerShell 6中都尝试过,但是没有运气。也许您可以通过提供更多细节来改善答案。
曼弗雷德

第一部分工作正常吗?蝙蝠是唯一的问题吗?传递变量有一些区别:(%% i)
lczapski

@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
lczapski

对不起,没有运气。我将该命令放入portInfo.bat在powershell终端中命名的文件中,然后执行.\portInfo.bat 8080。输出只是批处理文件的内容。很好,我正在忽略某些东西。请注意,我在Windows 10上使用PowerShell 6.2.3。我也在常规命令提示符下尝试过该操作,但结果是相同的:输出脚本内容。我敢肯定,我缺少必要的信息来完成这项工作。
曼弗雷德

1
为什么不添加/nh@tasklist /nh /fi "pid eq %i"?恰好是门:Findstr ":8080"
不是我

0

在我的情况下,根本不使用端口(3000),并且在netstat中不可见。但!Windows的卸载程序Docker已解决了该问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.