我用ATL写了一个DCOM程序,在本机上测试的时候COM组件能够正常启动,但是远程执行的时候却总是不成功。我查看了HRESULT值,结果显示“拒绝访问”。
    我的客户端调用时的权限函数设置如下:
        //初始化安全设置
     hr = CoInitializeSecurity(
        NULL,                             //Points to security descriptor 
        -1,                               //Count of entries in asAuthSvc 
        NULL,                             //Array of names to register 
        NULL,                             //Reserved for future use 
        RPC_C_AUTHN_LEVEL_DEFAULT,        //The default authentication level for proxies 
        RPC_C_IMP_LEVEL_IDENTIFY,         //The default impersonation level for proxies 
        NULL,                             //Reserved; must be set to NULL 
        0,                                //Additional client or server-side capabilities 
        NULL                              //Reserved for future use 
); 在MMC中,我也修改了DCOM的默认访问权限,默认的身份验证级别设置为"无", 默认的模拟级别设置为"匿名",同时增加了“INTERACTIVE”,“NETWORK”和“EVERYONE”的远程访问权限,结果还是不能运行,不知道哪位高手能够帮忙解决一下?测试的服务器端和客户端的操作系统都是XP SP2 Home Edition,不能使用组策略,不知道是否Home Edition对DCOM的访问有特别的限制?谢谢!

解决方案 »

  1.   

    首先多谢你的关注。我刚刚接触DCOM不久,权限配置的事情弄得我很头疼。我是在ATL下实现的,现在的问题是在远程创建DCOM实例的时候总返回E_ACCESSDENIED错误,在本地创建的时候又不会出错。
                      hr=CoCreateInstanceEx(CLSID_TaskSchedule, NULL,
                CLSCTX_SERVER,
                &ServerInfo,1,&MultiQi);不知道怎么解决这个问题?
      

  2.   

    IClassFactory *pIF=NULL;
    IYourServer *pYourI=NULL;COSERVERINFO info;
    memset(&info,0,sizeof(COSERVERINFO));
    info.pwszName = _T("127.0.0.1"); //远程机器ip//建类厂
    hr = CoGetClassObject(CLSID_YourServer,CLSCTX_REMOTE_SERVER,&info,IID_IClassFactory,reinterpret_cast<void **>(&pIF));//建实例
    HRESULT hr = pIF->CreateInstance(NULL,IID_IYourServer,reinterpret_cast<void **>(&pYourI));看看返回值,记得对方的防火墙要关。
      

  3.   

    按照您指导的方式试过了,仍然返回0x80070005的HRESULT值(E_ACCESSDENIED错误),真的不知道为什么。难道还是权限控制的问题?防火墙是肯定关掉了的。
      

  4.   

    肯定是权限问题,而且权限配置没有什么规律,具体配置我也忘了。
    MS在.net框架下用remoing改进取代了万恶的dcom.