DCOM对象 - CoCreateInstanceEx成功,但Activator.CreateInstance失败

时间:2014-08-18 07:52:26

标签: c# c++ .net com dcom

原生C ++代码:

int main()
{
   auto hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); 

   COSERVERINFO server = {0, L"Win7x64", nullptr, 0};

   MULTI_QI qi = {&IID_XXXService, nullptr, 0};

   hr = CoCreateInstanceEx(CLSID_XXXService, nullptr, CLSCTX_REMOTE_SERVER, &server, 1, &qi);
}

成功,任何线程模型。是否有CoInitializeSecurity的电话。 但是当尝试从.NET / C#实例化同一个对象时,它总是以0x80070005失败:

static void Main(string[] args)
{
    var machineName = "Win7x64";
    try
    {
        Type dcomType = Type.GetTypeFromCLSID(typeof(XXXService).GUID, machineName, false);
        object dcomObj = Activator.CreateInstance(dcomType);               
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

我用CoInitializeSecurity(DllImported)尝试后者,使用MTA和STA线程属性,使用UAC升级进程,但它总是失败。如果machineName用于当前机器,则它可以工作(是的,当前开发机器具有相同的COM接口,并且类已注册)。

编辑:为了成功拨打CoInitializeSecurity,设置'启用Visual Studio托管流程'必须禁用。然而,CreateInstance失败了。

使用本机代码,它始终有效。使用托管代码,它永远不会工作。可以做些什么?

EDIT2:远程计算机上的COM安全性:

  • 访问权限(限制):每个人,以及ANONYMOUS LOGON(以及其他常见内容) - 完全访问权限。
  • 访问权限(默认):SELF,SYSTEM,ANONYMOUS LOGON - 完全访问所有人。
  • 启动&激活(限制):每个人,DCOM用户,ANONYMOUS LOGON(以及其他常见的) - 完全访问权限。
  • 启动&激活权限(默认):SYSTEM,NETWORK,ANONYMOUS LOGON,INTERACTIVE - 完全访问所有人。

0 个答案:

没有答案