サービスと 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 を使用したサービスの制御」を参照してください。

Note

net use コマンドに明示的な資格情報を提供しないでください。これは、これらの資格情報が誤ってサービス境界の外部で共有される可能性があるためです。 代わりに、サービスはクライアントの 偽装 を使用してユーザーを偽装する必要があります。

 

RPC/TCP レジストリ値

RPC/TCP は 、SCMApiConnectionParamDisableRPCOverTCPDisableRemoteScmEndpoints レジストリ値によって制御されます。これらはすべて 、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\制御 キーの下にあります。 これらの値はすべて、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 秒) です。