다음을 통해 공유


RPC_INTERFACE_TEMPLATE 구조체(rpcdce.h)

RPC_INTERFACE_TEMPLATE 구조는 RPC 인터페이스 그룹 서버 인터페이스를 정의합니다.

구문

typedef struct {
  unsigned long      Version;
  RPC_IF_HANDLE      IfSpec;
  UUID               *MgrTypeUuid;
  RPC_MGR_EPV        *MgrEpv;
  unsigned int       Flags;
  unsigned int       MaxCalls;
  unsigned int       MaxRpcSize;
  RPC_IF_CALLBACK_FN *IfCallback;
  UUID_VECTOR        *UuidVector;
  RPC_CSTR           Annotation;
  void               *SecurityDescriptor;
} RPC_INTERFACE_TEMPLATE, *PRPC_INTERFACE_TEMPLATE;

멤버

Version

이 필드는 예약되어 있으며 0으로 설정해야 합니다.

IfSpec

등록할 인터페이스를 정의하는 MIDL 생성 구조체입니다.

MgrTypeUuid

MgrEpv와 연결할 UUID에 대한 포인터입니다. NULL 또는 nil UUIDIfSpec 을 nil UUID로 등록합니다.

MgrEpv

관리자 루틴의 EPV(진입점 벡터)가 포함된 RPC_MGR_EPV 구조체에 대한 포인터입니다. NULL인 경우 MIDL에서 생성된 기본 EPV가 사용됩니다.

Flags

플래그. 플래그 값 목록은 인터페이스 등록 플래그를 참조하세요. 인터페이스 그룹 인터페이스는 항상 자동 수신 대기로 처리됩니다.

MaxCalls

서버가 이 인터페이스에서 수락할 수 있는 동시 원격 프로시저 호출 요청의 최대 수입니다. RPC 런타임 라이브러리는 서버가 MaxCalls에 지정된 호출 수보다 더 많은 동시 호출 요청을 허용하지 않도록 최선을 다합니다. 그러나 실제 숫자는 MaxCalls 보다 클 수 있으며 각 프로토콜 순서에 따라 다를 수 있습니다.

다른 인터페이스에 대한 호출은 RpcServerListen에 지정된 프로세스 수준 MaxCalls 매개 변수의 값에 의해 제어됩니다.

동시 호출 수가 문제가 되지 않는 경우 RPC_C_LISTEN_MAX_CALLS_DEFAULT 사용하여 기본값을 지정하여 서버 쪽 성능을 약간 향상할 수 있습니다. 이렇게 하면 RPC 런타임 환경이 불필요한 제한을 적용하지 않습니다.

MaxRpcSize

들어오는 데이터 블록의 최대 크기(바이트)입니다. MaxRpcSize 는 악의적인 서비스 거부 공격을 방지하는 데 사용할 수 있습니다. 원격 프로시저 호출의 데이터 블록이 MaxRpcSize보다 큰 경우 RPC 런타임 라이브러리는 호출을 거부하고 클라이언트에 RPC_S_ACCESS_DENIED 오류를 보냅니다. MaxRpcSize에서 (unsigned int) –1 값을 지정하면 들어오는 데이터 블록의 크기에 대한 제한이 제거됩니다. 이 매개 변수는 ncalrpc 프로토콜을 통한 호출에는 영향을 주지 않습니다.

IfCallback

RPC_INTERFACE_GROUP_IDLE_CALLBACK_FN 보안 콜백 함수에 대한 포인터이거나 콜백이 없는 경우 NULL입니다. 등록된 각 인터페이스에는 다른 콜백 함수가 있을 수 있습니다.

UuidVector

RPC 엔드포인트 매퍼에 등록할 서버에서 제공하는 개체 UUID 의 벡터에 대한 포인터입니다. 서버 애플리케이션은 이 벡터를 생성합니다. NULL 은 등록할 개체 UUID가 없음을 나타냅니다.

Annotation

