远程过程调用 (RPC) 错误故障排除指南
适用于: Windows 客户端
连接到 Windows Management Instrumentation (WMI) 或 Microsoft SQL Server 时,在远程过程调用 (RPC) 会话期间,或者使用各种 Microsoft 管理控制台 (MMC) 管理单元时,可能会遇到“RPC 服务器不可用”错误。下图显示了 RPC 错误的示例。
这是一个常见的网络错误,需要基本熟悉该过程才能成功进行故障排除。 首先,有几个重要的术语需要理解:
- 终结点映射器 (EPM) :一种服务,该服务在服务器上侦听,并使用端口和 UUID 信息将客户端应用引导到服务器应用。
- 塔:介绍使客户端和服务器能够协商连接的 RPC 协议。
- 楼层:塔内包含特定数据(例如端口、IP 地址和标识符)的内容层。
- UUID:标识 RPC 应用程序的已知 GUID。 在故障排除期间,可以使用 UUID 跟踪单一类型的 RPC 对话, (在一台计算机上同时发生的多种类型) 。
- Opnum:标识客户端希望服务器执行的函数。 这只是一个十六进制数。 但是,一个好的网络分析器会为你转换函数。 如果无法识别函数,请联系应用程序供应商。
-
端口:客户端或服务器应用程序的通信终结点。 EPM 分配动态端口 (也称为高端口或临时端口) 供客户端和服务器使用。
注意
通常,端口号是用于故障排除的最重要信息。
- 存根数据:客户端上的函数与服务器上的函数之间交换的数据。 此数据是有效负载,是通信的重要组成部分。
连接的工作原理
下图显示了客户端连接到服务器以运行远程操作。 客户端最初联系服务器上的 TCP 端口 135,然后与 EPM 协商动态端口号。 EPM 分配端口后,客户端断开连接,然后使用动态端口连接到服务器。
重要
如果防火墙将客户端和服务器分开,则防火墙必须允许在端口 135 和 EPM 分配的动态端口上进行通信。 管理此方案的一种方法是指定 EPM 要使用的端口或端口范围。 有关详细信息,请参阅 配置 RPC 分配动态端口的方式。
某些防火墙还允许 UUID 筛选。 在此方案中,如果 RPC 请求使用端口 135 穿过防火墙并联系 EPM,则防火墙会记下与请求关联的 UUID。 当 EPM 响应并发送该 UUID 的动态端口号时,防火墙还会记下端口号。 然后,防火墙允许针对该 UUID 和端口执行 RPC 绑定操作。
配置 RPC 分配动态端口的方式
默认情况下,EPM 根据) 使用的操作系统的实现,从为 TCP 和 UDP (配置的范围随机分配动态端口。 但是,此方法可能不实用,尤其是在客户端和服务器必须通过防火墙进行通信的情况下。 另一种方法是指定 EPM 要使用的端口号或端口号范围,并在防火墙中打开这些端口。
许多依赖于 RPC 的 Windows 服务器应用程序都提供了 (选项,例如注册表项) 来自定义允许的端口。 Windows 服务对此任务使用 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Rpc\Internet 子项。
指定端口或端口范围时,请使用超出常用端口范围的端口。 可以在 Windows 的服务概述和网络端口要求中找到 Windows 和主要 Microsoft 产品中使用的服务器端口的完整列表。 本文还列出了 RPC 服务器应用程序,并提到了哪些 RPC 服务器应用程序可以配置为使用超出 RPC 运行时功能的自定义服务器端口。
重要
此部分(或称方法或任务)介绍了修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,请务必严格按照这些步骤操作。 出于防范目的,请在修改之前备份注册表,以便在出现问题时还原注册表。 有关如何备份和还原注册表的详细信息,请参阅如何备份和还原 Windows 中的注册表。
默认情况下, Internet 密钥不存在。 因此,必须创建它。 对于 Internet 密钥,可以配置以下条目:
端口REG_MULTI_SZ:指定端口或端口的包含范围。 Internet 下显示的其他条目指示这些是要使用的端口还是要排除的端口。
- 值范围: 0 - 65535
例如, 5984 表示单个端口, 5000–5100 表示一组端口。 如果任何值超出了 0 到 65535 的范围,或者无法解释任何值,则 RPC 运行时会将整个配置视为无效。
- 值范围: 0 - 65535
PortsInternetAvailable REG_SZ:指定 Ports 值是表示要包含的端口还是要排除的端口。
- 值: Y 或 N (不区分大小写)
- Y: “端口 ”条目中列出的端口表示该计算机上可供 EPM 使用的所有端口。
- N: “端口 ”条目中列出的端口表示 EPM 不可用的所有端口。
- 值: Y 或 N (不区分大小写)
UseInternetPorts REG_SZ:指定默认系统策略。
- 值: Y 或 N (不区分大小写)
- Y:使用默认系统策略的进程是从 Internet 可用端口集中分配的端口,如前所述。
- N:使用默认系统策略的进程是从仅限 Intranet 的端口集中分配的端口。
- 值: Y 或 N (不区分大小写)
应打开大于端口 5000 的端口范围。 小于 5000 的端口号可能已被其他应用程序使用,它们可能会导致与 DCOM 应用程序冲突。 此外,以前的经验表明,至少应打开 100 个端口。 这是因为多个系统服务依赖于这些 RPC 端口来相互通信。
注意
所需的最小端口数可能因计算机而异。 如果 RPC 动态端口受到限制,支持更多流量的计算机可能会遇到端口耗尽问题。 如果限制端口范围,请考虑这一点。
警告
如果端口配置出错,或者池中没有足够的端口,EPM 无法注册 RPC 服务器应用程序 (包括使用动态终结点的 Windows 服务(例如 Netlogon) )。 如果发生配置错误,错误代码为 87 (0x57) ERROR_INVALID_PARAMETER。 例如,如果没有足够的端口,Netlogon 会记录事件 5820:
日志名称:系统
来源:NETLOGON
事件 ID:5820
级别:错误
关键字:经典
说明:
Netlogon 服务无法添加 AuthZ RPC 接口。 服务已终止。 出现以下错误:“参数不正确。”
有关 RPC 工作原理的详细信息,请参阅 RPC over IT/Pro。
自定义端口配置示例
在此示例中,端口 5000 到 6000 (包含) 任意选择,以帮助说明如何配置新的注册表项。 此示例不是任何特定系统所需的最小端口数的建议。 此类配置需要在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Rpc下添加 Internet 密钥,并添加以下条目:
-
端口MULTI_SZ
- 数据类型: MULTI_SZ
- 值: 5000-6000
-
PortsInternetAvailable REG_SZ
- 数据类型: REG_SZ
- 值: Y
-
UseInternetPorts REG_SZ
- 数据类型: REG_SZ
- 值: Y
计算机必须重启才能使此配置生效。 之后,将使用 RPC 的所有应用程序分配动态端口,范围为 5000 到 6000 (包括) 。
排查 RPC 错误
PortQry
在深入了解网络跟踪数据之前,PortQry 可以快速了解 RPC 的工作原理。 可以通过在客户端计算机上运行以下命令来快速确定是否可以建立连接:
Portqry.exe -n <ServerIP> -e 135
注意
在此命令中, <ServerIP> 表示要联系的服务器 IP 地址。
例如,请考虑以下命令:
Portqry.exe -n 169.254.0.2 -e 135
此命令生成类似于以下摘录的输出:
Querying target system called:
169.254.0.2
Attempting to resolve IP address to a name...
IP address resolved to RPCServer.contoso.com
querying...
TCP port 135 (epmap service): LISTENING
Using ephemeral source port
Querying Endpoint Mapper Database...
Server's response:
UUID: d95afe70-a6d5-4259-822e-2c84da1ddb0d
ncacn_ip_tcp:169.254.0.2[49664]
通过检查此输出,可以确定以下信息:
- DNS 正常工作 (将 IP 地址解析为完全限定的域名 (FQDN) ) 。
- PortQry 已联系目标计算机上的 RPC 端口 (135) 。
- EPM 响应了 PortQry,并分配了动态端口 49664 (括在方括号) 以供后续通信。
- PortQry 已重新连接到端口 49664。
如果这些步骤中的任何一个失败,通常可以开始收集同时的网络跟踪,如下一部分所述。
有关 PortQry 的详细信息,请参阅 使用 PortQry 命令行工具。
Netsh
可以使用 Windows netsh 工具在客户端和服务器上同时收集网络跟踪数据。
若要同时收集网络跟踪,请在客户端和服务器上打开提升的命令提示符窗口。
在客户端上运行以下命令:
Netsh trace start scenario=netconnection capture=yes tracefile=c:\client_nettrace.etl maxsize=512 overwrite=yes report=yes
在服务器上,运行以下命令:
Netsh trace start scenario=netconnection capture=yes tracefile=c:\server_nettrace.etl maxsize=512 overwrite=yes report=yes
现在,尝试在客户端计算机上重现你的问题。 然后,在两个窗口中的命令提示符处运行以下命令以停止跟踪:
Netsh trace stop
在 Microsoft 网络监视器 3.4 或消息分析器中打开跟踪文件,并筛选服务器或客户端计算机的 IP 地址以及 TCP 端口 135 的跟踪数据。 例如,使用筛选器字符串,如下所示:
Ipv4.address==<client-ip> and ipv4.address==<server-ip> and tcp.port==135
在此筛选器字符串中,<client-ip> 表示客户端的 IP 地址,server-ip>< 表示服务器的 IP 地址。
tcp.port==135
在筛选的数据中,在“协议”列中查找 EPM 条目。
在包含动态端口号的服务器) 查找来自 EPM (的响应。 如果存在动态端口号,请记下它以供将来参考。
重新调整动态端口号和服务器 IP 地址的跟踪数据。 例如,使用筛选器字符串,例如 tcp.port==<dynamic-port-allocated> 和 ipv4.address==<server-ip>。 在此筛选器字符串中, <动态端口分配> 表示动态端口号, <server-ip> 表示服务器的 IP 地址。
在筛选的数据中,查找客户端成功连接到动态端口的证据,或查找可能发生的任何网络问题。
端口无法访问
“RPC 服务器不可用”错误的最常见原因是客户端无法连接到已分配的动态端口。 然后,客户端跟踪会显示动态端口的 TCP SYN 重新传输。
此行为表示以下条件之一正在阻止通信:
- 动态端口范围在环境中的防火墙上被阻止。
- 中间设备正在丢弃数据包。
- 目标服务器正在丢弃数据包。 这种情况可能是由以下配置引起的: Windows 筛选平台 (WFP) 数据包丢弃、网络接口卡 (NIC) 数据包丢弃或 筛选器驱动程序 修改。
收集数据以便进行更深入的故障排除
在联系 Microsoft 支持人员之前,我们建议你收集有关你的问题的信息。
先决条件
这些过程使用 TroubleShootingScript (TSS) 工具集。 若要使用此工具集,应注意以下先决条件:
必须对本地计算机具有管理员级权限。
首次运行工具集时,必须接受 EULA。
确保计算机的Windows PowerShell脚本执行策略设置为
RemoteSigned
。 有关 PowerShell 执行策略的详细信息,请参阅 about_Execution_Policies。注意
如果环境阻止你在计算机级别使用
RemoteSigned
,则可以在进程级别暂时设置它。 为此,请在启动该工具之前,在提升的 Powershell 命令提示符窗口中运行以下 cmdlet:PS C:\> Set-ExecutionPolicy -scope Process -ExecutionPolicy RemoteSigned
若要验证更改是否生效,请
PS C:\> Get-ExecutionPolicy -List
运行 cmdlet。进程级权限仅适用于当前 PowerShell 会话。 关闭 PowerShell 窗口后,执行策略将恢复为原始设置。