Java Can';t使用jinterop打开dcom会话

Java Can';t使用jinterop打开dcom会话,java,wmi,dcom,wmi-query,j-interop,Java,Wmi,Dcom,Wmi Query,J Interop,我试图使用jinterop在远程PC上运行wmi查询,但我甚至无法启动dcom会话。我知道wmi正在工作,因为我可以使用powershell\wmic\vbscript毫无问题地访问它。此外,我们的windows客户端已禁用文件共享 以下是我正在尝试的: import static org.jinterop.dcom.impls.JIObjectFactory.narrowObject; import static org.jinterop.dcom.impls.automation.IJIDi

我试图使用jinterop在远程PC上运行wmi查询,但我甚至无法启动dcom会话。我知道wmi正在工作,因为我可以使用powershell\wmic\vbscript毫无问题地访问它。此外,我们的windows客户端已禁用文件共享

以下是我正在尝试的:

import static org.jinterop.dcom.impls.JIObjectFactory.narrowObject;
import static org.jinterop.dcom.impls.automation.IJIDispatch.IID;

import java.net.UnknownHostException;

import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.JIComServer;
import org.jinterop.dcom.core.JISession;
import org.jinterop.dcom.impls.automation.IJIDispatch;
import static org.jinterop.dcom.core.JIProgId.valueOf;
import org.jinterop.dcom.core.JIVariant;
import org.jinterop.dcom.core.JIString;

public class SimpleServiceManager {

