如何仅通过服务名确定Windows服务的监听端口?支持PowerShell/CMD实现
Windows 服务监听端口查询方案
现象说明
你观察到netstat返回自定义服务监听端口的PID固定为4,是因为这类服务使用了Windows内核的http.sys驱动托管HTTP/HTTPS请求,端口由系统内核层面统一监听,所属进程显示为System进程(固定PID 4),和服务本身的进程ID不一致。
非http.sys托管普通服务查询方法
PowerShell 命令
- 基于服务名获取进程ID
$svcPID = (Get-CimInstance -ClassName Win32_Service -Filter "Name='my-service'").ProcessId
- 查询该进程的监听端口
Get-NetTCPConnection -OwningProcess $svcPID | Where-Object { $_.State -eq 'Listen' } | Select-Object LocalAddress, LocalPort
CMD 命令
- 基于服务名获取进程ID
for /f "tokens=3 delims=: " %a in ('sc queryex "my-service" ^| findstr "PID"') do set svcPID=%a
- 查询该进程的监听端口
netstat -ano | findstr /r /c:"LISTENING.*%svcPID%"
http.sys托管服务查询方法(即netstat显示PID为4的场景)
PowerShell 命令
# 先获取服务对应进程ID $svcPID = (Get-CimInstance -ClassName Win32_Service -Filter "Name='my-service'").ProcessId # 匹配http.sys中该进程绑定的端口 netsh http show servicestate view=requestq | Select-String -Pattern "Process ID:\s+$svcPID", "URL:\s+http.*?(:\d+)/" -Context 0,2
输出结果中URL字段的冒号后数字即为服务监听的端口。
CMD 命令
:: 先获取服务对应进程ID for /f "tokens=3 delims=: " %a in ('sc queryex "my-service" ^| findstr "PID"') do set svcPID=%a :: 匹配http.sys中该进程绑定的端口 netsh http show servicestate view=requestq | findstr /i /r /c:"Process ID.*%svcPID%" /c:"URL.*http"
内容的提问来源于stack exchange,提问作者Orest Gulman
相关产品推荐
相关产品推荐

