如何以系统方式运行COM服务并允许任何安全上下文中的任何客户端连接到它?
我有一个.exe,通过调用CoRegisterClassObject
来托管我的类对象。当我以管理员身份运行.exe时,相同的管理员帐户可以很好地与它进行交互。当我将.exe作为系统运行时,管理员帐户在调用错误CoCreateInstance
的{{1}}时失败。
更新:
我取得了一些进展。在COM服务中,我使用0x80040154
标志在运行对象表中注册我的类工厂。在客户端中,我使用运行对象表的ROTFLAGS_ALLOWANYCLIENT
方法来获取指向类工厂的指针。这允许我从非管理员帐户以管理员身份运行时访问该服务。但是,当它作为系统运行时,非系统客户端的GetObject
调用将失败并显示CoCreateInstance
。我怀疑这个问题与描述here。
答案 0 :(得分:2)
我可以通过在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
。