排查远程过程调用 (RPC) 错误

适用于:Windows 10

连接到 Windows Management Instrumentation (WMI) 、SQL Server、远程连接期间或某些 Microsoft 管理控制台 (MMC) 管理单元时,可能会遇到 RPC 服务器不可用的错误。下图是 RPC 错误的示例。

显示已发生以下错误的错误消息窗口的屏幕截图:RPC 服务器不可用。

此消息是网络世界中经常遇到的错误消息,如果不尝试了解太多信息,可能会很快失去希望,因为“在引擎盖下”发生了什么。

在排查 RPC 服务器不可用错误之前,让我们先了解有关错误的基础知识。 有几个重要的术语需要了解:

  • 终结点映射器 - 服务器上侦听的服务,可通过端口和 UUID 将客户端应用引导到服务器应用。
  • 塔 - 描述 RPC 协议,以允许客户端和服务器协商连接。
  • Floor – 具有特定数据(如端口、IP 地址和标识符)的塔的内容。
  • UUID - 标识 RPC 应用程序的已知 GUID。 UUID 用于查看特定类型的 RPC 应用程序会话,因为可能有很多。
  • Opnum – 客户端希望服务器执行的函数的标识符。 这只是一个十六进制数字,但一个很好的网络分析器将为你转换函数。 如果两者都不知道,应用程序供应商必须告诉你。
  • 端口 - 客户端和服务器应用程序的通信终结点。
  • 存根数据 - 提供给客户端和服务器之间交换的函数和数据的信息。 此数据是有效负载的重要部分。

注意

上述许多信息用于故障排除,最重要的是与 EPM 通信时获取的动态 RPC 端口号。

连接的工作原理

客户端 A 想要执行某些函数或想要使用远程服务器上运行的服务,将首先通过执行三向握手来与远程服务器建立连接。

演示与远程服务器的连接的关系图。

也可以从特定范围提供 RPC 端口。

配置 RPC 动态端口分配

远程过程调用 (RPC) 动态端口分配由服务器应用程序和远程管理应用程序使用,例如动态主机配置协议 (DHCP) 管理器、Windows Internet 名称服务 (WINS) 管理器等。 RPC 动态端口分配将指示 RPC 程序基于所用操作系统的实现,在为 TCP 和 UDP 配置的范围内使用特定随机端口。

使用防火墙的客户可能想要控制 RPC 使用的端口,以便可以将其防火墙路由器配置为仅转发这些传输控制协议 (UDP 和 TCP) 端口。 Windows 中的许多 RPC 服务器允许在自定义配置项(如注册表项)中指定服务器端口。 当可以指定专用服务器端口时,你将了解主机之间跨防火墙的流量,并且可以以更直接的方式定义允许哪些流量。

作为服务器端口,选择范围之外的端口,可能需要在下面指定。 可以在 Windows 和 Microsoft 主要产品中使用的服务器端口的完整列表中找到 Windows 服务概述和 Windows 的网络端口要求一文。 本文还列出了 RPC 服务器以及哪些 RPC 服务器可以配置为使用 RPC 运行时提供的设施以外的自定义服务器端口。

某些防火墙还允许 UUID 筛选,从 RPC 终结点映射器请求了解 RPC 接口 UUID。 响应具有服务器端口号,然后允许在此端口上通过后续的 RPC 绑定。

使用注册表编辑器,可以修改 RPC 的以下参数。 下面讨论的 RPC 端口密钥值都位于注册表中的以下密钥中:

HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc\Internet\ Entry name Data Type

  • 端口REG_MULTI_SZ

    指定一组 IP 端口范围,这些范围由 Internet 提供的所有端口或 Internet 中不可用的所有端口组成。 每个字符串表示一个端口或一组非独占端口。 例如,单个端口可能由 5984 表示,一组端口可能由 5000-5100 表示。 如果任何条目超出 0 到 65535 的范围,或者无法解释任何字符串,则 RPC 运行时会将整个配置视为无效。

  • PortsInternetAvailable REG_SZ Y 或 N (不区分大小写)

    如果为 Y,则端口密钥中列出的端口是该计算机上所有可用的 Internet 端口。 如果为 N,则端口密钥中列出的端口都是未使用 Internet 的端口。

  • UseInternetPorts REG_SZ ) Y 或 N (不区分大小写)

    • 指定系统默认策略。
    • 如果为 Y,则使用默认值的进程将从 Internet 可用端口集分配端口,如前面定义的那样。
    • 如果为 N,则使用默认值的进程将从一组仅限 Intranet 的端口中分配端口。

