描述:
不好意思,问大家一个关于跨域调用DCOM的问题,情况是这个样子的
我在服务器A(域[domain_A]) 存在用户test,口令test ,A上有 DCOM组件aCOM(Exe) 使用dcomcnfg
配置了他的启动,调用权限.
在另一台计算机上(属于另一个域,于domain_A不信任)使用CoCreateInstanceEx调用
这个dcom,但是不成功,希望高手指点一下.
具体的aCom
class id 为 CLSID_Test
存在一个接口 ITest ,id为 IID_ITest
有一个方法 Add( LONG a, LONG b, LONG* pVal)就是测试用的
返回两个数据的和.
客户端的代码为
CoInitialize(0);
int hr =0;
COAUTHIDENTITY us;
us.User = L"test";
us.UserLength = wcslen(us.User);
us.Password = L"test";
us.PasswordLength = wcslen(us.Password);
us.Domain = L"domain_A";
us.DomainLength = wcslen(us.Domain);
us.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
COAUTHINFO auth;
auth.dwAuthnSvc = RPC_C_AUTHN_WINNT ;
auth.dwAuthzSvc = RPC_C_AUTHZ_NONE ;
auth.pwszServerPrincName = NULL;
auth.dwAuthnLevel = RPC_C_AUTHN_LEVEL_CONNECT;
auth.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
auth.dwCapabilities = EOAC_NONE;
auth.pAuthIdentityData = &us;
// 远程计算机的信息
COSERVERINFO rs;
rs.dwReserved1 = 0;
rs.dwReserved2 = 0;
rs.pwszName = L"10.10.10.10"; //服务器的ip地址
rs.pAuthInfo = &auth;
// 测试组件的接口名
ITest *pTest;
MULTI_QI qi;
qi.hr = 0;
qi.pItf = 0;
qi.pIID = &IID_ITest; //接口
hr = CoCreateInstanceEx(CLSID_Test,
NULL,CLSCTX_REMOTE_SERVER ,&rs,1,&qi);
// 在这里执行正确了,没有发生错误
if(!SUCCEEDED(hr))
{
printf("Error CoCreateInstanceEx[0x%08x] \r\n",hr );
return (0);
}
pTest = (ITest *)(qi.pItf);
LONG a = 10;
LONG b = 20;
LONG v = 0;
// 计算 v = a+b
hr = pTest->Add(10,20,&v);
// 但是在调用Add方法的时候发生错误,说没有权限.拒绝访问
if(!SUCCEEDED(hr))
{
printf("Error Add[0x%08x] \r\n",hr );
pTest->Release();
return (0);
}
printf(("V = %d\r\n"),v);
pTest->Release();
CoUninitialize();
// 代码结束.
我的客户程序是这个样子的,
1.当CoCreateInstanceEx没有发生错误,当时调用Add方法的时候发生错误了
2.我把查询的接口改为IID_IUnknown既
MULTI_QI qi;
qi.hr = 0;
qi.pItf = 0;
qi.pIID = &IID_IUnknow; //unknown接口
CoCreateInstanceEx正确,但是在
hr = qi.pItf->QueryInterface(IID_ITest,(void **)&pTest);
的时候发生错误,也是说没有权限.拒绝访问
解决方案1:
你将另一台机器脱离出那个域试试!
解决方案2:DCOM的安全机制建立在windows的安全机制上 你的调用联windows的安全机制都没通过怎么调用组件那?
解决方案3: 一顿搞之后,服务程序能起了,不过还是死在CoCreateInstanceEx上
客户端getlasterror是1008
服务端查看事件,描述是不能在限定时间内组测服务器
我更惨
我在CoCreateInstanceEx的时候就挂了
在服务端的服务程序根本就没有启动
楼主知道怎么回事吗