运行 作为系统的 COM 服务

Run a COM Service as System

如何 运行 将 COM 服务作为系统并允许来自任何安全上下文的任何客户端连接到它?

我有一个 .exe 通过调用 CoRegisterClassObject 托管我的 class 对象。当我 运行 作为管理员的 .exe 时,同一个管理员帐户可以很好地与之交互。当我 运行 .exe 作为系统时,管理员帐户在调用 CoCreateInstance 时失败并出现错误 0x80040154

更新:

我取得了一些进步。在 COM 服务中,我使用 ROTFLAGS_ALLOWANYCLIENT 标志在 运行ning 对象 table 中注册我的 class 工厂。在客户端中,我使用 运行ning 对象 table 的 GetObject 方法来获取指向 class 工厂的指针。这允许我在 运行 以管理员身份从非管理员帐户访问该服务。但是,当它 运行 作为系统时,非系统客户端的 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. 在 运行 对象 table 中注册 class 工厂,指定 ROTFLAGS_ALLOWANYCLIENT:

    hresult = pIRunningObjectTable->Register(
        ROTFLAGS_ALLOWANYCLIENT |ROTFLAGS_REGISTRATIONKEEPSALIVE,
        pClassFactory,
        pIMoniker,
        &dwROTRegister);
    

并在 COM 客户端中执行以下操作:

  1. 从 运行 对象访问 class 工厂 table:

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

我必须配置一些注册表设置才能使其正常工作。设置 HKCR\AppID\<guid>\LocalService 阻止了 它的工作,所以我 没有 定义它。我将 HKCR\AppID\<guid>\RunAs 设置为 NT Authority\System