简介:这份文档资料面向西门子WinCC组态工程师与工控现场调试人员,聚焦WinCC OPC服务器在非管理员账户、跨账户登录等场景下的DCOM配置难题,帮助读者打通WinCC与OPC客户端之间的数据交换链路。资源包内共1个doc文件,约29KB,内容围绕OPC操作基础、DCOM设置变更条件、Windows 2000/XP下的完整配置步骤展开,并区分了OPCServer.WinCC、OPCHDAServers.WinCC与OPCServerAE.WinCC等不同服务器条目的处理方式。文中还给出创建用户账户、运行dcomcnfg.exe、设置自定义访问与启动权限等关键操作,并提示相关设置未考虑安全性需求,建议由网络管理员执行。目前已有2618人学习下载,适合需要快速排查OPC连接失败、权限不足或跨账户通信异常问题的技术人员参考,也可作为工控网络DCOM配置的实操备忘。
1. 一份 2007 年的 DCOM 配置笔记,为什么现在还有人翻出来用
如果你手头有一份标着「WinCC-OPC服务器配置详细方法」的文档,打开一看全是dcomcnfg.exe、OPCServer.WinCC、注册表权限这些词,别急着关掉。这类文档在工控圈里属于典型的「老但不过时」——WinCC 的 OPC 服务器底层走的是 DCOM,而 DCOM 这套东西从 Windows 2000 到 Windows 10/11 的兼容层里一直没被砍掉。换句话说,你在一台新装的 WinCC 机器上配 OPC 通信,大概率还是会撞上同一批权限对话框。
这份文档解决的核心问题很具体:当 OPC 客户端和服务器不在同一台机器、或者两边登录账户不一致、又或者客户端账户没有管理员权限时,默认的 DCOM 设置会直接拒绝连接。它给出的方案是手动改「分布式 COM 组件服务」里的应用程序权限,把OPCServer.WinCC的访问和启动权限放开。适合谁看?做产线数据采集、SCADA 对接、把 WinCC 数据往 MES 或第三方组态软件里送的工程师。如果你只是本机测试,默认配置通常够用;一旦跨机器,这份笔记就是你的起点。
2. 先把 DCOM 通信链路拆开:谁在拦你,拦在哪一层
2.1 OPC 客户端到 WinCC 服务器的完整调用链
很多人配不通 OPC,是因为把 DCOM 当成一个「开关」——以为打开就行。实际上从客户端发起请求到 WinCC 返回数据,中间至少经过四层:客户端进程调用 OPC 接口 → DCOM 运行时解析远程对象 → 服务器端 DCOM 服务启动OPCServer.WinCC→ WinCC 内部把变量数据回传。任何一层权限不对,表现都是「连接失败」或「拒绝访问」,但原因完全不同。
常见做法是先用OPC Scout或类似客户端工具在本机连一次OPCServer.WinCC,确认服务器本身能起来。本机通了再换远程 IP,这样能把「服务器没注册」和「DCOM 权限不够」两个问题分开。我一般会先看 Windows 事件查看器里的 DCOM 日志,事件 ID 10016 或 10009 基本能定位到是启动权限还是访问权限被拒。
2.2 为什么默认设置只对「同机同账户」友好
WinCC 安装时,安装程序会把OPCServer.WinCC的 DCOM 权限配成一组保守值:只有本机管理员组和交互式用户能访问。这个设计逻辑是「最小权限」,本机调试没问题,因为你的登录账户通常就在管理员组里。但跨机器时,客户端机器上的账户对服务器来说是一个「网络用户」,默认不在允许列表里,DCOM 直接拒绝。
文档里提到的两种情况——客户端用户没有管理员权限、服务器用不同账户登录——本质上都是「身份映射」问题。DCOM 不认「你在客户端是谁」,它只认「你以什么身份到达服务器」。所以要么在两边建同名同密码的账户,要么把Everyone和Network加进权限列表。前者更安全但维护麻烦,后者省事但等于把门敞开。文档选择了后者,因为它面向的是「先连通」的场景。
2.3 账户映射的两种策略:同名账户 vs 开放权限
同名账户策略的操作是:在 OPC 客户端机器上创建一个用户,比如opcuser,密码设为P@ss123;然后在 OPC 服务器机器上也创建完全相同的opcuser和密码。客户端用这个账户登录后发起 OPC 请求,服务器端 DCOM 看到的就是一个「本地已知用户」,权限检查自然通过。这种做法的好处是不用改 DCOM 默认权限,坏处是每加一台客户端就要同步账户,密码过期还得两边一起改。
开放权限策略就是文档里写的:把Everyone、Network、Interactive、System全加进访问允许列表,启动权限加Everyone和Network。这样任何能到达服务器的网络用户都能连。在隔离的产线内网里,这通常是可接受的;但如果服务器还连着办公网,就得掂量一下。我一般建议先在测试环境用开放策略跑通,再根据实际网络分区决定要不要收紧。
2.4 用 dcomcnfg 定位 OPCServer.WinCC 的实操路径
打开dcomcnfg.exe后,不同 Windows 版本界面差异很大。Windows 2000/XP 是「分布式 COM 组件服务」属性对话框,直接列应用程序;Windows 7 以上变成了「组件服务」管理单元,路径是组件服务 → 计算机 → 我的电脑 → DCOM 配置。在里面找到OPCServer.WinCC,右键属性,切到「安全」选项卡。这里有两个关键权限:访问权限和启动权限。访问权限决定「谁能调用这个对象」,启动权限决定「谁能启动这个服务器进程」。两个都要配,缺一个都会失败。
提示:如果列表里找不到
OPCServer.WinCC,说明 WinCC OPC 服务器组件没有正确注册。先确认 WinCC 安装时勾选了 OPC 组件,再用OPCServer.WinCC作为关键词在注册表HKEY_CLASSES_ROOT\AppID下搜一下。
3. 手把手改 DCOM 权限:从 dcomcnfg 到注册表权限对话框
3.1 先决条件:两边账户怎么建、建完怎么验
在动手改 DCOM 之前,先把账户这件事理清楚。假设 OPC 服务器机器叫SERVER01,客户端机器叫CLIENT01。如果你打算用同名账户策略,在CLIENT01上打开「计算机管理 → 本地用户和组」,新建用户opcuser,设一个密码,取消「用户下次登录须更改密码」。然后在SERVER01上做完全一样的操作,用户名和密码必须一字不差。
建完之后验证方法很简单:在CLIENT01上用opcuser登录,打开命令提示符,ping SERVER01确认网络通,然后net use \\SERVER01\IPC$看能不能建立 IPC 连接。如果这一步就报「登录失败」,说明账户或密码不一致,后面 DCOM 怎么配都没用。这一步花两分钟,能省掉后面半小时的瞎折腾。
3.2 访问权限:把 Everyone 和 Network 加进允许列表
打开dcomcnfg.exe,找到OPCServer.WinCC,右键属性 → 安全。在「访问权限」区域选「使用自定义访问权限」,点「编辑」。弹出的「注册表数值权限」对话框里,点「添加」,把Everyone、Network、Interactive、System以及Administrators加进去。加完后逐个选中,在下方权限列表里勾上「允许访问」。
这里有个容易翻车的点:Everyone在中文系统里可能显示为「所有人」,Network显示为「网络」,Interactive显示为「交互式」。别因为名字对不上就跳过,它们就是同一个东西。另外,如果「添加」按钮点开后在位置栏里选的是本机,那加的就是本机用户;要加网络用户,得确保位置是SERVER01本身,因为 DCOM 权限是在服务器端生效的。
# 在 OPC 服务器机器上以管理员身份运行,快速检查 OPCServer.WinCC 的 AppID 注册情况 reg query "HKEY_CLASSES_ROOT\AppID\{...}" /s | findstr /i "OPCServer.WinCC" # 说明:{...} 处替换为实际 AppID,通常可以在 dcomcnfg 属性页的「标识」选项卡里看到 # 这条命令用来确认组件是否注册到了正确的 AppID 下,注册表里没有的话 dcomcnfg 列表也不会出现上面这条命令不是必须的,但在「dcomcnfg 列表里找不到 OPCServer.WinCC」时很有用。reg query会递归搜索 AppID 节点,findstr过滤出相关条目。如果输出为空,说明组件注册表项缺失,需要重新注册 WinCC OPC 组件或修复安装。
3.3 启动权限:为什么只加 Everyone 和 Network 就够了
启动权限的配置逻辑和访问权限略有不同。访问权限管的是「已经运行的对象能不能被调用」,启动权限管的是「能不能把服务器进程拉起来」。文档里只加了Everyone和Network,没有加Interactive和System,因为启动动作通常由 DCOM 服务本身发起,System账户天然有权限,不需要显式加。
操作路径:在同一个属性对话框的「安全」选项卡下,找到「启动权限」,选「使用自定义启动权限」,点「编辑」,添加Everyone和Network,勾「允许启动」。这里如果只加了Everyone没加Network,跨机器时可能仍然失败,因为网络登录的令牌和交互式登录的令牌在 DCOM 看来是不同来源。
3.4 标识选项卡:交互式用户还是指定用户
「标识」选项卡决定OPCServer.WinCC这个进程以什么账户运行。默认通常是「交互式用户」,意思是服务器进程以当前登录到服务器桌面的那个用户身份跑。如果服务器机器没人登录,或者登录的不是你预期的账户,OPC 服务器可能起不来。
常见做法是改成「指定用户」,填入一个在服务器本机有管理员权限的账户,比如SERVER01\Administrator或专门建的opcservice账户。这样不管有没有人登录桌面,OPC 服务器都能以固定身份启动。改完之后需要重启 DCOM 服务或重启机器生效。这一步在文档原文里没展开,但实际跨机器场景下经常是最后一根稻草。
# 重启 DCOM 服务让权限和标识变更生效(在 OPC 服务器上以管理员运行) net stop DcomLaunch net start DcomLaunch # 说明:DcomLaunch 是 DCOM 服务启动器,重启它会重新读取 AppID 配置 # 如果提示依赖服务,用 sc config DcomLaunch depend= 先清依赖再启,但更稳妥的是直接重启机器net stop和net start是最轻量的生效方式。如果服务名不对,可以用sc query | findstr /i "dcom"找一下实际服务名。重启机器当然更彻底,但在产线环境里往往不方便,所以先试服务重启。
3.5 用 OPC 客户端做一次端到端验证
配完权限后,别急着上生产客户端。先在客户端机器上用OPC Scout或Matrikon OPC Explorer这类工具连一下OPC.SimaticNET或直接连OPCServer.WinCC。连接时填服务器的 IP 或主机名,然后浏览标签空间。如果能列出变量树,说明 DCOM 链路通了;如果报「0x80070005 拒绝访问」,回去检查访问权限;如果报「0x800706ba RPC 服务器不可用」,检查防火墙和 RPC 端口。
验证通过后,再换你自己的 OPC 客户端程序。这一步的意义是把「DCOM 配置问题」和「客户端程序自身问题」分开。我见过太多人把客户端代码的 bug 当成 DCOM 没配好,来回改权限,最后发现是客户端调用的 CLSID 写错了。
4. 避坑与排查:那些让你怀疑人生的连接失败
4.1 现象:本机 OPC Scout 能连,远程客户端连不上
原因:本机连接走的是本地 RPC,不经过网络身份验证;远程连接走 TCP,DCOM 会做身份映射。默认权限只允许本机交互式用户,远程网络用户被拒。
解决:按第 3 章步骤把Everyone和Network加进访问和启动权限。如果已经加了还不行,检查「标识」选项卡是不是「交互式用户」且服务器当前无人登录,改成「指定用户」再试。
4.2 现象:报「拒绝访问」但权限列表里明明有 Everyone
原因:Windows 的 UAC 或本地安全策略可能限制了匿名或网络用户的令牌。另外,如果客户端用 Microsoft 账户登录,DCOM 看到的身份可能和预期不一致。
解决:在服务器上打开secpol.msc,检查「本地策略 → 安全选项 → 网络访问:本地账户的共享和安全模型」,如果是「仅来宾」,改成「经典」。然后在客户端用本地账户而不是 Microsoft 账户登录再试。
4.3 现象:连接时好时坏,重启后正常一段时间又失败
原因:DCOM 权限变更后没有持久化,或者组策略在后台刷新时覆盖了手动设置。域环境里尤其常见,域策略优先级高于本地 DCOM 配置。
解决:如果是域环境,联系域管理员在域策略层面放行,本地改的会被覆盖。非域环境检查是否有其他管理软件在重置 DCOM 配置。另外,把「标识」设为指定用户而不是交互式用户,能减少因登录状态变化导致的波动。
4.4 现象:OPC 客户端能连但读不到变量,报「未知标签」
原因:DCOM 只负责「连得上」,变量访问权限由 WinCC 内部的用户管理控制。如果 OPC 登录账户在 WinCC 里没有对应权限,能建立连接但读不到数据。
解决:在 WinCC 的「用户管理器」里给 OPC 使用的账户分配至少「读取」权限。如果用了 WinCC 的 SIMATIC Logon 或自定义权限系统,确认 OPC 账户在对应角色里。
4.5 现象:Windows 防火墙开着就失败,关了就好
原因:DCOM 动态分配端口,默认只开放 135 端口不够。需要么开放 RPC 动态端口范围,么把OPCServer.WinCC的可执行文件加进防火墙例外。
解决:在服务器防火墙入站规则里,给OPCServer.WinCC对应的 exe(通常是 WinCC 安装目录下的某个服务程序)加一条「允许任何端口」的规则。或者用dcomcnfg在「默认属性」里把「在此计算机上启用分布式 COM」确认勾上,并在「默认协议」里确保「面向连接的 TCP/IP」在列表顶部。
5. 进阶:把 DCOM 配置脚本化,以及一个验证习惯
手动点dcomcnfg的痛点在于:每换一台机器就要重来一遍,而且界面在不同 Windows 版本上长得不一样。如果你经常要部署 WinCC OPC 服务器,可以考虑把权限配置脚本化。核心思路是用dcomcnfg的底层机制——DCOM 权限最终存在注册表HKEY_CLASSES_ROOT\AppID\{AppID}下的AccessPermission和LaunchPermission二进制值里。用reg export导出一台配好的机器上的 AppID 项,再在目标机器上reg import,能省掉大量点击。
不过注册表导入有个前提:目标机器上OPCServer.WinCC的 AppID 必须和源机器一致。WinCC 安装后这个 AppID 通常是固定的,但不同版本可能有差异。导入前先用dcomcnfg确认一下 AppID 值,或者用 PowerShell 的Get-CimInstance查 DCOM 应用信息。
# 导出已配好的 OPCServer.WinCC AppID 注册表项(在源机器上运行) $appId = (Get-ItemProperty "HKLM:\SOFTWARE\Classes\AppID\OPCServer.WinCC" -ErrorAction SilentlyContinue).PSChildName if ($appId) { reg export "HKCR\AppID\$appId" "C:\temp\opc_dcom.reg" /y Write-Host "已导出 AppID: $appId" } else { Write-Host "未找到 OPCServer.WinCC 的 AppID,检查 WinCC OPC 组件是否安装" } # 说明:HKCR 是 HKEY_CLASSES_ROOT 的简写,AppID 子键下存的就是 DCOM 权限二进制值 # 导出后在目标机器上双击 .reg 文件导入,再重启 DCOM 服务即可这段 PowerShell 先通过注册表路径找到OPCServer.WinCC对应的 AppID 子键名,然后用reg export导出。/y参数表示覆盖已有文件。导入后记得重启DcomLaunch服务或重启机器。注意:如果目标机器的 Windows 版本和源机器差异很大,注册表二进制权限格式可能不兼容,导入后要用dcomcnfg打开确认一下权限列表是否正常显示。
另一个值得养成的习惯是:每次配完 DCOM,不要只用你自己的客户端验证。找一个第三方的、和你生产环境无关的 OPC 客户端工具再连一次。这样做的好处是排除「你的客户端恰好能连」的巧合。我吃过一次亏:自己写的客户端能连,但产线上另一套组态软件死活连不上,最后发现是那套软件用的 OPC 规范版本不同,对 DCOM 的认证级别要求更严。从那以后我每次配完 WinCC OPC 服务器,都强制用至少两个不同来源的客户端各连一遍,确认不是玄学兼容。希望帮到你。
本文还有配套的精品资源,点击获取