2011-09-06 3 views
1

WMI를 처음 사용하고 Java를 통한 COM 통신에 J-interop lib를 사용합니다 ... 원격 시스템에서 실제 메모리 데이터를 가져올 필요가 있습니다.J-Interop을 사용하는 Java를 통한 WMI

나는 다음과 같은 코드를 가지고있다 : 데이터의 일부를 제공하지만, 내 시스템에 2 GB 메모리를 가지고 있고, 2 GB 메모리를 가지고 있으며,이 코드는 1 GB의 메모리만을 보여준다.

는 좋은 예와 J-상호 운용성을 위해 따라 다음 코드 및 좋은 참고 정류에 제발 도와주세요 :

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(); 
    } 
} 
} 

답변

1

당신은 열거의 요소의 수를 얻을 필요가있다. 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("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); 
     } 
} 
... 

이 코드는 org.jinterop.dcom.test 패키지의 MSWMI2.java에 있습니다. 우리가 원격으로이 라이브러리를 사용할 수 있습니다

종류는

비욘에게 많은 비요른 ... 그것은 일했다 ... :)

+0

감사합니다 ... – PSisHere

+0

@PSisHere에 관하여? – HashimR

+0

예, Linux 컴퓨터에서 java 코드를 실행하여 wmi가있는 창 컴퓨터를 쿼리합니다. –

관련 문제