You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell服务与进程关联查询求助:四项任务实现疑难咨询

解决进程与服务关联的PowerShell任务

嘿,别担心,我来帮你搞定任务3和4!其实核心思路就是通过**进程ID(PID)**来关联进程和服务——因为运行中的服务都会对应一个PID,我们只要把两边的PID匹配起来就行。

先准备基础数据

首先,我们先把运行中的进程和服务都存到变量里,方便后续操作:

# 获取所有正在运行的进程
$runningProcesses = Get-Process

# 获取所有正在运行的服务,仅保留名称、显示名和PID
$runningServices = Get-CimInstance -Class Win32_Service | Where-Object { $_.State -eq 'Running' } | Select-Object Name, DisplayName, ProcessId

这里我换成了Get-CimInstance而不是Get-WmiObject,因为WMI cmdlet已经被微软标记为过时了,CIM是更推荐的替代方案,功能完全一致。


任务3:列出每个进程关联的服务及PID

一个进程可能对应多个服务(最典型的就是svchost.exe,很多系统服务都跑在它里面),所以我们要遍历每个进程,找到所有PID匹配的服务:

# 遍历每个运行中的进程
foreach ($process in $runningProcesses) {
    # 找到所有和当前进程PID匹配的运行中服务
    $relatedServices = $runningServices | Where-Object { $_.ProcessId -eq $process.Id }

    if ($relatedServices) {
        Write-Host "`n进程: $($process.ProcessName) (PID: $($process.Id))"
        Write-Host "关联的服务:"
        $relatedServices | ForEach-Object {
            Write-Host "  - 服务名: $($_.Name) | 显示名: $($_.DisplayName) | PID: $($_.ProcessId)"
        }
    }
}

这段代码会逐个检查进程,一旦找到对应服务就输出进程信息和关联的服务列表,非常直观。


任务4:列出无关联服务的进程及PID

这一步更简单,我们只需要找出那些PID不在任何运行服务PID列表里的进程:

# 先提取所有运行中服务的PID集合
$servicePIDs = $runningServices | Select-Object -ExpandProperty ProcessId

# 筛选出PID不在服务PID集合里的进程
$processesWithoutServices = $runningProcesses | Where-Object { $servicePIDs -notcontains $_.Id }

# 输出结果
Write-Host "`n无关联服务的进程:"
$processesWithoutServices | Select-Object ProcessName, Id | Format-Table -AutoSize

这样就能得到所有没有对应服务的进程,比如你自己打开的浏览器、编辑器这些用户态进程都会在这里。


额外优化:合并成一个完整脚本

如果你想一次性运行所有四个任务,可以把这些代码整合起来:

# 任务1:列出正在运行的进程
Write-Host "=== 任务1:正在运行的进程 ==="
Get-Process | Select-Object ProcessName, Id | Format-Table -AutoSize

# 任务2:列出正在运行的服务及其PID
Write-Host "`n=== 任务2:正在运行的服务及其PID ==="
Get-CimInstance -Class Win32_Service | Where-Object { $_.State -eq 'Running' } | Select-Object Name, DisplayName, ProcessId | Format-Table -AutoSize

# 准备关联所需的数据
$runningProcesses = Get-Process
$runningServices = Get-CimInstance -Class Win32_Service | Where-Object { $_.State -eq 'Running' } | Select-Object Name, DisplayName, ProcessId
$servicePIDs = $runningServices | Select-Object -ExpandProperty ProcessId

# 任务3:列出进程关联的服务及PID
Write-Host "`n=== 任务3:进程关联的服务及PID ==="
foreach ($process in $runningProcesses) {
    $relatedServices = $runningServices | Where-Object { $_.ProcessId -eq $process.Id }
    if ($relatedServices) {
        Write-Host "`n进程: $($process.ProcessName) (PID: $($process.Id))"
        $relatedServices | ForEach-Object {
            Write-Host "  服务: $($_.DisplayName) ($($_.Name)) | PID: $($_.ProcessId)"
        }
    }
}

# 任务4:列出无关联服务的进程及PID
Write-Host "`n=== 任务4:无关联服务的进程及PID ==="
$runningProcesses | Where-Object { $servicePIDs -notcontains $_.Id } | Select-Object ProcessName, Id | Format-Table -AutoSize

这样运行脚本就能一次性得到所有四个任务的结果啦!

内容的提问来源于stack exchange,提问作者puddle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:41:01