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

通过服务名称获取远程计算机进程PID并终止对应进程

用PowerShell远程终止指定服务对应的进程

我来帮你搞定这个需求!你原来的思路是对的——通过固定服务名找到动态的PID再终止进程,但直接嵌套命令容易遇到服务未运行、权限或连接问题导致报错,而且用纯PowerShell的方式会更流畅,也更符合PowerShell的生态。下面给你几个优化后的方案:

方案1:用WMI(兼容旧版PowerShell)

先获取远程服务对象,判断进程是否存在再执行终止,避免空PID导致的错误:

# 先获取远程机器的凭据(推荐用这种方式,避免明文密码)
$credential = Get-Credential -UserName rasmus123 -Message "输入远程机器rasmuspc的登录密码"

# 获取目标服务的信息
$targetService = Get-WmiObject -ComputerName rasmuspc -Credential $credential -Class Win32_Service -Filter "Name='Spooler'"

# 只有当服务有运行的进程时(PID不为0)才执行终止
if ($targetService.ProcessID -ne 0) {
    # 用PowerShell原生的Stop-Process远程杀进程
    Stop-Process -Id $targetService.ProcessID -ComputerName rasmuspc -Force -Credential $credential
    Write-Host "已成功终止服务Spooler对应的进程(PID: $($targetService.ProcessID))"
} else {
    Write-Warning "服务Spooler当前没有运行的进程,无需终止"
}

方案2:用CIM(更现代、高效的方式)

CIM是WMI的替代方案,在新版PowerShell中推荐使用,性能和兼容性更好:

$cred = Get-Credential -UserName rasmus123 -Message "输入远程机器凭据"

# 获取服务信息
$service = Get-CimInstance -ComputerName rasmuspc -Credential $cred -ClassName Win32_Service -Filter "Name='Spooler'"

if ($service.ProcessID -gt 0) {
    # 通过CIM调用进程终止方法
    Get-CimInstance -ComputerName rasmuspc -Credential $cred -ClassName Win32_Process -Filter "ProcessId=$($service.ProcessID)" | 
        Invoke-CimMethod -MethodName Terminate
    Write-Host "进程PID $($service.ProcessID) 已终止"
} else {
    Write-Warning "服务未运行,无对应进程"
}

额外提示:如果只是要停止服务而非强制杀进程

如果你的需求其实是停止服务(而非服务卡死必须杀进程),直接用Stop-Service更简单:

Stop-Service -Name Spooler -ComputerName rasmuspc -Force -Credential $cred

注意事项

  • 确保远程机器开启了WMI/CIM服务,防火墙允许对应的端口(WMI用135+动态端口,CIM通过WinRM的话是5985/5986)
  • 你使用的账号必须有远程机器的管理员权限,才能终止进程或操作服务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:17:49