文章目录
- [Windows 下使用 PowerShell 和 CMD 排查端口占用](#Windows 下使用 PowerShell 和 CMD 排查端口占用)
- [一、PowerShell 端口排查速查表](#一、PowerShell 端口排查速查表)
- [二、Windows 中端口排查的基本思路](#二、Windows 中端口排查的基本思路)
- [三、使用 PowerShell 查看端口](#三、使用 PowerShell 查看端口)
-
- [1. 查看指定端口](#1. 查看指定端口)
- 四、查看端口是否正在监听
- [五、根据端口找到 PID](#五、根据端口找到 PID)
- [六、根据 PID 查进程](#六、根据 PID 查进程)
- [七、CMD 中使用 netstat 查询端口](#七、CMD 中使用 netstat 查询端口)
- [八、使用 CMD 查询指定端口](#八、使用 CMD 查询指定端口)
- [九、CMD 根据 PID 查进程](#九、CMD 根据 PID 查进程)
- [十、PowerShell 与 CMD 命令对照](#十、PowerShell 与 CMD 命令对照)
- 十一、查看一个进程监听的所有端口
- 十二、直接查看某个程序的所有监听端口
- [十三、同时显示端口、PID 和进程名称](#十三、同时显示端口、PID 和进程名称)
- [十四、查看 UDP 端口](#十四、查看 UDP 端口)
- 十五、查看进程实际启动参数
- 十六、查看系统所有监听端口
- [十七、Windows 自带可视化工具:资源监视器](#十七、Windows 自带可视化工具:资源监视器)
- 十八、推荐工具:TCPView
- 十九、其他常用可视化工具
- 二十、端口占用与网络不通是两个不同的问题
- [二十一、Windows 端口排查的推荐流程](#二十一、Windows 端口排查的推荐流程)
- 二十二、最值得记住的几条命令
- 二十三、总结
Windows 下使用 PowerShell 和 CMD 排查端口占用
一、PowerShell 端口排查速查表
| 目的 | PowerShell 命令 | 说明 |
|---|---|---|
| 查看某端口是否被占用 | Get-NetTCPConnection -LocalPort 9101 |
最直接 |
| 查看端口对应 PID | `Get-NetTCPConnection -LocalPort 9101 | Select LocalPort,State,OwningProcess` |
| 根据 PID 查进程 | Get-Process -Id 1234 |
查看进程名称 |
| 查看某进程所有监听端口 | `Get-NetTCPConnection -OwningProcess 1234 | ? State -eq Listen` |
| 查看 weed.exe 所有监听端口 | `Get-NetTCPConnection -OwningProcess (Get-Process weed).Id | ? State -eq Listen` |
| 查看所有 TCP 监听端口 | Get-NetTCPConnection -State Listen |
查看本机全部监听服务 |
| 查看所有 TCP 连接 | Get-NetTCPConnection |
包括 Listen、Established 等 |
| 查看某端口完整信息 | `Get-NetTCPConnection -LocalPort 9101 | Format-List *` |
| 查看进程启动命令行 | `Get-CimInstance Win32_Process -Filter "Name = 'weed.exe'" | Select ProcessId,CommandLine` |
| 查看指定 PID 启动参数 | `Get-CimInstance Win32_Process -Filter "ProcessId = 1234" | Select CommandLine` |
| 查看 UDP 端口 | Get-NetUDPEndpoint |
查询 UDP 端口 |
| 查看指定 UDP 端口 | Get-NetUDPEndpoint -LocalPort 9101 |
查询指定 UDP |
| 查看防火墙规则 | Get-NetFirewallRule |
Windows 防火墙排查 |
| 查看端口过滤规则 | Get-NetFirewallPortFilter |
查看端口过滤条件 |
二、Windows 中端口排查的基本思路
Windows 中排查端口问题,通常需要依次回答几个问题:
text
这个端口是否被占用?
↓
谁占用了这个端口?
↓
对应的 PID 是什么?
↓
PID 对应哪个进程?
↓
这个进程是如何启动的?
↓
它还监听了哪些端口?
例如:
text
9101
↓
TCP LISTEN
↓
PID 1234
↓
weed.exe
↓
启动参数
↓
确认具体服务
这套方法不仅适用于 SeaweedFS,也适用于 Web 服务、数据库、代理程序、开发环境中的各种后台服务。
三、使用 PowerShell 查看端口
1. 查看指定端口
PowerShell 推荐使用:
powershell
Get-NetTCPConnection -LocalPort 9101
例如:
text
LocalAddress LocalPort RemoteAddress RemotePort State OwningProcess
------------ --------- ------------- ----------- ----- -------------
0.0.0.0 9101 0.0.0.0 0 Listen 1234
其中:
| 字段 | 含义 |
|---|---|
LocalAddress |
本地监听地址 |
LocalPort |
本地端口 |
RemoteAddress |
对端地址 |
RemotePort |
对端端口 |
State |
TCP 状态 |
OwningProcess |
占用端口的 PID |
四、查看端口是否正在监听
如果只关心某个端口有没有处于监听状态:
powershell
Get-NetTCPConnection -LocalPort 9101 -State Listen
如果没有任何输出,一般表示当前没有 TCP 服务监听该端口。
也可以使用:
powershell
Get-NetTCPConnection -State Listen |
Where-Object LocalPort -eq 9101
五、根据端口找到 PID
推荐:
powershell
Get-NetTCPConnection -LocalPort 9101 |
Select-Object LocalAddress,LocalPort,State,OwningProcess
例如:
text
LocalAddress LocalPort State OwningProcess
------------ --------- ----- -------------
0.0.0.0 9101 Listen 1234
其中:
text
OwningProcess = 1234
就是占用端口的进程 PID。
六、根据 PID 查进程
获得 PID 后:
powershell
Get-Process -Id 1234
例如:
text
Handles NPM(K) PM(K) WS(K) CPU(s) Id ProcessName
------- ------ ----- ----- ------ --- -----------
... ... ... ... ... 1234 example
也可以只查看进程名称:
powershell
(Get-Process -Id 1234).ProcessName
七、CMD 中使用 netstat 查询端口
Windows CMD 最经典的端口查询命令是:
cmd
netstat -ano
参数含义:
text
-a 显示所有连接和监听端口
-n 使用数字形式显示地址和端口
-o 显示 PID
例如:
text
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:9101 0.0.0.0:0 LISTENING 1234
八、使用 CMD 查询指定端口
例如查询 9101:
cmd
netstat -ano | findstr :9101
结果:
text
TCP 0.0.0.0:9101 0.0.0.0:0 LISTENING 1234
这是 Windows 环境中最常见的端口排查方法之一。
九、CMD 根据 PID 查进程
已经获得 PID:
text
1234
可以执行:
cmd
tasklist /FI "PID eq 1234"
例如:
text
Image Name PID Session Name
example.exe 1234 Console
因此 CMD 的完整排查流程就是:
cmd
netstat -ano | findstr :9101
得到:
text
PID = 1234
然后:
cmd
tasklist /FI "PID eq 1234"
得到:
text
example.exe
十、PowerShell 与 CMD 命令对照
| 排查目的 | PowerShell | CMD |
|---|---|---|
| 查看所有 TCP 连接 | Get-NetTCPConnection |
netstat -ano |
| 查看监听端口 | Get-NetTCPConnection -State Listen |
`netstat -ano |
| 查询指定端口 | Get-NetTCPConnection -LocalPort 9101 |
`netstat -ano |
| 查看 PID | OwningProcess |
netstat -ano 输出最后一列 |
| PID → 进程 | Get-Process -Id 1234 |
tasklist /FI "PID eq 1234" |
| 查看 UDP | Get-NetUDPEndpoint |
netstat -ano -p UDP |
| 查看启动参数 | Get-CimInstance Win32_Process |
wmic process(旧工具) |
一般来说:
- PowerShell:适合结构化查询、脚本自动化;
- CMD:适合快速执行传统命令;
- netstat:兼容性最好;
- Get-NetTCPConnection:PowerShell 下信息更加结构化。
十一、查看一个进程监听的所有端口
如果已经知道 PID:
powershell
Get-NetTCPConnection -OwningProcess 1234 |
Where-Object State -eq Listen |
Select-Object LocalAddress,LocalPort,State,OwningProcess
例如:
text
LocalAddress LocalPort State OwningProcess
------------ --------- ----- -------------
0.0.0.0 8080 Listen 1234
0.0.0.0 8888 Listen 1234
0.0.0.0 9000 Listen 1234
0.0.0.0 9101 Listen 1234
这对于一个进程同时提供多个网络服务的程序非常有用。
十二、直接查看某个程序的所有监听端口
例如查看 weed.exe:
powershell
Get-Process weed -ErrorAction SilentlyContinue |
ForEach-Object {
Get-NetTCPConnection -OwningProcess $_.Id -ErrorAction SilentlyContinue |
Where-Object State -eq "Listen" |
Select-Object LocalAddress,LocalPort,State,OwningProcess
}
同样的方法也适用于其他程序,只需要修改进程名称。
十三、同时显示端口、PID 和进程名称
可以进一步封装成一个更加实用的查询:
powershell
Get-NetTCPConnection -State Listen |
Sort-Object LocalPort |
ForEach-Object {
$p = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
[PSCustomObject]@{
Address = $_.LocalAddress
Port = $_.LocalPort
PID = $_.OwningProcess
Process = if ($p) { $p.ProcessName } else { "Unknown" }
}
}
输出类似:
text
Address Port PID Process
------- ---- --- -------
0.0.0.0 135 1020 svchost
0.0.0.0 445 4 System
0.0.0.0 8080 1234 example
0.0.0.0 8888 1234 example
0.0.0.0 9101 1234 example
这种方式比单独使用 netstat 更容易阅读。
十四、查看 UDP 端口
TCP 和 UDP 是两种不同的传输协议。
查看 UDP:
powershell
Get-NetUDPEndpoint
查看指定 UDP 端口:
powershell
Get-NetUDPEndpoint -LocalPort 9101
CMD 中可以使用:
cmd
netstat -ano -p UDP
因此排查网络端口时,需要注意:
text
TCP 9101
和:
text
UDP 9101
是两个不同的端点。
十五、查看进程实际启动参数
仅仅知道:
text
PID = 1234
Process = example.exe
有时候还不够。
如果需要知道这个进程是通过什么参数启动的,可以使用:
powershell
Get-CimInstance Win32_Process -Filter "ProcessId = 1234" |
Select-Object ProcessId,CommandLine
例如:
text
ProcessId CommandLine
--------- -----------
1234 example.exe --port=9101 --config=config.yaml
这样就可以进一步确定端口的来源。
对于 SeaweedFS 等命令行参数较多的程序,这种方法尤其有用。
十六、查看系统所有监听端口
可以使用:
powershell
Get-NetTCPConnection -State Listen |
Sort-Object LocalPort |
Select-Object LocalAddress,LocalPort,OwningProcess
如果需要同时查看进程名称:
powershell
Get-NetTCPConnection -State Listen |
Sort-Object LocalPort |
ForEach-Object {
$p = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
[PSCustomObject]@{
Address = $_.LocalAddress
Port = $_.LocalPort
PID = $_.OwningProcess
Process = if ($p) { $p.ProcessName } else { "Unknown" }
}
}
可以把它保存成 .ps1,作为日常端口检查脚本。
十七、Windows 自带可视化工具:资源监视器
Windows 自带一个非常实用的工具:
资源监视器(Resource Monitor)
按:
text
Win + R
输入:
text
resmon
打开后进入:
text
网络 → 侦听端口
可以看到当前系统监听的端口,例如:
text
映像 PID 协议 本地地址 本地端口
example.exe 1234 TCP 0.0.0.0 9101
example.exe 1234 TCP 0.0.0.0 9200
它适合快速确认:
text
哪个程序
↓
哪个 PID
↓
监听哪个端口
不需要输入命令。
十八、推荐工具:TCPView
如果经常进行 Windows 网络排查,可以使用 Microsoft Sysinternals 的 TCPView。
TCPView 是一个专门查看 TCP/UDP 连接的图形化工具。
相比 netstat,它更加直观,可以实时显示:
text
Process
PID
Protocol
Local Address
Local Port
Remote Address
Remote Port
State
例如:
text
Process PID Protocol Local Port State
example.exe 1234 TCP 9101 LISTENING
主要优点:
- 图形化;
- 实时刷新;
- 可以按照进程排序;
- 可以按照端口排序;
- 可以查看 TCP 状态;
- 可以观察连接建立和关闭;
- 适合快速定位端口占用。
如果只是日常查看端口,TCPView 是非常实用的工具。
十九、其他常用可视化工具
| 工具 | 类型 | 适合场景 |
|---|---|---|
| 资源监视器 | Windows 自带 | 简单查看端口 |
| TCPView | Sysinternals | 专业查看 TCP/UDP |
| CurrPorts | 第三方 | 查看端口和进程 |
| Process Explorer | Sysinternals | 深入分析进程 |
| Wireshark | 网络分析 | 抓包和分析实际网络通信 |
它们解决的问题并不完全相同:
text
查看端口
↓
资源监视器 / TCPView
查看进程
↓
Process Explorer
自动化检查
↓
PowerShell
分析网络数据
↓
Wireshark
二十、端口占用与网络不通是两个不同的问题
需要特别注意:
"端口被占用"和"端口可以正常访问"不是同一个问题。
例如:
text
程序
↓
监听 9101
只能说明本机存在一个服务。
但客户端是否能够访问,还涉及:
text
服务是否监听正确地址
↓
Windows 防火墙
↓
网络路由
↓
网卡
↓
远端设备
↓
目标端口
例如程序监听:
text
127.0.0.1:9101
只能接受本机访问。
而:
text
0.0.0.0:9101
表示监听本机所有 IPv4 网络接口,是否能被其他机器访问还要继续检查防火墙和网络环境。
二十一、Windows 端口排查的推荐流程
实际工作中可以固定采用下面的流程:
text
① 确认端口是否存在
↓
Get-NetTCPConnection -LocalPort 9101
② 获取 PID
↓
OwningProcess
③ 查看进程
↓
Get-Process -Id 1234
④ 查看启动参数
↓
Get-CimInstance Win32_Process
⑤ 查看该进程的其他端口
↓
Get-NetTCPConnection -OwningProcess 1234
⑥ 如果端口无法远程访问
↓
检查监听地址
↓
检查 Windows 防火墙
↓
检查网络连接
↓
必要时使用 Wireshark 抓包
二十二、最值得记住的几条命令
如果只记住几个命令,可以记下面这些。
查询指定 TCP 端口
powershell
Get-NetTCPConnection -LocalPort 9101
查看所有监听端口
powershell
Get-NetTCPConnection -State Listen
根据 PID 查进程
powershell
Get-Process -Id 1234
查看进程启动参数
powershell
Get-CimInstance Win32_Process -Filter "ProcessId = 1234" |
Select-Object CommandLine
查询 UDP
powershell
Get-NetUDPEndpoint
CMD 查询端口
cmd
netstat -ano | findstr :9101
CMD 根据 PID 查进程
cmd
tasklist /FI "PID eq 1234"
二十三、总结
Windows 下排查端口,核心并不是记住大量命令,而是掌握下面这条关系:
text
端口
↓
PID
↓
进程
↓
启动参数
↓
网络服务
PowerShell 更适合:
text
结构化查询
+
脚本自动化
+
批量检查
CMD 更适合:
text
快速查询
+
兼容性较好的传统命令
而图形化工具可以辅助快速定位:
text
资源监视器
↓
快速查看
TCPView
↓
专业查看端口和连接
Wireshark
↓
深入分析网络通信
因此,在 Windows 开发和部署环境中,一套比较实用的组合是:
text
PowerShell
+
netstat
+
TCPView
+
Wireshark
其中 PowerShell 负责自动化,netstat 负责快速确认,TCPView 负责可视化观察,Wireshark 负责进一步分析实际网络数据。