如何配置SYSTEM运行的非服务类进程外COM服务器 解决CO_E_WRONG_SERVER_IDENTITY报错
进程外COM服务器SYSTEM身份部署解决方案
该问题本质是Session 0隔离机制、COM激活身份匹配规则、类对象注册标识三者共同作用的结果:SYSTEM身份的进程默认运行在Session 0,
Interactive User配置在无用户登录时无对应会话身份,Launching User默认会为每个激活请求创建独立实例,不符合单实例共享需求。
1. 调整COM注册配置
- 注册表路径定位到:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{你的COM类对应的CLSID}(32位程序额外配置HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{你的COM类对应的CLSID}) - 明确设置
RunAs值为NT AUTHORITY\SYSTEM,类型为字符串(REG_SZ) - 删除该路径下所有
LocalService相关的子项/值(非服务类COM服务器不需要服务关联配置) - 为该CLSID关联对应AppID,在同路径下新增字符串值
AppID,值为自定义的GUID(如果已有可复用) - 定位到
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{上面配置的AppID},新增两个二进制值:AccessPermission:配置为允许SYSTEM身份本地访问权限LaunchPermission:配置为允许SYSTEM身份本地启动、本地激活权限
权限配置可以先用系统自带的OleView.exe(64位/32位对应程序版本)图形化配置后导出注册表项,用于自动化部署
2. 调整COM服务器代码注册逻辑
修改引用的COM注册类中CoRegisterClassObject的调用参数,将注册标识改为REGCLS_MULTIPLEUSE:
- 该标识允许同一身份的所有客户端共享同一个已注册的类对象实例,避免COM SCM为每个客户端请求创建新的服务器进程
- 确保服务器启动后优先完成类对象注册,再执行其他业务逻辑
3. 规范COM服务器启动方式
- 必须将COM服务器以SYSTEM身份在Session 0中启动,禁止在普通用户会话中启动
- 测试阶段可以用
psexec -s -i 0 你的COM服务器.exe命令验证启动身份与会话 - 生产环境可以通过任务计划程序配置:触发器设为系统启动,运行账户设为
SYSTEM,勾选「不管用户是否登录都要运行」、「使用最高权限运行」,即可在系统启动时自动在Session 0启动SYSTEM身份的服务器进程 - 确保服务器进程在客户端调用前提前启动,不要依赖COM SCM的自动激活机制启动
4. 验证方案
完成配置后按以下步骤验证:
- 手动启动Session 0下的SYSTEM身份COM服务器
- 用
psexec -s 你的客户端测试程序.exe模拟SYSTEM身份的服务客户端调用 - 检查任务管理器详细信息页,确认仅存在一个COM服务器进程,且客户端调用正常返回结果
内容的提问来源于stack exchange,提问作者cogumel0
相关产品推荐
相关产品推荐

