以系统

时间:2016-09-30 16:30:07

标签: winapi com dcom

如何以系统方式运行COM服务并允许任何安全上下文中的任何客户端连接到它?

我有一个.exe,通过调用CoRegisterClassObject来托管我的类对象。当我以管理员身份运行.exe时,相同的管理员帐户可以很好地与它进行交互。当我将.exe作为系统运行时,管理员帐户在调用错误CoCreateInstance的{​​{1}}时失败。

更新:

我取得了一些进展。在COM服务中,我使用0x80040154标志在运行对象表中注册我的类工厂。在客户端中,我使用运行对象表的ROTFLAGS_ALLOWANYCLIENT方法来获取指向类工厂的指针。这允许我从非管理员帐户以管理员身份运行时访问该服务。但是,当它作为系统运行时,非系统客户端的GetObject调用将失败并显示CoCreateInstance。我怀疑这个问题与描述here

的问题有关

1 个答案:

答案 0 :(得分:2)

我可以通过在COM服务中执行以下操作来使其工作:

  1. 以允许每个人连接的方式调用CoInitializeSecurity:

    hresult = CoInitializeSecurity(
    NULL,
    -1,
    NULL,
    NULL,
    RPC_C_AUTHN_LEVEL_NONE,
    RPC_C_IMP_LEVEL_IDENTIFY,
    NULL,
    0,
    NULL);
    
  2. 在运行对象表中注册类工厂,指定ROTFLAGS_ALLOWANYCLIENT:

    hresult = pIRunningObjectTable->Register(
        ROTFLAGS_ALLOWANYCLIENT |ROTFLAGS_REGISTRATIONKEEPSALIVE,
        pClassFactory,
        pIMoniker,
        &dwROTRegister);
    
  3. 在COM客户端中执行以下操作:

    1. 从正在运行的对象表访问类工厂:

      hresult = pIRunningObjectTable->GetObjectW(pIMoniker, &pIUnknown);
      hresult = pIUnknown->QueryInterface(IID_IClassFactory, (PVOID *)&pIClassFactory);
      
    2. 我必须配置一些注册表设置才能使其正常工作。设置HKCR\AppID\<guid>\LocalService 阻止工作,所以我定义它。我将HKCR\AppID\<guid>\RunAs设置为NT Authority\System