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
相关产品推荐
相关产品推荐

