执行Get-PrinterDriver遇RPC服务器不可达错误,Get-Process正常求故障原因
这个问题挺典型的——同样是远程PowerShell调用,Get-Process能正常返回结果,但Get-PrinterDriver -ComputerName Win7Machine却报HRESULT 0x800706ba(RPC服务器不可达),核心原因在于这两个命令依赖的RPC服务通道、权限模型和系统组件完全不同。结合Windows 7的特性,我整理了几个最可能的排查方向:
1. 打印池服务(Print Spooler)的RPC关联配置异常
Get-PrinterDriver底层依赖目标机器的Print Spooler服务提供的RPC接口,而Get-Process调用的是更通用的WinRM/WMI基础RPC通道。如果目标Win7机器出现以下情况,就会触发RPC不可达错误:
- Print Spooler服务未启动:在目标机器执行
Get-Service Spooler,确保状态为Running; - 服务登录身份受限:部分环境会把Print Spooler的登录账户从默认的
Local System改成低权限账户,导致无法对外提供RPC服务; - RPC端点绑定被修改:比如Print Spooler的RPC端点被限制为仅监听特定IP,而非所有可用网络接口。
2. Windows防火墙的规则/端口差异
Get-Process依赖WinRM的默认端口(5985 HTTP/5986 HTTPS),而打印机驱动的RPC调用需要两个关键部分:
- 135端口(RPC端点映射器):用于定位Print Spooler的动态RPC端口;
- 动态端口范围(Windows 7默认是49152-65535):Print Spooler会随机选择该范围内的端口提供服务。
如果目标Win7机器的防火墙没启用**“文件和打印机共享”**相关的入站规则,或者动态端口范围被修改/限制,就会阻断Get-PrinterDriver的RPC连接,但不影响WinRM的Get-Process调用。
3. WMI命名空间的权限差异
Get-PrinterDriver本质是调用WMI的Win32_PrinterDriver类,而Get-Process调用的是Win32_Process类。这两个WMI类的远程访问权限可能被单独配置:
- 目标Win7机器的
root\CIMV2命名空间中,Win32_PrinterDriver的远程访问权限被拒绝,但Win32_Process允许访问; - 可以先在目标机器本地执行
Get-WmiObject Win32_PrinterDriver确认本地可用,再尝试远程调用Get-WmiObject Win32_PrinterDriver -ComputerName Win7Machine,如果同样报错,就说明是WMI权限问题。
4. RPC协议配置的细微修改
你怀疑RPC配置被修改是合理的,但要注意:Get-Process的WinRM通道可能走HTTP协议,不依赖纯RPC TCP,而Get-PrinterDriver需要直接的RPC TCP连接。如果目标机器的以下RPC配置被修改,就会导致问题:
HKLM\Software\Microsoft\Rpc\ClientProtocols中禁用了ncacn_ip_tcp协议;HKLM\System\CurrentControlSet\Services\RpcSs下的启动类型或参数被修改,导致RPC服务无法正常监听TCP端口。
内容的提问来源于stack exchange,提问作者Matthias Güntert