    public static void main(String[] args) {
        String domain = "mydom";
        String hostname = "remotepc";
        String username = "myusername";
        String password = "mypass";

        JISession dcomSession = JISession.createSession(domain, username, password);
        JIComServer comServer;
        try {
            comServer = new JIComServer(valueOf("WbemScripting.SWbemLocator"), hostname, dcomSession);

            IJIDispatch wbemLocator = (IJIDispatch) narrowObject(comServer.createInstance().queryInterface(IID));

            Object[] params = new Object[] {
                    new JIString(hostname),
                    new JIString("ROOT\\CIMV2"),
                    JIVariant.OPTIONAL_PARAM(),
                    JIVariant.OPTIONAL_PARAM(),
                    JIVariant.OPTIONAL_PARAM(),
                    JIVariant.OPTIONAL_PARAM(),
                    new Integer(0),
                    JIVariant.OPTIONAL_PARAM()
            };
            JIVariant results[] = wbemLocator.callMethodA("ConnectServer", params);
            IJIDispatch wbemServices = (IJIDispatch) narrowObject(results[0].getObjectAsComObject());  
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JIException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 }
给我这个:

Apr 10, 2013 1:14:38 PM org.jinterop.dcom.common.JISystem logSystemPropertiesAndVersion
INFO: j-Interop Version = j-Interop 2.08

Apr 10, 2013 1:14:38 PM org.jinterop.dcom.common.JISystem logSystemPropertiesAndVersion
INFO: java.runtime.name = Java(TM) SE Runtime Environment
sun.boot.library.path = C:\Program Files\Java\jre7\bin
java.vm.version = 23.7-b01
java.vm.vendor = Oracle Corporation
java.vendor.url = http://java.oracle.com/
path.separator = ;
java.vm.name = Java HotSpot(TM) Client VM
file.encoding.pkg = sun.io
user.country = US
user.script = 
sun.java.launcher = SUN_STANDARD
sun.os.patch.level = Service Pack 1
java.vm.specification.name = Java Virtual Machine Specification
user.dir = C:\Users\myusername\Google Drive\code\Workspaces\Eclipse IDE for Java Developers 422\Jinterop
java.runtime.version = 1.7.0_17-b02
java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs = C:\Program Files\Java\jre7\lib\endorsed
os.arch = x86
java.io.tmpdir = C:\Users\myusername\AppData\Local\Temp\
line.separator = 

java.vm.specification.vendor = Oracle Corporation
user.variant = 
os.name = Windows 7
sun.jnu.encoding = Cp1252
java.library.path = C:\Program Files\Java\jre7\bin;C:\Windows\Sun\Java\bin;...
java.specification.name = Java Platform API Specification
java.class.version = 51.0
sun.management.compiler = HotSpot Client Compiler
os.version = 6.1
user.home = C:\Users\myusername
user.timezone = America/New_York
java.awt.printerjob = sun.awt.windows.WPrinterJob
file.encoding = Cp1252
java.specification.version = 1.7
java.class.path = C:\Users\myusername\Google Drive\code\Workspaces\Eclipse IDE for Java Developers 422\Jinterop\bin;C:\Users\myusername\Google Drive\code\Workspaces\Eclipse IDE for Java Developers 422\Jinterop\libs\j-interop.jar;C:\Users\myusername\Google Drive\code\Workspaces\Eclipse IDE for Java Developers 422\Jinterop\libs\j-interopdeps.jar;C:\Users\myusername\Google Drive\code\Workspaces\Eclipse IDE for Java Developers 422\Jinterop\libs\jcifs-1.2.19.jar
user.name = myusername
java.vm.specification.version = 1.7
sun.java.command = SimpleServiceManager
java.home = C:\Program Files\Java\jre7
sun.arch.data.model = 32
user.language = en
java.specification.vendor = Oracle Corporation
awt.toolkit = sun.awt.windows.WToolkit
java.vm.info = mixed mode, sharing
java.version = 1.7.0_17
java.ext.dirs = C:\Program Files\Java\jre7\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.boot.class.path = C:\Program Files\Java\jre7\lib\resources.jar;C:\Program Files\Java\jre7\lib\rt.jar;C:\Program Files\Java\jre7\lib\sunrsasign.jar;C:\Program Files\Java\jre7\lib\jsse.jar;C:\Program Files\Java\jre7\lib\jce.jar;C:\Program Files\Java\jre7\lib\charsets.jar;C:\Program Files\Java\jre7\lib\jfr.jar;C:\Program Files\Java\jre7\classes
java.vendor = Oracle Corporation
file.separator = \
java.vendor.url.bug = http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.desktop = windows
sun.cpu.isalist = pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86

Apr 10, 2013 1:14:38 PM org.jinterop.dcom.core.JIComOxidRuntime$ClientPingTimerTask run
INFO: Running ClientPingTimerTask !
Apr 10, 2013 1:14:38 PM org.jinterop.dcom.core.JISession createSession
INFO: Created Session: -1745354837
Apr 10, 2013 1:14:38 PM org.jinterop.dcom.core.JIComOxidRuntime$ServerPingTimerTask run
INFO: Running ServerPingTimerTask !
Apr 10, 2013 1:14:38 PM org.jinterop.dcom.core.JISession$Release_References_TimerTask run
INFO: Release_References_TimerTask:[RUN] Session:  -1745354837 , listOfDeferencedIpids.size(): 0
Apr 10, 2013 1:14:38 PM org.jinterop.dcom.common.JISystem saveDBPathAndLoadFile
INFO: progIdVsClsidDB: {}
org.jinterop.dcom.common.JIException: Message not found for errorCode: 0xC0000034
    at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKLM(JIWinRegStub.java:115)
    at org.jinterop.dcom.core.JIProgId.getIdFromWinReg(JIProgId.java:130)
    at org.jinterop.dcom.core.JIProgId.getCorrespondingCLSID(JIProgId.java:162)
    at org.jinterop.dcom.core.JIComServer.<init>(JIComServer.java:413)
    at SimpleServiceManager.main(SimpleServiceManager.java:25)
Caused by: jcifs.smb.SmbException: The system cannot find the file specified.
    at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:522)
    at jcifs.smb.SmbTransport.send(SmbTransport.java:622)
    at jcifs.smb.SmbSession.send(SmbSession.java:239)
    at jcifs.smb.SmbTree.send(SmbTree.java:109)
    at jcifs.smb.SmbFile.send(SmbFile.java:718)
    at jcifs.smb.SmbFile.open0(SmbFile.java:923)
    at jcifs.smb.SmbFile.open(SmbFile.java:940)
    at jcifs.smb.SmbFileOutputStream.<init>(SmbFileOutputStream.java:142)
    at jcifs.smb.TransactNamedPipeOutputStream.<init>(TransactNamedPipeOutputStream.java:32)
    at jcifs.smb.SmbNamedPipe.getNamedPipeOutputStream(SmbNamedPipe.java:187)
    at rpc.ncacn_np.RpcTransport.attach(RpcTransport.java:92)
    at rpc.Stub.attach(Stub.java:106)
    at rpc.Stub.call(Stub.java:110)
    at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKLM(JIWinRegStub.java:113)
    ... 4 more
2013年4月10日下午1:14:38 org.jinterop.dcom.common.JISystem LogSystemProperties和Version
信息:j-Interop版本=j-Interop 2.08
2013年4月10日下午1:14:38 org.jinterop.dcom.common.JISystem日志系统属性和版本
INFO:java.runtime.name=java(TM)SE运行时环境
sun.boot.library.path=C:\Program Files\Java\jre7\bin
java.vm.version=23.7-b01
java.vm.vendor=Oracle公司
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=java热点(TM)客户端虚拟机
file.encoding.pkg=sun.io
user.country=US
user.script=
sun.java.launcher=sun\u标准
sun.os.patch.level=服务包1
java.vm.specification.name=java虚拟机规范
user.dir=C:\Users\myusername\Google Drive\code\workspace\Eclipse IDE for Java Developers 422\Jinterop
java.runtime.version=1.7.0_17-b02
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.annowed.dirs=C:\Program Files\java\jre7\lib\annowed
os.arch=x86
java.io.tmpdir=C:\Users\myusername\AppData\Local\Temp\
行分隔符=
java.vm.specification.vendor=Oracle公司
user.variant=
os.name=Windows 7
sun.jnu.encoding=Cp1252
java.library.path=C:\Program Files\java\jre7\bin;C:\Windows\Sun\Java\bin;。。。
java.specification.name=java平台API规范
java.class.version=51.0
sun.management.compiler=热点客户端编译器
os.version=6.1
user.home=C:\Users\myusername
user.timezone=美国/纽约
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=Cp1252
java.specification.version=1.7
java.class.path=C:\Users\myusername\Google Drive\code\Workspaces\Eclipse IDE for java Developers 422\Jinterop\bin;C:\Users\myusername\Google Drive\code\Workspaces\Eclipse IDE for Java Developers 422\Jinterop\libs\j-interop.jar;C:\Users\myusername\Google Drive\code\Workspaces\Eclipse IDE for Java Developers 422\Jinterop\libs\j-interopdeps.jar;C:\Users\myusername\Google Drive\code\Workspaces\Eclipse IDE for Java Developers 422\Jinterop\libs\jcifs-1.2.19.jar
user.name=myusername
java.vm.specification.version=1.7
sun.java.command=SimpleServiceManager
java.home=C:\Program Files\java\jre7
sun.arch.data.model=32
user.language=en
java.specification.vendor=Oracle公司
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=混合模式,共享
java.version=1.7.0_17
java.ext.dirs=C:\Program Files\java\jre7\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.boot.class.path=C:\ProgramFiles\Java\jre7\lib\resources.jar;C:\ProgramFiles\Java\jre7\lib\rt.jar;C:\Program Files\Java\jre7\lib\sunrsasign.jar;C:\ProgramFiles\Java\jre7\lib\jsse.jar;C:\ProgramFiles\Java\jre7\lib\jce.jar;C:\ProgramFiles\Java\jre7\lib\charsets.jar;C:\ProgramFiles\Java\jre7\lib\jfr.jar;C:\ProgramFiles\Java\jre7\classes
java.vendor=Oracle公司
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding=UnicodeLittle
sun.cpu.endian=很少
sun.desktop=windows
sun.cpu.isalist=pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86
2013年4月10日下午1:14:38 org.jinterop.dcom.core.JIComOxidRuntime$ClientPingTimerTask运行
信息:正在运行ClientPingTimerTask!
2013年4月10日下午1:14:38 org.jinterop.dcom.core.JISession createSession
信息:已创建会话:-1745354837
2013年4月10日下午1:14:38 org.jinterop.dcom.core.JIComOxidRuntime$ServerPingTimerTask运行
信息:正在运行ServerPingTimerTask!
2013年4月10日下午1:14:38 org.jinterop.dcom.core.JISession$Release\u References\u TimerTask run
信息:Release\u References\u TimerTask:[运行]会话:-1745354837,ListofReferencedPipids.size():0
2013年4月10日下午1:14:38 org.jinterop.dcom.common.JISystem saveDBPathAndLoadFile
信息:progidvsclsidb:{}
org.jinterop.dcom.common.JIException:未找到错误代码为0xC0000034的消息
位于org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKLM(JIWinRegStub.java:115)
位于org.jinterop.dcom.core.JIProgId.getIdFromWinReg(JIProgId.java:130)
位于org.jinterop.dcom.core.JIProgId.getCorrespondingCLSID(JIProgId.java:162)
位于org.jinterop.dcom.core.JIComServer(JIComServer.java:413)
位于SimpleServiceManager.main(SimpleServiceManager.java:25)
原因:jcifs.smb.smb异常:系统找不到指定的文件。
位于jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:522)
位于jcifs.smb.SmbTransport.send(SmbTransport.java:622)
位于jcifs.smb.SmbSession.send(SmbSession.java:239)
位于jcifs.smb.SmbTree.send(SmbTree.java:109)
在jcifs.smb.SmbFile.send(SmbFile.java:718)
在jcifs.smb.SmbFile.open0(SmbFile.java:923)
位于jcifs.smb.SmbFile.open(SmbFile.java:940)
在jcifs.smb.SmbFileOutputStream。(SmbFileOutputStream.java:142)
在jcifs.smb.Transact-NamedPipeOutputStream。(Transact-NamedPipeOutputStream.java:32)
位于jcifs.smb.SmbNamedPipe.getNamedPipeOutputStream(SmbNamedPipe.java:187)
在rpc.ncacn\u np.RpcTransport.attach(RpcTransport.java:92)
位于rpc.Stub.attach(Stub.java:106)
atrpc.Stub.call(Stub.java:110)
位于org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKLM(JIWinRegStub.java:113)
... 4更多

为什么会引发jcifs.smb.smb异常?WMI不使用smb,为什么我会看到此错误?jinterop是否要求客户端启用windows文件共享?

我正在回复您的声明“我甚至无法启动dcom会话”。以下是使用j-interop获取会话的代码

try {
        args[0] = "x.y.z.w";
        String domain       = "";//i am using it as blank
        String username     = "username";//user who logs in to the system as admin
        String password     = "password";// used by admin to login to windows pc

        JISystem.getLogger().setLevel(Level.FINEST);
        JISystem.setInBuiltLogHandler(false);
        JISystem.setAutoRegisteration(true);
        JISession session3 = JISession.createSession(domain,username,password);
        session3.useSessionSecurity(true);
        System.out.println(" session3 "+session3);
    }catch(Exception e){
        e.printStackTrace();
    }
您将看到输出
session3 org.jinterop.dcom.core。JISession@a46bc929

在这篇文章中有关于这个问题的讨论

快速总结:

首先,确保已启用远程注册表服务

第二,确保不使用自动注册
JISystem.setAutoRegisteration(false);