如何用PowerShell实现netstat -b等效功能并获取svchost.exe启动组件
PowerShell 实现
netstat -b 等效功能 netstat -b 用于显示创建每个连接或监听端口的可执行文件;当svchost.exe这类可执行文件承载多个独立组件时,还会展示创建连接/监听端口的组件调用序列——可执行文件名放在底部的[]中,上方是它调用的组件,逐层往上直到TCP/IP。注意该选项执行耗时较长,且需要管理员权限才能完整获取信息。
比如使用netstat -anb查看EventLog监听端口时,输出如下:
TCP 0.0.0.0:49665 0.0.0.0:0 LISTENING EventLog [svchost.exe]
以下PowerShell函数可输出所有监听进程,但仅能获取进程名,无法拿到组件信息:
function Get-ListeningProcesses { Get-NetTCPConnection -State Listen | ForEach-Object { $ProcessName = (Get-Process -Id $_.OwningProcess).ProcessName [PSCustomObject]@{ LocalAddress = $_.LocalAddress LocalPort = $_.LocalPort OwningProcess = $_.OwningProcess ProcessName = $ProcessName } } }
它的输出示例:
LocalAddress LocalPort OwningProcess ProcessName ------------ --------- ------------- ----------- ... :: 49665 1412 svchost ...
获取svchost.exe对应的组件方法
svchost.exe是Windows服务的托管进程,每个实例对应一组服务,我们可以通过进程ID关联到对应的服务(即组件名称),改进后的实现如下:
完整函数代码
function Get-TcpListenersWithComponents { Get-NetTCPConnection -State Listen | ForEach-Object { $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue $components = @() # 针对svchost进程,查询其托管的服务 if ($proc.ProcessName -eq 'svchost') { $services = Get-CimInstance Win32_Service | Where-Object { $_.ProcessId -eq $proc.Id } $components = $services | ForEach-Object { $_.Name } } [PSCustomObject]@{ LocalAddress = $_.LocalAddress LocalPort = $_.LocalPort OwningProcess = $proc.Id ProcessName = $proc.ProcessName Components = if ($components.Count -gt 0) { $components -join ', ' } else { 'N/A' } } } }
输出说明
- 新增
Components列:非svchost进程显示N/A,svchost进程则列出它托管的所有服务名称(即对应的组件) - 示例输出:
LocalAddress LocalPort OwningProcess ProcessName Components ------------ --------- ------------- ----------- ---------- :: 49665 1412 svchost EventLog
注意事项
- 必须以管理员权限运行PowerShell,才能完整获取服务关联信息
- 执行耗时会比原函数长,和
netstat -b的特性一致
内容的提问来源于stack exchange,提问作者MiGro
相关产品推荐
相关产品推荐

