Utgard - 访问被拒绝

时间:2013-08-06 09:55:14

标签: java opc

我一直无法找到解决问题的解决方案,因此我正在开设一个新主题。

Utgard(http://openscada.org/projects/utgard)对我来说似乎是一个非常有用的工具。在这个阶段,我只想通过Eclipse在Windows 8操作系统上本地访问TOP OPC服务器。但是,在尝试运行他们的教程时,我最终得到了“访问被拒绝”。我不认为我在用户名,密码等方面犯了任何错误。

Exele OPC DA测试客户端不会返回任何错误。我可以连接,检索和重写值。

请注意,我是OPC和OpenSCADA的新手。任何帮助将不胜感激。

package org.openscada.opc.tutorial;
import java.util.concurrent.Executors;
import org.jinterop.dcom.common.JIException;
import org.openscada.opc.lib.common.ConnectionInformation;
import org.openscada.opc.lib.da.AccessBase;
import org.openscada.opc.lib.da.DataCallback;
import org.openscada.opc.lib.da.Item;
import org.openscada.opc.lib.da.ItemState;
import org.openscada.opc.lib.da.Server;
import org.openscada.opc.lib.da.SyncAccess;

 public class UtgardTutorial1 {


public static void main(String[] args) throws Exception {
    // create connection information
    final ConnectionInformation ci = new ConnectionInformation();
    //final ConnectionInformation connectionInformation = new ConnectionInformation();
    ci.setHost("127.0.0.1");
    //ci.setDomain("");
    ci.setUser("Me");
    ci.setPassword("Password");
    ci.setProgId("SWToolbox.TOPServer.V5");
    //ci.setClsid("680DFBF7-C92D-484D-84BE-06DC3DECCD68"); // if ProgId is not working, try it using the Clsid instead
    // create an id for the tag you want to retrieve
    final String itemId = "_System._Time_Second";
    // create a new server
    final Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());
    //final Server serverServer = new Server(connectionInformation, Executor.newSingleThreadSchedulesExecutor);

    try {
        // connect to server
        server.connect();
        // add sync access, poll every 500 ms
        final AccessBase access = new SyncAccess(server, 500);
        access.addItem(itemId, new DataCallback() {
            @Override
            public void changed(Item item, ItemState state) {
                System.out.println(state);
            }
        });
        // start reading
        access.bind();
        // wait a little bit
        Thread.sleep(10 * 1000);
        // stop reading
        access.unbind();
    } catch (final JIException e) {
        System.out.println(String.format("%08X: %s", e.getErrorCode(), server.getErrorMessage(e.getErrorCode())));
    }
}

}

错误堆栈跟踪:

INFO  org.openscada.opc.lib.da.Server - Failed to connect to server
org.jinterop.dcom.common.JIException: Access is denied, please check whether the [domain-username-password] are correct. Also, if not already done please check the GETTING STARTED and FAQ sections in readme.htm. They provide information on how to correctly configure the Windows machine for DCOM access, so as to avoid such exceptions.  [0x00000005]
    at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenKey(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
    at org.jinterop.dcom.core.JIProgId.getIdFromWinReg(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
    at org.jinterop.dcom.core.JIProgId.getCorrespondingCLSID(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
    at org.jinterop.dcom.core.JIComServer.<init>(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
    at org.openscada.opc.lib.da.Server.connect(Server.java:123) ~[org.openscada.opc.lib_1.0.0.201303051455.jar:na]
    at org.openscada.opc.tutorial.UtgardTutorial1.main(UtgardTutorial1.java:32) [bin/:na]
Caused by: org.jinterop.dcom.common.JIRuntimeException: Access is denied, please check whether the [domain-username-password] are correct. Also, if not already done please check the GETTING STARTED and FAQ sections in readme.htm. They provide information on how to correctly configure the Windows machine for DCOM access, so as to avoid such exceptions.  [0x00000005]
    at org.jinterop.winreg.IJIWinReg$openKey.read(Unknown Source) ~[org.openscada.jinterop.core_2.0.8.201303051454.jar:na]
    at ndr.NdrObject.decode(Unknown Source) ~[org.openscada.jinterop.deps_1.0.0.201303051454.jar:na]
    at rpc.ConnectionOrientedEndpoint.call(Unknown Source) ~[org.openscada.jinterop.deps_1.0.0.201303051454.jar:na]
    at rpc.Stub.call(Unknown Source) ~[org.openscada.jinterop.deps_1.0.0.201303051454.jar:na]

2 个答案:

答案 0 :(得分:4)

您无法访问本地Windows注册表,因此客户端无法将服务器的ProgID转换为CLSID。确保在那里运行具有足够权限的应用程序,即您是管理员用户。

或者,您可以使用服务器的CLSID配置连接,因此您不需要注册表。

OPC客户端实际上应该使用服务器计算机上运行的OpcEnum服务来执行ProgID到CLSID的转换。也许服务不可用或Utgard只尝试注册表(我自己不知道Utgard)。如果您没有在客户端计算机上安装服务器,则基于注册表的ProgID到CLSID转换仍将失败,因为该信息在本地Windows注册表中不可用。最糟糕的情况是Utgard将尝试打开远程Windows注册表,这很少成功(或者你需要确保它是单独启用的)。

请注意,由于我不知道Utgard,我只是猜测它正在尝试哪种策略。然而,使用CLSID只会绕过整个转换部分,这是你的问题。

E:考虑到你的其他客户端可以毫无问题地连接,我怀疑Utgard根本不会尝试使用OpcEnum。

答案 1 :(得分:1)

我得到了同样的错误,并解决了问题 将以下补丁应用于注册表:

  • HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \政策\系统
  • 创建或修改32位DWORD:LocalAccountTokenFilterPolicy
  • 将值设置为:1
相关问题