Com 使用J-Interop通过Java实现WMI

Com 使用J-Interop通过Java实现WMI,com,wmi,wmi-query,j-interop,Com,Wmi,Wmi Query,J Interop,我是WMI新手,使用J-interop库通过Java进行COM通信。。。 我需要从远程系统获取物理内存数据 我有以下代码:它提供了一些数据,但有一些缺陷,例如我的系统中有2 GB内存,两个内存卡各1 GB,此代码仅显示1 GB内存: 请帮助我更正以下代码,以及J-Interop的任何好参考,并提供好的示例: JISession dcomSession = null; try { dcomSession = init(domain, username, password); JIComServer

我是WMI新手,使用J-interop库通过Java进行COM通信。。。 我需要从远程系统获取物理内存数据

我有以下代码:它提供了一些数据,但有一些缺陷,例如我的系统中有2 GB内存,两个内存卡各1 GB,此代码仅显示1 GB内存:

请帮助我更正以下代码,以及J-Interop的任何好参考,并提供好的示例:

JISession dcomSession = null;
try {
dcomSession = init(domain, username, password);
JIComServer 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());

final int RETURN_IMMEDIATE = 0x10;
final int FORWARD_ONLY = 0x20;

params = new Object[] { new JIString("SELECT * FROM Win32_PhysicalMemory"), JIVariant.OPTIONAL_PARAM(),
        new JIVariant(new Integer(RETURN_IMMEDIATE)) };
JIVariant[] servicesSet = wbemServices.callMethodA("ExecQuery", params);
IJIDispatch wbemObjectSet = (IJIDispatch) narrowObject(servicesSet[0].getObjectAsComObject());

JIVariant newEnumvariant = wbemObjectSet.get("_NewEnum");
IJIComObject enumComObject = newEnumvariant.getObjectAsComObject();
IJIEnumVariant enumVariant = (IJIEnumVariant) narrowObject(enumComObject.queryInterface(IJIEnumVariant.IID));

Object[] elements = enumVariant.next(1);
JIArray aJIArray = (JIArray) elements[0];

JIVariant[] array = (JIVariant[]) aJIArray.getArrayInstance();
for (JIVariant variant : array) {
    IJIDispatch wbemObjectDispatch = (IJIDispatch) narrowObject(variant.getObjectAsComObject());

    // Print object as text. Optional - comment if not needed
    JIVariant[] v = wbemObjectDispatch.callMethodA("GetObjectText_", new Object[] { 1 });
    System.out.println(v1[0].getObjectAsString2());
    System.out.println(wbemObjectDispatch.get("DataWidth").getObjectAsInt());
    System.out.println(wbemObjectDispatch.get("Status").getObjectAsInt());
    System.out.println(wbemObjectDispatch.get("Speed").getObjectAsInt());
    System.out.println(wbemObjectDispatch.get("FormFactor").getObjectAsInt());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (dcomSession != null) {
    try {
        JISession.destroySession(dcomSession);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
}

您需要获取枚举中元素的计数。看看MSIWMI2.java中的j-interop示例。下面是一个获取枚举计数的示例

...
results = wbemServices_dispatch.callMethodA("ExecQuery", new Object[]{new JIString("select * from Win32_OperatingSystem where Primary=True"), JIVariant.OPTIONAL_PARAM(), JIVariant.OPTIONAL_PARAM(),JIVariant.OPTIONAL_PARAM()});
IJIDispatch wbemObjectSet_dispatch = (IJIDispatch)JIObjectFactory.narrowObject((results[0]).getObjectAsComObject());
JIVariant variant = wbemObjectSet_dispatch.get("_NewEnum");
IJIComObject object2 = variant.getObjectAsComObject();

IJIEnumVariant enumVARIANT = (IJIEnumVariant)JIObjectFactory.narrowObject(object2.queryInterface(IJIEnumVariant.IID));

JIVariant Count = wbemObjectSet_dispatch.get("Count");
int count = Count.getObjectAsInt();
for (int i = 0; i < count; i++)
{
        Object[] values = enumVARIANT.next(1);
        JIArray array = (JIArray)values[0];
        Object[] arrayObj = (Object[])array.getArrayInstance();
        for (int j = 0; j < arrayObj.length; j++)
        {
            IJIDispatch wbemObject_dispatch = (IJIDispatch)JIObjectFactory.narrowObject(((JIVariant)arrayObj[j]).getObjectAsComObject());
            JIVariant variant2 = (JIVariant)(wbemObject_dispatch.callMethodA("GetObjectText_",new Object[]{new Integer(1)}))[0];
            System.out.println(variant2.getObjectAsString().getString());
            System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        }
}
...
。。。
结果=wbemServices_dispatch.callMethodA(“ExecQuery”,新对象[]{new JIString(“从Win32_OperatingSystem中选择*,其中Primary=True”),JIVariant.OPTIONAL_PARAM(),JIVariant.OPTIONAL_PARAM(),JIVariant.OPTIONAL_PARAM(),JIVariant.OPTIONAL_PARAM();
IJIDispatch wbeobjectset_dispatch=(IJIDispatch)JIObjectFactory.窄带对象((结果[0]).getObjectAsComObject());
JIVariant=wbemObjectSet_dispatch.get(“_NewEnum”);
IJIComObject object2=variant.getObjectAscobject();
IJIEnumVariant enumVARIANT=(IJIEnumVariant)JIObjectFactory.窄带对象(object2.queryInterface(IJIEnumVariant.IID));
JIVariant Count=wbemObjectSet_dispatch.get(“Count”);
int count=count.getObjectAsInt();
for(int i=0;i
此代码来自org.jinterop.dcom.test包中的MSWMI2.java

问候


Björn

@PSisHere:我们可以远程使用这个库吗?是的,我在Linux机器上运行java代码,用wmi查询窗口机器。