客户正在运行我们的某个程序,通常作为服务运行,作为应用程序运行。客户在CoRegisterClassObject()
上收到以下错误:
该类配置为作为与调用者不同的安全ID运行。
看起来某种类型的会话0错误,但为什么CoRegisterClassObject()
会关心会话0? COM应该允许服务(会话0)和应用程序(会话> 0),而不关心什么,不应该注册什么?
此外,根据Microsoft文档网页,我不喜欢它不在CoRegisterClassObject()
可返回的错误列表中。
答案 0 :(得分:0)
有问题的错误代码是CO_E_WRONG_SERVER_IDENTITY
(0x80004015)。
根据此页面:
COM security frequently asked questions
Q6 为什么CoRegisterClassObject会返回CO_E_WRONG_SERVER_IDENTITY?当我将ATL 1.1服务器服务作为.exe文件启动时,我从CoRegisterClassObject接收CO_E_WRONG_SERVER_IDENTITY。 (该类配置为作为与调用者不同的安全ID运行。)无论是否跳过CoInitializeSecurity,这似乎都会发生。它无法作为服务或.exe文件运行。
一个。通过在交互式用户标识中将它们作为控制台应用程序运行来调试许多服务。由于服务已注册为以不同的标识运行(可由服务控制面板小程序配置),因此OLE通过返回CO_E_WRONG_SERVER_IDENTITY来强制执行安全性并防止恶意服务器欺骗服务器,从而使CoRegisterClassObject和RunningObjectTable :: Register(ROTFLAGS_ALLOWANYCLIENT)调用失败。要通过运行交互式用户的身份进行调试,请在服务器的注册表项中进行以下更改以防止这些失败:
•要防止CoRegisterClassObject失败,请删除以下命名值:
[HKEY_CLASSES_ROOT\APPID\{0bf52b15-8cab-11cf-8572-00aa00c006cf}] "LocalService"="HelloOleServerService"
•要防止IRunningObjectTable :: Register(ROTFLAGS_ALLOWANYCLIENT)失败,请按照下列步骤操作:
删除以下命名值:
[HKEY_CLASSES_ROOT\APPID\{0bf52b15-8cab-11cf-8572-00aa00c006cf}] "LocalService"="HelloOleServerService"
- 醇>
然后添加以下命名值:
[HKEY_CLASSES_ROOT\APPID\{0bf52b15-8cab-11cf-8572-00aa00c006cf}] "RunAs"="Interactive User"
调试后,您可以恢复已修改的注册表项。
我假设您必须将{0bf52b15-8cab-11cf-8572-00aa00c006cf}
替换为COM对象的实际CLSID。