Проверьте, является ли вызов COM-метода локальным или удаленным - PullRequest
2 голосов
/ 02 марта 2012

У меня есть COM-сервер, написанный на C ++, работающий на каком-то компьютере в сети. Клиенты могут выполнять удаленные вызовы с других компьютеров. Как проверить внутри метода COM-сервера, является ли данный вызов локальным (с того же компьютера) или удаленным?

1 Ответ

2 голосов
/ 04 марта 2012

Если вы не используете службу аутентификации на основе сертификатов, я предлагаю вам взглянуть на QueryBlanket

IServerSecurity::QueryBlanket([out] DWORD *pAuthnSvc..., [out] void** pPrivs, ...)

В зависимости от фактической службы аутентификации, pPrivs может представлять собойуказатель на объект типа SEC_WINNT_AUTH_IDENTITY.Эта структура содержит доменное имя клиента.Таким образом, вы можете легко проверить, соответствует ли он серверному.

Чтобы получить экземпляр объекта защиты сервера, можно использовать следующий код:

HRESULT hr;
CComQIPtr<IServerSecurity> ss;
if(FAILED(hr = ::CoGetCallContext(__uuidof(IServerSecurity), reinterpret_cast<void**>(&ss))))
    throw com_exception(hr, "Unable to retrieve the server security object");
...