服务和 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 连接将成功。 如果服务器运行的 Windows 版本不支持 RPC/TCP,或者支持 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 注册表值控制,这些值都位于 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 秒) 。