无名随风 2017-11-30 10:16 采纳率: 0%
浏览 1574
已结题

j-Interop调用64位系统的WMI获取信息报错

报如下错误,有没有大神用过,给下解决办法.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 16
at jcifs.util.Encdec.dec_uint32le(Encdec.java:90)
at ndr.NdrBuffer.dec_ndr_long(NdrBuffer.java:146)
at ndr.NetworkDataRepresentation.readUnsignedLong(NetworkDataRepresentation.java:64)
at org.jinterop.dcom.core.JIRemoteSCMActivator$RemoteCreateInstance.read(JIRemoteSCMActivator.java:642)
at ndr.NdrObject.decode(NdrObject.java:36)
at rpc.ConnectionOrientedEndpoint.call(ConnectionOrientedEndpoint.java:137)
at rpc.Stub.call(Stub.java:113)
at org.jinterop.dcom.core.JIComServer.init(JIComServer.java:645)
at org.jinterop.dcom.core.JIComServer.initialise(JIComServer.java:496)
at org.jinterop.dcom.core.JIComServer.(JIComServer.java:429)
at systeminfo.util.WMIUtil.connect(WMIUtil.java:93)
at systeminfo.util.WMIUtil.main(WMIUtil.java:35)

package systeminfo.util;

import java.net.UnknownHostException;
import java.util.logging.Level;

import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.common.JISystem;
import org.jinterop.dcom.core.IJIComObject;
import org.jinterop.dcom.core.JIArray;
import org.jinterop.dcom.core.JIComServer;
import org.jinterop.dcom.core.JIProgId;
import org.jinterop.dcom.core.JISession;
import org.jinterop.dcom.core.JIString;
import org.jinterop.dcom.core.JIVariant;
import org.jinterop.dcom.impls.JIObjectFactory;
import org.jinterop.dcom.impls.automation.IJIDispatch;
import org.jinterop.dcom.impls.automation.IJIEnumVariant;

public class WMIUtil {
private JIComServer m_ComStub = null;
private IJIComObject m_ComObject = null;
private IJIDispatch m_Dispatch = null;
private JISession m_Session = null;
private IJIDispatch m_WbemServices = null;
private static final String WMI_CLSID = "76A6415B-CB41-11d1-8B02-00600806D9B6";
private static final String WMI_PROGID = "WbemScripting.SWbemLocator";
private String m_Host = null;
private String m_Domain = "ROOT\CIMV2";
private String m_Username;
private String m_Password;

public static void main(String[] args) {
    WMIUtil wmiService = new WMIUtil("","192.168.9.9","Administrator","cloudsino");
    wmiService.connect();// 系统信息
    wmiService.query("SELECT * FROM Win32_ComputerSystem");// CPU信息
    wmiService.query("SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name != '_Total'");// 内存信息
    wmiService.query("SELECT * FROM Win32_PerfFormattedData_PerfOS_Memory");// 磁盘信息
    wmiService.query("SELECT * FROM Win32_PerfRawData_PerfDisk_PhysicalDisk Where Name != '_Total'");
    wmiService.disconnect();
}

public WMIUtil(String domain,String host,String username, String password) {
    JISystem.setAutoRegisteration(true);
    JISystem.getLogger().setLevel(Level.WARNING);
    this.m_Host = host;
    this.m_Domain = domain;
    this.m_Username = username;
    this.m_Password = password;
}

public void query(String strQuery) {
    System.out.println("query:" + strQuery);
    JIVariant results[] = new JIVariant[0];
    try {
        results = m_WbemServices.callMethodA("ExecQuery", new Object[] {
                new JIString(strQuery), JIVariant.OPTIONAL_PARAM(),
                JIVariant.OPTIONAL_PARAM(), JIVariant.OPTIONAL_PARAM() });
        IJIDispatch wOSd = (IJIDispatch) JIObjectFactory
                .narrowObject((results[0]).getObjectAsComObject());
        int count = wOSd.get("Count").getObjectAsInt();
        IJIComObject enumComObject = wOSd.get("_NewEnum")
                .getObjectAsComObject();
        IJIEnumVariant enumVariant = (IJIEnumVariant) JIObjectFactory
                .narrowObject(enumComObject
                        .queryInterface(IJIEnumVariant.IID));
        IJIDispatch wbemObject_dispatch = null;
        for (int c = 0; c < count; c++) {
            Object[] values = enumVariant.next(1);
            JIArray array = (JIArray) values[0];
            Object[] arrayObj = (Object[]) array.getArrayInstance();
            for (int j = 0; j < arrayObj.length; j++) {
                wbemObject_dispatch = (IJIDispatch) JIObjectFactory
                        .narrowObject(((JIVariant) arrayObj[j])
                                .getObjectAsComObject());
            }
            String str = (wbemObject_dispatch.callMethodA("GetObjectText_",
                    new Object[] { 1 }))[0].getObjectAsString2();
            System.out.println("(" + c + "):");
            System.out.println(str);
            System.out.println();
        }
    } catch (JIException e) {
        e.printStackTrace();
    }
}

public void connect() {
    try {
        m_Session = JISession.createSession(m_Domain, m_Username, m_Password);
        m_Session.useSessionSecurity(false);
        m_Session.setGlobalSocketTimeout(6000);
        m_ComStub = new JIComServer(JIProgId.valueOf(WMI_PROGID), m_Host,m_Session);
        IJIComObject unknown = m_ComStub.createInstance();
        m_ComObject = unknown.queryInterface(WMI_CLSID);
        m_Dispatch = (IJIDispatch) JIObjectFactory.narrowObject(m_ComObject
                .queryInterface(IJIDispatch.IID));
        JIVariant results[] = m_Dispatch.callMethodA(
                "ConnectServer",
                new Object[] { new JIString(m_Host),
                        JIVariant.OPTIONAL_PARAM(),
                        JIVariant.OPTIONAL_PARAM(),
                        JIVariant.OPTIONAL_PARAM(),
                        JIVariant.OPTIONAL_PARAM(),
                        JIVariant.OPTIONAL_PARAM(), 0,
                        JIVariant.OPTIONAL_PARAM() });
        m_WbemServices = (IJIDispatch) JIObjectFactory
                .narrowObject((results[0]).getObjectAsComObject());
    } catch (JIException e) {
        e.printStackTrace();
        if (m_Session != null) {
            try {
                JISession.destroySession(m_Session);
            } catch (JIException e1) {
                e.printStackTrace();
            }
        }
    } catch (UnknownHostException e) {
        if (m_Session != null) {
            try {
                JISession.destroySession(m_Session);
            } catch (JIException e1) {
                e1.printStackTrace();
            }
        }
    }
}

public void disconnect() {
    try {
        JISession.destroySession(m_Session);
    } catch (JIException e) {
        e.printStackTrace();
    }
}

}

  • 写回答

3条回答 默认 最新

  • oyljerry 2017-11-30 10:21
    关注

    ArrayIndexOutOfBoundsException
    connect函数中有越界。at systeminfo.util.WMIUtil.connect(WMIUtil.java:93) 具体看看哪一个

    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?