示例:

在此示例中,已任意选择端口 5000 到 6000(包括 6000)来帮助说明如何配置新的注册表项。 此示例不是任何特定系统所需的最少端口数的建议。

  1. 在以下下添加 Internet 密钥: HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc

  2. 在 Internet 密钥下,添加值“Ports” (MULTI_SZ) 、“PortsInternetAvailable” (REG_SZ) 和“UseInternetPorts” (REG_SZ) 。

    例如,新的注册表项如下所示:端口:REG_MULTI_SZ:5000-6000 PortsInternetAvailable:REG_SZ:Y UseInternetPorts:REG_SZ: Y

  3. 重新启动服务器。 所有使用 RPC 动态端口分配的应用程序都使用端口 5000 到 6000(含)。

应在端口 5000 以上打开一系列端口。 低于 5000 的端口号可能已被其他应用程序使用,并可能导致与 DCOM 应用程序 () 冲突。 此外,以前的体验表明,应至少打开 100 个端口,因为多个系统服务依赖于这些 RPC 端口相互通信。

注意

所需的最小端口数可能因计算机而异。 如果 RPC 动态端口受到限制,流量较高的计算机可能会遇到端口耗尽的情况。 限制端口范围时,请考虑这一点。

警告

如果端口配置中出现错误或池中端口不足,终结点映射器服务将无法向动态终结点注册 RPC 服务器。 出现配置错误时,错误代码将为 87 (0x57) ERROR_INVALID_PARAMETER。 这也会影响 Windows RPC 服务器,例如 Netlogon。 在这种情况下,它将记录事件 5820:

日志名称:系统
来源:NETLOGON
事件 ID:5820
级别:错误
关键字:经典
说明:
Netlogon 服务无法添加 AuthZ RPC 接口。 服务已终止。 出现以下错误:“参数不正确。

若要深入了解其工作原理,请 参阅 IT/Pro 的 RPC

排查 RPC 错误

PortQuery

在进入跟踪之前,最好始终排查 RPC 问题,方法是使用 PortQry 等工具。 可以通过运行命令快速确定是否能够建立连接:

Portqry.exe -n <ServerIP> -e 135

此命令将提供要查找的大部分输出,但应查找 *ip_tcp- 方括号中的端口号,这会告知你是否能够从 EPM 成功获取动态端口,并连接到该端口。 如果上述操作失败,通常可以开始收集同时进行的网络跟踪。 “PortQry”的输出如下所示:

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.10<strong>[49664]</strong>

加粗的端口号是你成功连接到的临时端口号。

Netsh

可以运行以下命令以使用 Windows 内置 netsh 捕获来收集同时跟踪。 请记住,在“管理员 CMD”上执行以下操作需要提升。

  • 在客户端上

    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 或消息分析器中打开跟踪并筛选跟踪

  • Ipv4.address==<client-ip>tcp.port==135ipv4.address==<server-ip>或只是tcp.port==135应该帮助。

  • 在“协议”列下查找“EPM” 协议

  • 现在检查是否从服务器收到响应。 如果收到响应,请记下已分配用于的动态端口号。

    网络监视器的屏幕截图,其中突出显示了动态端口。

  • 检查是否成功连接到此动态端口。

  • 筛选器应如下所示: tcp.port==<dynamic-port-allocated>ipv4.address==<server-ip>

    应用了筛选器的网络监视器的屏幕截图。

此筛选器应有助于验证连接性,并在出现任何网络问题时进行隔离。

无法访问端口

导致 RPC 服务器不可用的最常见原因是无法访问客户端尝试连接的动态端口。 然后,客户端跟踪会显示动态端口的 TCP SYN 重新传输。

具有 TCP SYN 重新传输的网络监视器的屏幕截图。

由于以下原因之一,无法访问端口:

  • 在环境中的防火墙上阻止动态端口范围。
  • 中间设备正在删除数据包。
  • 目标服务器正在删除数据包 (WFP 删除/NIC 删除/筛选器驱动程序等) 。