【问题标题】:Run a COM Service as System将 COM 服务作为系统运行
【发布时间】:2017-02-09 07:14:42
【问题描述】:

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

我有一个 .exe,通过调用 CoRegisterClassObject 来托管我的类对象。当我以管理员身份运行 .exe 时,相同的管理员帐户可以与之交互。当我以系统身份运行 .exe 时,管理员帐户在调用 CoCreateInstance 时失败,错误为 0x80040154。

更新:

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

【问题讨论】:

    标签: winapi com dcom


    【解决方案1】:

    我能够通过在 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。

    【讨论】:

      猜你喜欢
      • 2021-03-10
      • 2011-01-29
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      相关资源
      最近更新 更多