在Windows上找出监听TCP或UDP端口的进程的方法
技术背景
在Windows系统中,有时需要确定哪个进程正在监听特定的TCP或UDP端口,这对于解决端口冲突、排查网络问题等场景非常有用。以下介绍多种查找监听端口进程的方法。
实现步骤
PowerShell方法
TCP
使用以下命令查找监听特定TCP端口的进程:
1
| Get-Process -Id (Get-NetTCPConnection -LocalPort YourPortNumberHere).OwningProcess
|
此命令会显示进程的多列信息,若要使用taskkill /PID <pid>
杀死进程,需要用到Id
列的PID。
UDP
使用以下命令查找监听特定UDP端口的进程:
1
| Get-Process -Id (Get-NetUDPEndpoint -LocalPort YourPortNumberHere).OwningProcess
|
获取所有监听TCP端口的进程信息
1 2 3
| Get-NetTCPConnection -State Listen | Select-Object -Property *, ` @{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}} ` | select ProcessName,LocalAddress,LocalPort
|
获取所有监听UDP端口的进程信息
1 2 3
| Get-NetUDPEndpoint | Select-Object -Property *, ` @{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}} ` | select ProcessName,LocalAddress,LocalPort
|
cmd方法
基本的netstat
命令
参数说明:
-a
:显示所有连接和监听端口。-b
:显示创建每个连接或监听端口所涉及的可执行文件。-n
:以数字形式显示地址和端口号。-o
:显示每个连接关联的进程ID。
可以添加-n
参数以加快执行速度,避免解析主机名。
查找特定端口的监听进程
1
| netstat -ano | findStr "YourPortNumberHere"
|
此命令会显示监听特定端口的进程的PID。
根据PID查找进程名称
1
| tasklist /fi "pid eq YourPIDHere"
|
使用一个命令获取PID和进程名称
1
| for /f "tokens=5" %a in ('netstat -aon ^| findstr YourPortNumberHere') do tasklist /FI "PID eq %a"
|
若要跳过标题和命令提示符的返回信息,可以使用:
1
| echo off & (for /f "tokens=5" %a in ('netstat -aon ^| findstr YourPortNumberHere') do tasklist /NH /FI "PID eq %a") & echo on
|
GUI工具方法
Resource Monitor
可以通过以下方式打开资源监视器:
- 开始菜单 -> 所有程序 -> 附件 -> 系统工具 -> 资源监视器。
- 运行
resmon.exe
。 - 从任务管理器 -> 性能选项卡打开。
TCPView
可以使用TCPView工具,它是一个图形化界面工具,能方便地查看端口监听情况。
Currports
Currports工具可以帮助搜索和过滤端口监听信息。
核心代码
PowerShell
1 2 3 4 5 6 7 8 9 10 11 12
| Get-Process -Id (Get-NetTCPConnection -LocalPort YourPortNumberHere).OwningProcess
Get-Process -Id (Get-NetUDPEndpoint -LocalPort YourPortNumberHere).OwningProcess
Get-NetTCPConnection -State Listen | Select-Object -Property *, ` @{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}} ` | select ProcessName,LocalAddress,LocalPort
Get-NetUDPEndpoint | Select-Object -Property *, ` @{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}} ` | select ProcessName,LocalAddress,LocalPort
|
cmd
1 2 3 4 5 6 7 8
| # 基本的netstat命令 netstat -a -b # 查找特定端口的监听进程 netstat -ano | findStr "YourPortNumberHere" # 根据PID查找进程名称 tasklist /fi "pid eq YourPIDHere" # 使用一个命令获取PID和进程名称 for /f "tokens=5" %a in ('netstat -aon ^| findstr YourPortNumberHere') do tasklist /FI "PID eq %a"
|
最佳实践
- 如果需要快速查找特定端口的监听进程,使用
netstat -ano | findStr "YourPortNumberHere"
命令结合tasklist /fi "pid eq YourPIDHere"
命令。 - 如果需要获取更详细的进程信息,建议使用PowerShell命令。
- 如果喜欢图形化界面,可以使用TCPView或Resource Monitor工具。
常见问题
权限问题
使用netstat -b
参数时,需要有足够的权限,否则命令会失败。可以以管理员身份运行命令提示符来解决此问题。
命令执行缓慢
使用netstat -a -b
命令时,由于要解析主机名和显示可执行文件信息,可能会比较耗时。可以添加-n
参数以加快执行速度。