运行 作为系统的 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 服务中执行以下操作来让它工作:
以这样的方式调用CoInitializeSecurity,让所有人都能连接:
hresult = CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_NONE,
RPC_C_IMP_LEVEL_IDENTIFY,
NULL,
0,
NULL);
在 运行 对象 table 中注册 class 工厂,指定 ROTFLAGS_ALLOWANYCLIENT:
hresult = pIRunningObjectTable->Register(
ROTFLAGS_ALLOWANYCLIENT |ROTFLAGS_REGISTRATIONKEEPSALIVE,
pClassFactory,
pIMoniker,
&dwROTRegister);
并在 COM 客户端中执行以下操作:
从 运行 对象访问 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
。
如何 运行 将 COM 服务作为系统并允许来自任何安全上下文的任何客户端连接到它?
我有一个 .exe 通过调用 CoRegisterClassObject
托管我的 class 对象。当我 运行 作为管理员的 .exe 时,同一个管理员帐户可以很好地与之交互。当我 运行 .exe 作为系统时,管理员帐户在调用 CoCreateInstance
时失败并出现错误 0x80040154
。
更新:
我取得了一些进步。在 COM 服务中,我使用 ROTFLAGS_ALLOWANYCLIENT
标志在 运行ning 对象 table 中注册我的 class 工厂。在客户端中,我使用 运行ning 对象 table 的 GetObject
方法来获取指向 class 工厂的指针。这允许我在 运行 以管理员身份从非管理员帐户访问该服务。但是,当它 运行 作为系统时,非系统客户端的 CoCreateInstance
调用失败 0x80070005
。我怀疑此问题与 here.
我可以通过在 COM 服务中执行以下操作来让它工作:
以这样的方式调用CoInitializeSecurity,让所有人都能连接:
hresult = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, 0, NULL);
在 运行 对象 table 中注册 class 工厂,指定 ROTFLAGS_ALLOWANYCLIENT:
hresult = pIRunningObjectTable->Register( ROTFLAGS_ALLOWANYCLIENT |ROTFLAGS_REGISTRATIONKEEPSALIVE, pClassFactory, pIMoniker, &dwROTRegister);
并在 COM 客户端中执行以下操作:
从 运行 对象访问 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
。