로컬 엔드포인트 맵 데이터베이스에 추가된 각 교차 제품 요소에 적용되는 문자 문자열 주석에 대한 포인터입니다. 문자열의 길이는 null 종결 문자를 포함하여 최대 64자까지 가능합니다. 주석 문자열이 없는 경우 null 값 또는 null로 끝나는 문자열("\0")을 지정합니다.

주석 문자열은 정보 전용으로 애플리케이션에서 사용됩니다. RPC는 이 문자열을 사용하여 클라이언트가 통신하는 서버 instance 결정하거나 엔드포인트 맵 데이터베이스의 요소를 열거하지 않습니다.

SecurityDescriptor

인터페이스에 액세스할 수 있는 권한이 있는 클라이언트를 설명하는 선택적 보안 설명자입니다.

설명

인터페이스를 등록하기 위해 서버는 다음 정보를 제공합니다.

  • 인터페이스 사양 인터페이스 사양은 MIDL 컴파일러에서 생성하는 데이터 구조입니다.
  • 관리자 유형 UUID 및 관리자 EPV 관리자 유형 UUID 및 관리자 EPV는 서버가 클라이언트에서 원격 프로시저 호출 요청을 받을 때 실행되는 관리자 루틴을 결정합니다. 서버에서 제공하는 인터페이스의 각 구현에 대해 별도의 관리자 EPV를 등록해야 합니다. Nil이 아닌 관리자 유형 UUID를 지정할 때 서버는 RpcObjectSetType 을 호출하여 이 nil이 아닌 형식의 개체를 등록해야 합니다.

모든 인터페이스 그룹 인터페이스는 자동 수신 대기로 처리됩니다. 런타임은 인터페이스 그룹이 활성화되는 즉시 호출을 수신 대기하기 시작합니다. RpcServerListenRpcMgmtStopServerListening에 대한 호출은 인터페이스에 영향을 주지 않으며 IfSpecNULL로 설정된 RpcServerUnregisterIf에 대한 호출도 영향을 주지 않습니다.

IfCallback에서 보안 콜백 함수를 지정하면 서버 애플리케이션이 개별 클라이언트 기준으로 해당 인터페이스에 대한 액세스를 제한할 수 있습니다. 즉, 기본적으로 보안은 선택 사항입니다. 서버 런타임은 서버가 RpcServerRegisterAuthInfo를 호출한 경우에도 보안되지 않은 호출을 디스패치합니다. 서버가 인증된 클라이언트만 허용하려는 경우 인터페이스 콜백 함수는 RpcBindingInqAuthClient, RpcGetAuthorizationContextForClient 또는 RpcServerInqCallAttributes 를 호출하여 보안 수준을 검색하거나 RpcImpersonateClient로 클라이언트를 가장하려고 시도해야 합니다. 또한 플래그에서 RPC_IF_ALLOW_SECURE_ONLY 플래그를 지정하여 인증되지 않은 호출을 거부할 수도 있습니다.

서버 애플리케이션이 IfCallback에서 해당 인터페이스에 대한 보안 콜백 함수를 지정하는 경우 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 참조하세요.

클라이언트가 이 인터페이스에서 메서드를 호출할 수 있는 경우 IfCallback 의 콜백 함수는 RPC_S_OK 반환해야 합니다. 다른 반환 코드는 클라이언트가 예외 RPC_S_ACCESS_DENIED 받도록 합니다.

경우에 따라 RPC 런타임은 인터페이스당 클라이언트당 두 번 이상 보안 콜백 함수를 호출할 수 있습니다. 콜백 함수는 이 가능성을 처리할 수 있어야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 8 [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2012 [데스크톱 앱만 해당]
머리글 rpcdce.h(Rpc.h 포함)

추가 정보

RPC_INTERFACE_GROUP_IDLE_CALLBACK_FN

RpcServerInqBindings

RpcServerInterfaceGroupActivate

RpcServerInterfaceGroupClose

RpcServerInterfaceGroupCreate

RpcServerInterfaceGroupDeactivate