Поделиться через


структура 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

Указатель на UUID , который необходимо связать с MgrEpv. Null или nil UUID регистрирует IfSpec с nil UUID.

MgrEpv

Указатель на структуру RPC_MGR_EPV , которая содержит вектор точки входа (EPV) подпрограмм руководителя. Если задано значение NULL, используется созданный ПО MIDL EPV по умолчанию.

Flags

Флаги. Список значений флагов см. в разделе Флаги регистрации интерфейса. Интерфейсы группы интерфейсов всегда обрабатываются как автоматически прослушиваемые.

MaxCalls

Максимальное количество одновременных запросов на вызовы удаленной процедуры, которые сервер может принять в этом интерфейсе. Библиотека времени выполнения RPC делает все возможное, чтобы сервер не разрешал больше одновременных вызовов, чем количество вызовов, указанное в MaxCalls. Однако фактическое число может быть больше MaxCalls и может отличаться для каждой последовательности протокола.

Вызовы в других интерфейсах управляются значением параметра MaxCalls для всего процесса, указанного в RpcServerListen.

Если количество одновременных вызовов не является проблемой, можно немного повысить производительность на стороне сервера, указав значение по умолчанию с помощью RPC_C_LISTEN_MAX_CALLS_DEFAULT. Это освобождает среду выполнения RPC от применения ненужных ограничений.

MaxRpcSize

Максимальный размер в байтах входящих блоков данных. MaxRpcSize можно использовать для предотвращения вредоносных атак типа "отказ в обслуживании". Если блок данных удаленного вызова процедуры больше MaxRpcSize, библиотека времени выполнения RPC отклоняет вызов и отправляет клиенту ошибку RPC_S_ACCESS_DENIED . Указание значения (unsigned int) –1 в MaxRpcSize удаляет ограничение на размер входящих блоков данных. Этот параметр не влияет на вызовы, выполненные по протоколу ncalrpc .

IfCallback

Указатель на RPC_INTERFACE_GROUP_IDLE_CALLBACK_FN функцию обратного вызова безопасности или значение NULL для отсутствия обратного вызова. Каждый зарегистрированный интерфейс может иметь другую функцию обратного вызова.

UuidVector

Указатель на вектор пользовательских идентификаторов объектов, предлагаемых сервером для регистрации в средстве сопоставления конечных точек RPC. Серверное приложение создает этот вектор. Значение NULL означает, что не существует UID объектов для регистрации.

Annotation

Указатель на символьный комментарий, применяемый к каждому элементу перекрестного продукта, добавленному в локальную базу данных схемы конечных точек. Строка может содержать до 64 символов, включая завершающий символ NULL. Укажите значение NULL или строку, завершаемую null ("\0"), если строки заметок нет.

Строка заметки используется приложениями только для получения сведений. RPC не использует эту строку для определения экземпляра сервера, с которым взаимодействует клиент, или для перечисления элементов в базе данных схемы конечных точек.

SecurityDescriptor

Необязательный дескриптор безопасности, описывающий, какие клиенты имеют право на доступ к интерфейсу.

Комментарии

Чтобы зарегистрировать интерфейс, сервер предоставляет следующие сведения:

  • Спецификация интерфейса Спецификация интерфейса — это структура данных, которую создает компилятор MIDL.
  • Тип диспетчера UUID и EPV диспетчера. Тип диспетчера UUID и EPV диспетчера определяют, какая подпрограмма диспетчера выполняется, когда сервер получает запрос на удаленный вызов процедуры от клиента. Для каждой реализации интерфейса, предлагаемого сервером, необходимо зарегистрировать отдельный EPV диспетчера. Обратите внимание, что при указании типа UUID, отличного от nil, сервер также должен вызвать RpcObjectSetType для регистрации объектов этого типа, отличного от nil.

Все интерфейсы группы интерфейсов обрабатываются как автоматически прослушиваемые. Среда выполнения начинает прослушивать вызовы сразу после активации группы интерфейсов. Вызовы RpcServerListen и RpcMgmtStopServerListening не влияют на интерфейс, а также на вызов RpcServerUnregisterIf с параметром IfSpec , имеющим значение NULL.

Указание функции обратного вызова безопасности в 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 отклоняет вызовы сеанса null только в Windows XP и более поздних версиях Windows.

Сигнатуру функции обратного вызова см. в разделе 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