CoRegisterClassObject返回错误(会话0?)

CoRegisterClassObject returns error (session 0?)

本文关键字:会话 返回 错误 CoRegisterClassObject      更新时间:2023-10-16

客户正在运行我们的一个程序,通常作为服务或应用程序运行。客户在CoRegisterClassObject()上得到以下错误:

类被配置为作为与调用者不同的安全id运行。

它看起来像是某种类型的会话0错误,但是为什么CoRegisterClassObject()要关心会话0?COM应该允许服务(会话0)和应用程序(会话> 0),而不是关心什么注册什么,不是吗?

另外,我不喜欢这样的事实,即它不在CoRegisterClassObject()可返回的错误列表中,根据微软文档网页。

错误码为CO_E_WRONG_SERVER_IDENTITY (0x80004015)。

本页:

COM安全常见问题解答

Q6为什么CoRegisterClassObject返回CO_E_WRONG_SERVER_IDENTITY?当启动我的ATL 1.1服务器服务作为。exe文件时,我从CoRegisterClassObject接收coe_wrong_server_identity。(类被配置为作为与调用者不同的安全ID运行。)无论我是否跳过CoInitializeSecurity,都会出现这种情况。它无法作为服务或.exe文件运行。

。许多服务都是通过在交互式用户身份中将它们作为控制台应用程序运行来调试的。由于服务已经注册为以不同的身份运行(由Services控制面板小程序配置),OLE通过返回CO_E_WRONG_SERVER_IDENTITY使CoRegisterClassObject和RunningObjectTable::Register(ROTFLAGS_ALLOWANYCLIENT)调用失败,以加强安全性并防止恶意服务器欺骗服务器。要通过以交互用户的身份运行进行调试,请在服务器的注册表项中进行以下更改,以防止这些故障:

•为了防止CoRegisterClassObject失败,请删除以下命名值:

[HKEY_CLASSES_ROOTAPPID{0bf52b15-8cab-11cf-8572-00aa00c006cf}]
"LocalService"="HelloOleServerService"  

•要防止irunninggobjecttable::Register(ROTFLAGS_ALLOWANYCLIENT)失败,请遵循以下步骤:

  1. 删除以下指定值:

    [HKEY_CLASSES_ROOTAPPID{0bf52b15-8cab-11cf-8572-00aa00c006cf}]
    "LocalService"="HelloOleServerService" 
    
  2. 然后添加以下命名值:

    [HKEY_CLASSES_ROOTAPPID{0bf52b15-8cab-11cf-8572-00aa00c006cf}]
    "RunAs"="Interactive User"  
    

调试后必须恢复修改后的注册表项。

我假设你必须用你的COM对象的实际CLSID代替{0bf52b15-8cab-11cf-8572-00aa00c006cf}