以系统身份运行COM服务
问题描述:
如何以系统身份运行COM服务并允许任何安全上下文的客户端连接到它?以系统身份运行COM服务
我有一个通过调用CoRegisterClassObject
托管我的类对象的.exe。当我以管理员身份运行.exe时,同一个管理员帐户可以与它进行交互。当我将.exe作为System运行时,管理员帐户在调用CoCreateInstance
时出现错误0x80040154
失败。
更新:
我已经取得了一些进展。在COM服务中,我使用ROTFLAGS_ALLOWANYCLIENT
标志在运行对象表中注册我的类工厂。在客户端中,我使用运行对象表的GetObject
方法来获取指向类工厂的指针。这使我可以在从非管理员帐户以管理员身份运行时访问该服务。但是,当它作为系统运行时,非系统客户端的CoCreateInstance
调用失败,并显示0x80070005
。我怀疑这个问题与描述的here有关。
答
我能得到它做的工作在COM服务如下:
-
以这样的方式调用CoInitializeSecurity让大家连接:
hresult = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, 0, NULL);
-
注册的指定ROTFLAGS_ALLOWANYCLIENT:
hresult = pIRunningObjectTable->Register( ROTFLAGS_ALLOWANYCLIENT |ROTFLAGS_REGISTRATIONKEEPSALIVE, pClassFactory, pIMoniker, &dwROTRegister);
而且这样做在COM客户端中的以下内容:
-
从运行对象表访问类工厂:
hresult = pIRunningObjectTable->GetObjectW(pIMoniker, &pIUnknown); hresult = pIUnknown->QueryInterface(IID_IClassFactory, (PVOID *)&pIClassFactory);
我不得不配置一些注册表设置,以获得它正常工作。设置HKCR\AppID\<guid>\LocalService
阻止它从工作,所以我做而不是有它定义。我将HKCR\AppID\<guid>\RunAs
设置为NT Authority\System
。