用 CIM 查进程
通过 CIM 接口查询进程,能拿到常规进程命令没有的信息,例如完整启动命令行、父进程号、可执行路径与所属用户。排查“端口被谁占了”“这个进程是被谁拉起来的”时,命令行字段往往比进程名有用得多。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7 |
|---|---|
| 推荐写法 | Get-CimInstance,旧式的 Get-WmiObject 在新版本已不推荐 |
| 常用类 | Win32_Process 进程、Win32_Service 服务、Win32_OperatingSystem 系统信息 |
| 关键字段 | ProcessId、ParentProcessId、CommandLine、ExecutablePath |
| 过滤写法 | -Filter 使用 WQL 语法,与 PowerShell 语法不一致 |
| 远程查询 | -ComputerName 需要相应权限与管理通道就绪 |
典型使用场景
- 按命令行关键字找进程,例如找出带某个参数启动的服务
- 查父进程号,理清进程树与是谁把它拉起来的
- 定位监听端口的归属进程,再查它的完整命令行
- 批量巡检多台机器上的进程并汇总导出
- 排查可疑进程:确认可执行路径与启动参数是否正常
常用示例
常用示例
# 按名称过滤,看命令行与父进程
Get-CimInstance Win32_Process -Filter "Name='w3wp.exe'" | Select-Object ProcessId, ParentProcessId, CommandLine
# 按命令行关键字搜索
Get-CimInstance Win32_Process | Where-Object CommandLine -like '*--port 8080*' | Select-Object ProcessId, Name, CommandLine
# 结合监听端口找归属进程,注意别用内置的自动变量名
$owner = (Get-NetTCPConnection -LocalPort 8080 -State Listen).OwningProcess
Get-CimInstance Win32_Process -Filter "ProcessId=$owner" | Select-Object ProcessId, Name, CommandLine常用类与字段
| 类或字段 | 含义 | 用途 |
|---|---|---|
| Win32_Process | 进程类 | 查询命令行与父子关系 |
| CommandLine | 完整启动命令行 | 定位参数与端口等配置 |
| ParentProcessId | 父进程号 | 追溯是谁拉起了它 |
| Win32_Service | 服务类 | 查服务路径与状态 |
| Win32_OperatingSystem | 系统信息类 | 查内存总量与系统版本 |
-Filter 使用 WQL 语法,字符串常量要写在单引号里,转义规则与 PowerShell 不同。不确定写法时可以先取全量再管道过滤,但数据量大的时候性能会明显下降。
全量枚举进程并读取命令行有实际开销,机器繁忙时更明显。尽量先用 -Filter 把范围缩小,再对结果做二次筛选。