次の方法で共有


サービスと 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 は、SCMApiConnectionParamDisableRPCOverTCP、および DisableRemoteScmEndpoints レジストリ値 によって制御されます。これらはすべて、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 秒) です。