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


当前回答

根据带有信息和击杀的答案,对我来说,将它们组合在一个命令中是有用的。您可以从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"

文件端口Kill.bat

for /f "tokens=3 delims=LISTENING" %%i  in (
    'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @Taskkill /F /IM %%i

然后您可以通过cmd执行以下操作:

端口信息.bat 8080

or

端口Kill.bat 8080

其他回答

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

PowerShell(PowerShell)

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

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

我推荐NirSoft的CurrPorts。

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

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

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

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

netstat -ano | findStr "8080"

通过pid查找进程名称

tasklist /fi "pid eq 2216"

Use:

netstat -a -o

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

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

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