RpcServerRegisterIf2 関数 (rpcdce.h)
RpcServerRegisterIf2 関数は、RPC ランタイム ライブラリにインターフェイスを登録します。
構文
RPC_STATUS RpcServerRegisterIf2(
RPC_IF_HANDLE IfSpec,
UUID *MgrTypeUuid,
RPC_MGR_EPV *MgrEpv,
unsigned int Flags,
unsigned int MaxCalls,
unsigned int MaxRpcSize,
RPC_IF_CALLBACK_FN *IfCallbackFn
);
パラメーター
IfSpec
登録するインターフェイスを示す MIDL で生成された構造体。
MgrTypeUuid
MgrEpv パラメーターに関連付ける UUID 型へのポインター。 null パラメーター値 (または nil UUID) を指定すると、IfSpec が nil 型 UUID に登録されます。
MgrEpv
マネージャー ルーチンのエントリ ポイント ベクター (EPV)。 MIDL で生成された既定の EPV を使用するには、 null 値を指定します。 詳細については、「 RPC_MGR_EPV」を参照してください。
Flags
フラグ。 フラグ値の一覧については、「 インターフェイス登録フラグ」を参照してください。
MaxCalls
自動リッスン インターフェイスでサーバーが受け入れられる同時リモート プロシージャ コール要求の最大数。 MaxCalls パラメーターは、自動リッスン インターフェイスでのみ適用でき、自動リッスンではないインターフェイスでは無視されます。 RPC ランタイム ライブラリは、 MaxCalls で指定された呼び出しの数よりも多くの同時呼び出し要求がサーバーで許可されないように最善を尽くします。 実際の数は大きくすることができ、プロトコル シーケンスごとに異なる場合があります。
他のインターフェイスでの呼び出しは、RpcServerListen 関数呼び出しで指定されたプロセス全体の MaxCalls パラメーターの値によって制御されます。
同時呼び出しの数が問題にならない場合は、RPC_C_LISTEN_MAX_CALLS_DEFAULTを使用して既定値を指定することで、サーバー側のパフォーマンスを若干向上させることができます。 これにより、RPC ランタイム環境で不要な制限が適用されなくなります。
MaxRpcSize
受信データ ブロックの最大サイズ (バイト単位)。 このパラメーターは、悪意のあるサービス拒否攻撃を防ぐために使用できます。 リモート プロシージャ コールのデータ ブロックが MaxRpcSize より大きい場合、RPC ランタイム ライブラリは呼び出しを拒否し、RPC_S_ACCESS_DENIED エラーをクライアントに送信します。 このパラメーターに値 (unsigned int) –1 を指定すると、受信データ ブロックのサイズの制限が解除されます。 このパラメーターは、 ncalrpc プロトコルで行われた呼び出しには影響しません。
IfCallbackFn
セキュリティ コールバック関数。コールバックがない場合は NULL 。 登録されている各インターフェイスには、異なるコールバック関数を使用できます。 「解説」を参照してください。
戻り値
成功時にRPC_S_OKを返します。
注釈
RpcServerRegisterIf2 関数のパラメーターと効果は、RpcServerRegisterIf 関数のパラメーターと効果を拡張します。 違いは、 自動リッスン インターフェイスを登録し、セキュリティ コールバック関数を指定できることです。
サーバー アプリケーション コードは RpcServerRegisterIf2 を呼び出してインターフェイスを登録します。 インターフェイスを登録するために、サーバーは次の情報を提供します。
- インターフェイスの仕様
インターフェイス仕様は、MIDL コンパイラによって生成されるデータ構造です。
- マネージャーの種類 UUID とマネージャー EPV
マネージャーの種類は UUID で、マネージャー EPV は、サーバーがクライアントからリモート プロシージャ コール要求を受信したときに実行されるマネージャー ルーチンを決定します。 サーバーによって提供されるインターフェイスの実装ごとに、個別のマネージャー EPV を登録する必要があります。
nil 以外のマネージャー型 UUID を指定する場合、サーバーは RpcObjectSetType を呼び出して、この nil 以外の型のオブジェクトを登録する必要があることに注意してください。
セキュリティ コールバック関数を指定すると、サーバー アプリケーションは、個々のクライアントベースでインターフェイスへのアクセスを制限できます。 つまり、既定ではセキュリティは省略可能です。サーバーが RpcServerRegisterAuthInfo 関数を呼び出した場合でも、サーバーランタイムはセキュリティで保護されていない呼び出しをディスパッチします。 サーバーが認証されたクライアントのみを受け入れる場合、インターフェイス コールバック関数は 、RpcBindingInqAuthClient、 RpcGetAuthorizationContextForClient、または RpcServerInqCallAttributes 関数を呼び出してセキュリティ レベルを取得するか、 RpcImpersonateClient 関数を使用してクライアントの偽装を試みる必要があります。 また、インターフェイス フラグで RPC_IF_ALLOW_SECURE_ONLY フラグを指定して、認証されていない呼び出しを拒否することもできます。
サーバー アプリケーションがインターフェイスのセキュリティ コールバック関数を指定すると、RPC ランタイムは、そのインターフェイスに対する認証情報のない呼び出しを自動的に拒否します。 さらに、ランタイムは、各クライアントが使用したインターフェイスを記録します。 クライアントが、現在の通信セッション中に使用されていないインターフェイスに RPC を作成すると、RPC ランタイム ライブラリはインターフェイスのセキュリティ コールバック関数を呼び出します。 RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH フラグを指定すると、認証されていないクライアントが自動的に拒否されなくなります。 いわゆる NULL セキュリティ セッションでの呼び出しは、匿名クライアントから来た場合でも、認証情報を持つことができます。 したがって、匿名クライアントが接続できないようにするには、コールバックだけでは十分ではありません。 セキュリティ コールバック関数をチェックするか、RPC_IF_ALLOW_SECURE_ONLY フラグを使用する必要があります。 RPC_IF_ALLOW_SECURE_ONLYは、Windows XP 以降のバージョンの Windows でのみ null セッション呼び出しを拒否します。
コールバック関数のシグネチャについては、「 RPC_IF_CALLBACK_FN」を参照してください。
クライアントがこのインターフェイスでメソッドを呼び出す許可がある場合、コールバック関数はRPC_S_OKを返す必要があります。 その他のリターン コードを使用すると、クライアントは例外RPC_S_ACCESS_DENIEDを受け取ります。
場合によっては、RPC ランタイムは、インターフェイスごとにクライアントごとにセキュリティ コールバック関数を複数回呼び出す場合があります。 コールバック関数でこの可能性を処理できることを確認してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | rpcdce.h (Rpc.h を含む) |
Library | Rpcrt4.lib |
[DLL] | Rpcrt4.dll |