以系统身份运行COM服务

问题描述:

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

我有一个通过调用CoRegisterClassObject托管我的类对象的.exe。当我以管理员身份运行.exe时,同一个管理员帐户可以与它进行交互。当我将.exe作为System运行时,管理员帐户在调用CoCreateInstance时出现错误0x80040154失败。

更新:

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

我能得到它做的工作在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); 
    

而且这样做在COM客户端中的以下内容:

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

    hresult = pIRunningObjectTable->GetObjectW(pIMoniker, &pIUnknown); 
    hresult = pIUnknown->QueryInterface(IID_IClassFactory, (PVOID *)&pIClassFactory); 
    

我不得不配置一些注册表设置,以获得它正常工作。设置HKCR\AppID\<guid>\LocalService阻止它从工作,所以我做而不是有它定义。我将HKCR\AppID\<guid>\RunAs设置为NT Authority\System