2024年3月14日发(作者:)

用户名不同的计算机之间的调用dcom

DCOM是依赖于RPC服务的,是一种分布式远程过程(进程)调用,调用代

码在远程主机上执行,使用远程主机的系统资源,因此要有远程主机所属的访问

权限,一般来说访问用户应是远程主机本地用户或主机所属的域用户,所以

第一步是在远程主机或其域上注册(获得)一个有足够权限的用户,

第二步是使用此用户令牌激活远程COM服务器,方法是使用

CoInitializeSecurity & CoCreateInstanceEx函数(见文后例子),成功激活后

就得到相关请求接口的代理,此时代理并没有对远程服务器访问的权限,

第三步是为接口代理设置访问权限,方法是使用CoSetProxyBlanket函数,

此后就可以使用代理指针进行方法调用了。见文后例子

以上是客户端要做的处理,至于服务器端,只要使用CoInitializeSecurity

函数设置一下访问许可权限就可以了(有时客户端也要进行这一处理,比如使用

了连接点),对于即存的服务器程序使用dcomcfg工具在注册表里设置也可以。

CoSetProxyBlanket函数调用例子:

*******************************

原例子:

IRecordServerLink* pRSL=(IRecordServerLink*)mq[0].pItf;

hr = CoSetProxyBlanket( pRSL, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL,

RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, &caid,

EOAC_NONE);

pRSL->Methods();

----------------------------------

修改后的例子:

hr = CoSetProxyBlanket( pAccount, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,

NULL,

RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, &caid,

EOAC_NONE);

pAccount->Deposit(x);

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

※※※※※※

CoInitializeSecurity & CoCreateInstanceEx函数调用例子:

*********************************************************

例子1:

HRESULT hr;

hr = CoInitialize(NULL);

ASSERT(SUCCEEDED(hr));

MULTI_QI qi;

= &IID_ICRemoteTime;

= NULL;

= NULL;

COAUTHIDENTITY authidentity;

= L"administrator"; ////你机子的帐号

ngth = wcslen();

= NULL;

Length = 0;

rd = L""; ////密码

rdLength = wcslen();

= SEC_WINNT_AUTH_IDENTITY_UNICODE;

COAUTHINFO authinfo = {-1, 0, 0, RPC_C_AUTHN_LEVEL_DEFAULT,

RPC_C_IMP_LEVEL_IMPERSONATE, &authidentity, 0};

COSERVERINFO servInf;

rved1 = NULL;

rved2 = NULL;

// nfo = NULL;

nfo = &authinfo;

USES_CONVERSION;

me = L"127.0.0.1";

hr = CoInitializeSecurity(NULL, -1, NULL, NULL,

RPC_C_AUTHN_LEVEL_NONE,

EOAC_ACCESS_CONTROL, NULL);

ASSERT(SUCCEEDED(hr));

hr = CoCreateInstanceEx(CLSID_CRemoteTime, NULL, CLSCTX_REMOTE_SERVER,

&servInf, 1, &qi);

if (FAILED(hr))

{

TRACE(_T("CoCreateInstanceEx failed"));

return false;;

}

RPC_C_IMP_LEVEL_IDENTIFY, NULL,