ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WinCC OPC服务器DCOM配置实战:解决跨机访问与权限拒绝问题

WinCC OPC服务器DCOM配置实战:解决跨机访问与权限拒绝问题 简介此文档面向自动化工程师与系统集成人员重点解决 WinCC OPC 服务器与客户端在跨账户、非管理员环境下无法正常通信的问题。内容讲解 OPC 基于 DCOM 的数据交换原理并针对 Windows 2000/XP 平台给出完整的 DCOM 安全与启动权限配置步骤涵盖 OPCServer.WinCC、OPCHDAServers.WinCC、OPCServerAE.WinCC 三类服务器的选择方法可帮助使用者规避常见的连接失败与权限报错。资源为 1 个 doc 文档压缩包约 29KB内容紧凑、步骤明确适合作为现场配置时的操作参照。目前已有 2600 余人学习实用性和参考价值已得到较多用户验证。1. WinCC OPC 服务器配置默认 DCOM 设置为什么会在现场失效做 WinCC 与第三方系统对接时很多人的第一反应是“OPC 嘛装上就能连”。实际跑一趟现场就知道WinCC OPC 服务器装完默认能连的只有本机管理员账号一旦 OPC 客户端在另一台电脑上、或者登录用户不是管理员DCOM 的权限模型就会把你的连接请求拦在门外。这份文档解决的就是这个最典型的场景把 Windows 2000/XP 下的 DCOM 权限改到可以跨机、跨账号访问让 OPCServer.WinCC 真正对外开放。内容不深但每一步都是现场配置时绕不开的操作。适合刚接触 WinCC 与 OPC 对接的自动化工程师也适合被“0x80070005 拒绝访问”折腾过又没找到头绪的人照着文档里的路径和用户列表操作一遍比自己翻注册表试错省出半天时间。2. OPC 与 DCOM 的权限模型先搞清“谁在访问谁”2.1 OPC 数据交换为什么绕不开 DCOMWinCC 的 OPC 服务器OPCServer.WinCC是 COM 组件COM 组件跨进程、跨机器调用时走的通道就是 DCOM。也就是说OPC 客户端读取 WinCC 变量、读写归档数据本质上是发起了一次 DCOM 调用。既然是进程间通信Windows 就会校验三样东西调用者是谁身份、调用者有没有权限启动这个组件启动权限、调用者能不能访问这个组件的数据访问权限。WinCC 安装完以后默认的 DCOM 配置只保证本机管理员能用。因为安装过程会把 WinCC OPC 服务器的权限绑定到安装时那个账号和本机管理员组换了机器、换了账号Windows 的 DCOM 安全描述符里没有这个用户调用直接失败。这就是为什么文档里把“用户有没有管理员权限”和“是否用不同账号登录”列为必须改配置的两个前提条件。2.2 两种必须改配置的判定条件文档给出的两条判定条件很精简实际现场对应的是两类高频场景第一种OPC 客户端计算机上的登录用户不是普通管理员。很多工厂的操作站是分权限的操作员账号只有普通用户权限WinCC 服务器也常常用独立服务账号运行。此时客户端启动 OPCServer.WinCC 时DCOM 认为“启动者没权限”返回拒绝访问。第二种客户端和服务器使用不同账号登录。比如服务器用 WINCC-SRV 账号运行客户端操作员用的是 OPERATOR 账号两边账号不互通DCOM 在服务器端找不到能验证的凭据就会匿名访问失败。改配置的本质就是把“允许访问”和“允许启动”的名单里加上这些实际会用到的用户。改 DCOM 之前还得确认一个前提客户端和服务器两边都要建立对方的用户账号。文档里说得直接——“先决条件在 OPC 客户机计算机的用户管理器中创建 WinCC OPC 服务器用于运行的用户账号反过来在服务器上建客户机的账号。”这一步漏掉后面权限加得再全也连不上因为 DCOM 在验证身份时要求账户在两台机器上都存在且密码一致。提示这里说的账号是传统 Windows 账号体系里的本地账号。如果现场已经上了域环境域账号天然满足“两边都有”的条件但权限仍然要按下面的步骤手动加。3. 手把手改 DCOM 配置dcomcnfg 全流程与逐项参数说明3.1 打开 DCOM 配置工具并定位 OPC 服务器组件在“开始”菜单的“运行”中输入dcomcnfg.exe回车后打开“分布式 COM 组件属性”对话框。这是 Windows 2000/XP 自带的组件服务管理工具不需要额外安装。打开后切到“应用程序”选项卡列表里找OPCServer.WinCC这就是 WinCC 的 OPC DA 服务器组件。这里有一个容易走错的地方列表里 OPC 相关条目不止一个。文档里给出了对照关系组件条目对应的 WinCC OPC 服务器类型OPCServer.WinCCOPC DA实时数据访问OPCHDAServers.WinCCOPC HDA历史数据访问OPCServerAE.WinCCOPC AE报警与事件如果你的客户端要读实时变量就选第一个要读 WinCC 归档的历史数据选 HDA要收报警消息选 AE。选错条目会导致后面所有权限配置都落在错误的组件上客户端拿到的错误信息却是五花八门的连接失败。找到对应条目后右键选择“属性”进入该组件的属性对话框后续的安全权限设置都在这里面完成。3.2 配置自定义访问权限把实际用户加进名单进入 OPCServer.WinCC 属性对话框后切到“安全”选项卡。默认选中的是“使用默认访问权限”这个默认值只认本机管理员所以要改成“使用自定义访问权限”然后点“编辑”。在弹出的“注册表数值权限”对话框里通过“添加”按钮把下面这几类用户逐个加进来用户/组作用管理员Administrators保留给本机管理员日常维护和排错用交互式Interactive当前在服务器本机登录操作的会话所有人Everyone最关键的一项放开匿名和受限访问边界网络Network允许来自网络的其他计算机访问系统System系统服务需要访问时使用加完以后把权限列里的“允许访问”勾上确认关闭。这里“所有人”和“网络”是能不能跨机连接的关键。只加管理员和交互式的话本机测试可能能过换到客户端机器上立刻翻车原因就是这两个组没加进去。3.3 配置自定义启动权限让客户端能把组件拉起来访问权限解决的是“能不能读数据”启动权限解决的是“能不能把这个 COM 组件拉起来”两个权限是分开校验的任何一个缺失都连不上。同样在“安全”选项卡下往下找到“使用自定义启动权限”点“编辑”在弹出的对话框里添加“所有人”和“网络”两个用户/组并勾选“允许启动”。这里和访问权限的区别在于启动权限不需要把管理员、交互式、系统全部加进去文档里明确只加“所有人”和“网络”。原因是启动动作本身是临时的进程拉起来之后就成了 WinCC 服务器主进程的子进程后续的数据访问由访问权限控制启动权限给得过宽反而容易留下安全隐患。配置时按文档来就好不要自作主张把启动权限也全部放开这在生产环境中意味着任何匿名用户都可能尝试拉起 OPC 服务器进程。注意Windows XP 系统的 DCOM 配置界面和 Windows 2000 略有差异但选项卡名称和操作顺序是一致的。XP 上多了一道防火墙拦截配置完 DCOM 后需要检查 Windows 防火墙是否放行 TCP 135 端口和动态 RPC 端口这个在下一章的避坑部分展开。3.4 DCOM 配置完成后的检查清单配置完所有对话框后建议按下面的清单过一遍避免漏项服务器计算机上确认 OPCServer.WinCC 的访问权限里包含“所有人”和“网络”。服务器计算机上确认 OPCServer.WinCC 的启动权限里包含“所有人”和“网络”。客户端计算机上确认存在与服务器相同的用户账号密码一致。服务器计算机上确认存在客户端使用的用户账号密码一致。两台机器的系统时间偏差不要超过 5 分钟Kerberos 校验对时间敏感。第 5 条文档里没写但现场踩过坑的人都知道DCOM 调用过程中 Windows 会校验收据两台机器时间差太多客户端会报“服务器运行失败”而不是“拒绝访问”误导性很强。建议配置完 DCOM 后顺手把两台机器的时钟同步打开。4. 避坑OPC 客户端连不上 WinCC 的六个常见问题4.1 客户端提示“拒绝访问”错误码 0x80070005现象OPC 客户端连接 OPCServer.WinCC 时直接报拒绝访问错误码通常是 0x80070005。原因这是最经典的 DCOM 权限缺失客户端当前登录用户不在服务器组件的访问权限或启动权限名单里。解决回到服务器上重新打开 dcomcnfg确认 OPCServer.WinCC 的自定义访问权限中加了“网络”和“所有人”自定义启动权限中也加了这两项然后把“允许访问”和“允许启动”勾选上。改完后必须把 dcomcnfg 对话框全部点“确定”关闭再重试注册表权限信息是在对话框关闭时统一写入的只点一个“确定”就关窗口的话配置可能没生效。4.2 组件列表里找不到 OPCServer.WinCC现象dcomcnfg 的“应用程序”列表里翻遍了也找不到 OPCServer.WinCC只有其他无关组件。原因WinCC 安装时 OPC 相关组件没装全或者安装顺序有问题导致 COM 注册表信息丢失。这个在 Ghost 恢复系统后的 WinCC 环境中特别常见。解决先确认 WinCC 安装时勾选了 OPC 服务器组件如果没装用 WinCC 安装盘补装如果装过还是找不到检查C:\Windows\System32\下 OPC 相关 DLL 是否存在。补注册的办法是找到 WinCC 安装目录下的 OPC 注册脚本重新执行常见位置在...\WinCC\OPC\下具体文件名随版本略有不同但通常以 .bat 或 .reg 结尾。找不到注册脚本的话只能重装 OPC 组件没有更快的后悔药。4.3 本机能连远程连不上现象在 WinCC 服务器本机用 OPC 客户端测试正常换到另一台电脑上就连接超时或拒绝。原因本机访问走的是本地回环绕过了网络层面的 DCOM 校验和防火墙远程访问时 Windows 防火墙默认拦截了 135 端口和动态 RPC 端口。另外访问权限中的“网络”组如果漏加也会导致只放行本地请求。解决先确认访问权限里有“网络”组然后检查服务器防火墙。Windows XP 上在防火墙设置中勾选“文件和打印机共享”异常或者添加 TCP 135 端口的入站规则动态 RPC 端口范围则需要根据系统版本在防火墙里放开。最省事的排查办法是先临时关掉防火墙测试能连上再单独细化放行规则连不上就说明问题不在防火墙还在权限配置上。4.4 用客户端账号连接时报“服务器运行失败”现象错误信息不是拒绝访问而是“服务器运行失败”或“CLSID 无法从服务器获取”。原因DCOM 在客户端尝试启动服务器进程时服务器端无法用客户端提供的身份登录。最常见的原因是两台机器的账号建立了但密码不一致或者新创建的账号在服务器上没有“作为服务登录”的权限导致进程无法以该身份拉起来。解决核对两台机器上相同用户名的密码是否一致打开服务器的“管理工具 → 本地安全策略 → 用户权利指派”确认该用户拥有“作为服务登录”权限。WinCC 服务器严格要求用固定的服务账号运行 OPC 服务客户端账号如果在服务器上存在同名但不同密码的账号DCOM 凭据校验直接失败。碰到这种情况建议把服务器 OPC 相关服务的手动登录账号也改成统一的固定账号。4.5 WinCC 服务器重启后 OPC 连接全部失败现象昨天还能连的 OPC 客户端今天 WinCC 服务器重启之后就全部连不上了dcomcnfg 里的配置看着没被动过。原因WinCC 的 OPC 服务器组件是随 WinCC 运行状态动态注册的服务器重启后 WinCC 还没完全启动OPC 组件没有在 DCOM 中完成激活此时客户端发起连接会失败。另一个原因是服务器重启后网卡 IP 地址变化导致 DCOM 广播找不到目标。解决确认 WinCC 的启动状态OPC 服务器进程要等 WinCC 项目管理器完全启动后才可用。等 WinCC 完全就绪后在服务器本机运行一遍 dcomcnfg确认 OPCServer.WinCC 条目还存在于列表里如果条目消失说明 COM 注册信息在重启过程中被清理了需要重新执行 OPC 组件的注册脚本。固定服务器的 IP 地址并写在 hosts 文件中可以避免动态 IP 带来的 DCOM 定位失败问题。4.6 Windows XP 上配置成功后重启又失效现象XP 系统上按文档步骤配好当时测试能通重启后客户端又连不上重新打开 dcomcnfg 一看权限配置变了。原因Windows XP 的 DCOM 安全描述符默认会在系统更新或安全策略刷新时被重置尤其是安装了更新包后 IE 增强安全配置或者系统安全模板会强制覆盖一部分 COM 权限设置。解决配置完成后用组策略编辑器确认没有应用与 DCOM 默认权限相关的安全模板如果系统开了自动更新建议配置完成后再做一次 dcomcnfg 复核确认权限没被改回去。生产环境建议把配置步骤固化成一份操作记录重启后按清单重新校验一遍花不了几分钟但能省下误以为“配置有效期很短”的疑虑。5. 配置完怎么验证从 OPC 客户端测试到 C# 快速连接5.1 用 OPC 客户端工具确认基础连通性配置完 DCOM 后别急着写应用先用现成的 OPC 客户端工具做一次连通性验证。西门子随 WinCC 分发的 OPC Scout或 OPC Scout V2/V3就是干这个的模拟一个 OPC 客户端去连接 OPCServer.WinCC能连上就说明 DCOM 配置这一步没有遗留问题。用 OPC Scout 测试的步骤不复杂新建一个 Group添加 ItemItem 路径就是 WinCC 变量管理器中已经创建的变量名格式形如ChannelName\DeviceName\TagName。添加成功后把 Quality 和 Value 列打开能看到实时更新就说明数据链路是通的。这一步尤其要模拟真实使用环境来测——把 OPC Scout 放到客户端那台机器上去运行而不要放在服务器上这样才能验证跨机 DCOM 配置是否真的生效。5.2 用 C# 快速测试 OPC DA 连接如果手上没有 OPC Scout用 C# 也能快速写一个验证程序测试 OPC DA 连接是否通畅。常见做法是通过 Interop 调用 OPC 自动化接口代码量不大适合在客户端机器上临时验证。using OPC; using OPC.Common; // 连接到本机/远程 OPC 服务器 // serverNode 填写 WinCC 服务器的计算机名或 IP string serverNode 192.168.1.10; string progId OPCServer.WinCC; // 通过 Type.GetTypeFromProgID 获取 COM 组件类型 Type opcServerType Type.GetTypeFromProgID(progId, serverNode); if (opcServerType null) { Console.WriteLine(无法在 {0} 上找到 {1}, serverNode, progId); return; } // 创建 OPC 服务器实例 OPCServer opcServer (OPCServer)Activator.CreateInstance(opcServerType); opcServer.Connect(progId, serverNode); Console.WriteLine(连接成功当前状态: {0}, opcServer.ServerState);这段代码里的serverNode是 OPC 服务器的计算机名或 IPprogId固定为OPCServer.WinCC。Type.GetTypeFromProgID方法会在指定节点上查询 COM 组件注册信息如果这一步返回 null说明 DCOM 定位本身有问题密码一致性、网络可达性、防火墙都值得复查。能创建实例但 Connect 抛异常重点看权限配置。实际跑的时候建议先把异常信息输出完整0x80070005 和 0x800706ba服务器不可用指向的问题完全不同。提示C# 使用 OPC 自动化接口需要引用Opc.dll和OpcCommon.dll这两个文件在安装了 WinCC 或 OPC Core Components 的机器上都能找到。生产项目不建议长期用这种方式连接 OPC DA自动化接口做快速验证很方便但性能和稳定性不如 OPC 客户端的 DA 2.0 自定义接口。5.3 数据链路通了之后的最后一道检查如果 OPC Scout 和 C# 测试都能连上但客户端读到变量的 Quality 是 Bad 或不稳定这时候问题多半不在 DCOM而在更上层的数据源。会看到两种典型的 Quality 异常连接成功但值不刷新检查 WinCC 变量是否已经激活、该项目是否处于运行状态读历史数据时 Quality 显示 bad检查 WinCC 的归档配置有没有对 OPC HDA 开放。从那以后我每次做完 WinCC OPC 服务器配置都会强制自己走一遍完整验证流程先看 dcomcnfg 里的两个权限列表是否包含“网络”再填好两台机器的时间同步最后把 OPC Scout 放到客户端机器上做跨机连接测试。C# 验证程序我只在客户端现场跑一次不留在正式项目里避免引入不必要的依赖。这套流程看着繁琐但每次都能在离开现场前把问题暴露出来而不是等客户第二天打电话来说连不上。希望帮到你也祝你的 OPC 对接项目一次打通。本文还有配套的精品资源点击获取
返回列表