检查COM方法调用是本地调用还是远程调用

Check whether COM-method call is local or remote

本文关键字:调用 程调用 COM 方法 检查      更新时间:2023-10-16

我有一个用C++编写的COM服务器,运行在网络中的某台计算机上。客户端可以从其他计算机对其执行远程调用。如果给定的调用是本地的(来自同一台计算机)还是远程的,我如何在COM服务器的方法内部进行检查?

如果您不使用基于证书的身份验证服务,我建议您查看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");