要查清Windows中某端口被哪个服务占用,需先用netstat -ano定位PID,再用tasklist /svc关联服务名;对svchost.exe需结合sc queryex或PowerShell进一步区分;第三方软件、IIS子进程等非服务进程也常见于端口占用。
要查清 windows 中某个端口被哪个服务占用,核心思路是:先定位监听该端口的进程,再确认该进程所属的服务(尤其是 windows 服务)。因为不是所有监听端口的进程都是服务,但服务若监听端口,必然通过其宿主进程体现。
用 netstat + tasklist 快速关联端口与服务名
这是最常用、无需额外工具的方法:
- 以管理员身份打开命令提示符或 PowerShell
- 运行:netstat -ano -p TCP | findstr :端口号(例如 findstr :80),获取监听该端口的 PID
- 再运行:tasklist /svc /fi "PID eq XXXX"(将 XXXX 替换为上一步得到的 PID),输出中会列出该进程加载的所有服务名(SERVICE NAME 列)
- 若输出显示“N/A”,说明该进程不是由 Windows 服务启动(如普通程序、svchost.exe 托管但未注册为独立服务等)
识别 svchost.exe 托管的多个服务
很多系统服务(如 DNS Client、Windows Update)共用 svchost.exe 进程,仅靠 PID 无法区分具体服务:
- 先用 netstat -ano -p TCP 找到对应 svchost 的 PID
- 运行:tasklist /svc /fi "PID eq XXXX" 查看该 svchost 加载了哪些服务名
- 更进一步可执行:sc queryex type= service state= all | findstr /i "XXXX"(用 PID 搜索),辅助验证
- 也可用 Get-Process -Id XXXX | Select-Object -ExpandProperty Modules | Where-Object {$_.FileName -like "*dll"}(PowerShell)查看加载的 DLL,结合服务名推断功能
用 PowerShell 一键查端口对应服务(推荐自动化)
以下命令可直接输出端口、进程名、服务名(如有):
Get-NetTCPConnection -LocalPort 端口号 | ForEach-Object {
$proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
if ($proc) {
$svc = Get-WmiObject Win32_Service | Where-Object {$_.ProcessId -eq $_.OwningProcess}
[PSCustomObject]@{
Port = $_.LocalPort
ProcessName = $proc.ProcessName
ServiceName = if ($svc) { $svc.Name } else { 'N/A' }
Status = if ($svc) { $svc.State } else { 'N/A' }
}
}
}
把“端口号”替换成实际数字(如 443),结果清晰直观。注意需以管理员身份运行。
排查常见干扰项:非服务类监听进程
有些端口被占用,但和 Windows 服务无关,需留意:
- 第三方软件:Docker Desktop(占用 2375/2376)、WSL2(常占 5000、8080)、IDE 内置服务器、数据库客户端工具等
- 系统组件但非服务:Windows 功能如“Internet Information Services (IIS)”启用后,w3wp.exe 或 iisexpress.exe 监听,但 IIS 本身是服务,而具体站点进程不直接显示为服务名
- 已停止但残留监听:某些程序异常退出后端口未释放(TIME_WAIT 状态正常,但 LISTENING 状态残留需重启进程)
- 检查是否启用了“Hyper-V”或“Windows Subsystem for Linux”,它们可能通过虚拟网卡或代理方式间接占用端口










