服务和 RPC/TCP

从 Windows Vista 开始,服务控制管理器(SCM)支持通过传输控制协议(RPC/TCP)和命名管道(RPC/NP)进行远程过程调用。 客户端 SCM 函数默认使用 RPC/TCP。

RPC/TCP 适用于大多数远程使用 SCM 函数的应用程序,例如远程管理或监视工具。 但是,为了兼容和性能,某些应用程序可能需要通过设置本主题中所述的注册表值来禁用 RPC/TCP。

当服务调用远程 SCM 函数时,客户端 SCM 首先尝试使用 RPC/TCP 与服务器端 SCM 通信。 如果服务器运行的是支持 RPC/TCP 并允许 RPC/TCP 流量的 Windows 版本,则 RPC/TCPP 连接将成功。 如果服务器运行的是不支持 RPC/TCP 的 Windows 版本,或支持 RPC/TCP,但运行在仅允许命名管道流量的防火墙后面,RPC/TCP 连接超时,SCM 会重试与 RPC/NP 的连接。 这最终会成功,但可能需要一些时间(通常超过 20 秒),导致 OpenSCManager 函数出现阻塞。

TCP 不会携带使用 net use 命令指定的用户凭据。 因此,如果启用了 RPC/TCP,并且 sc.exe 用于尝试访问指定的服务,则命令可能会失败,但访问被拒绝。 在客户端上禁用 RPC/TCP 会导致 sc.exe 命令使用具有用户凭据的命名管道,因此该命令将成功。 有关 sc.exe的信息,请参阅 使用 SC控制服务。

注意

服务不应向 net use 命令提供显式凭据,因为这些凭据可能在服务边界之外无意间共享。 相反,服务应使用 客户端模拟 来模拟用户。

 

RPC/TCP 注册表值

RPC/TCP 由 SCMApiConnectionParamDisableRPCOverTCPDisableRemoteScmEndpoints 注册表值控制,这些值都位于 system HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control 键下。 所有这些值都具有REG_DWORD数据类型。 以下过程演示如何使用这些注册表值来控制 RPC/TCP。

以下过程介绍如何在客户端上禁用 RPC/TCP。

在客户端 禁用 RPC/TCP

  1. SCMApiConnectionParam 注册表值与掩码值合并0x80000000。
  2. 重启调用 OpenSCManager 函数的应用程序。

以下过程介绍如何在服务器端禁用 TCP。

在服务器端禁用 TCP

  1. DisableRPCOverTCP 注册表值设置为 1。
  2. 重启服务器。

以下过程介绍如何在服务器上禁用 RPC/TCP 和 RPC/NP(例如,减少攻击面)。

在服务器上禁用 RPC/TCP 和 RPC/NP

  1. DisableRemoteScmEndpoints 注册表值设置为 1。
  2. 重启服务器。

SCMApiConnectionParam 注册表值还可用于指定 RPC/TCP 超时间隔(以毫秒为单位)。 例如,值为 30,000 指定超时间隔为 30 秒。 默认值为 21,000 (21 秒)。