微软补丁致基于Utgard的Java OPC DA客户端无法添加订阅组求助
微软DCOM安全补丁导致Utgard Java OPC客户端连接故障解决方案
问题背景
近期微软发布的DCOM安全加固补丁将系统默认身份验证级别提升至数据包完整性级别,导致使用Utgard Java OPC库对接OPC DA服务器的业务系统出现通信故障:Utgard底层依赖Jinterop COM库完成DCOM交互,补丁安装后客户端可正常建立基础连接,但在创建订阅组、监听OPC服务器数据变化的环节执行失败,经验证只需将Jinterop的身份验证级别配置为DEFAULT即可解决该问题。
故障场景代码示例
JISession session = JISession.createSession(ipAddress,userName,password); JIComServer comServer = new JIComServer(JIClassId.valueOf(classId), address, session); IJIComObject instance = comServer.createInstance(); IJIComObject opcServer = new OPCServer(instance); // 后续创建访问基础组并添加到服务器、绑定回调处理程序时执行失败
报错信息
抛出异常中文说明:RPC服务器不可用。请检查COM服务器是否正常运行,到COM服务器的网络是否连通(可通过ping服务器主机验证),同时确认Windows防火墙未拦截DCOM访问,错误码为0x800706BA。
异常堆栈如下:
at org.jinterop.dcom.core.JIComServer.call(JIComServer.java:1004) at org.jinterop.dcom.core.JIComServer.call(JIComServer.java:951) at org.jinterop.dcom.core.JIComObjectImpl.call(JIComObjectImpl.java:293) at org.jinterop.dcom.core.JIComObjectImpl.call(JIComObjectImpl.java:159) at org.jinterop.dcom.core.JIFrameworkHelper.attachEventHandler(JIFrameworkHelper.java:285) at org.openscada.opc.dcom.da.impl.OPCGroupStateMgt.attach(OPCGroupStateMgt.java:179)
解决思路
- 全局配置Jinterop身份验证级别:在创建
JISession实例前添加全局配置代码,指定DCOM身份验证级别为默认值即可适配补丁后的安全要求
import org.jinterop.dcom.common.JISystem; import org.jinterop.dcom.common.JIInternalSystem; // 全局设置DCOM身份验证级别 JISystem.setDefaultAuthenticationLevel(JIInternalSystem.RPC_C_AUTHN_LEVEL_DEFAULT);
- 会话级单独配置:如果全局配置不生效,可在创建
JISession后单独为当前会话设置身份验证级别
JISession session = JISession.createSession(ipAddress,userName,password); // 为当前会话单独设置身份验证级别 session.setAuthenticationLevel(JIInternalSystem.RPC_C_AUTHN_LEVEL_DEFAULT);
- 服务端兜底方案:若调整客户端配置仍无法解决问题,可登录OPC服务端所在Windows主机,打开DCOM配置面板,将默认身份验证级别调整为“连接”级别,修改后无需重启主机即可生效。
内容的提问来源于stack exchange,提问作者Murthy Manchala
相关产品推荐
相关产品推荐

