2012-10-02 33 views
3

我目前正在開發一個基於java的跨平臺軟件分銷商,並且我選擇使用本機操作系統機制來防止用戶在手動前進行任何設置。Java JACOB檢索給定Win32_ *類對象的所有屬性

我選擇了JSCH for SSH2和JACOB for Java。我意識到JACOB將我限定爲Windows的首席主持人,但這是我可以接受的。

我正在編寫一個圍繞JACOB的包裝來使用一些本機制通過WMI與目標交談,並且我遇到了一個小問題。我正在嘗試檢索給定Win32_類對象的所有可用屬性的列表,但我無法完成此操作。

此鏈接顯示您可以在VB http://www.vbsedit.com/scripts/misc/wmi/scr_1333.asp中做到這一點,我想知道是否有人在使用JACOB時能夠弄清楚它。

編輯:(代碼段)以上

item = enumVariant.nextElement().toDispatch(); 
      //Dispatch.class returns a variant which can convert to java form 
      String serviceName = Dispatch.call(item, "Name").toString(); 
      String servicePath = Dispatch.call(item,"PathName").toString(); 
      int servicePID = Dispatch.call(item,"ProcessId").getInt(); 
      //System.out.println("Service: "+serviceName+" ServicePath: "+servicePath+" PID: "+servicePID); 
      //System.out.println(serviceName+" "+servicePath+" "+servicePID); 
      list.add(serviceName+" "+servicePID); 

代碼顯示,我可以要求單獨的屬性,但沒有要求對所有屬性的好方法。

+0

本例中的起點是'GetObject()'vbscript函數。我總是使用Jacob開始的'CreateObject()',所以我不知道這是否可能。有一篇關於嘗試訪問WMI的未回覆的帖子,[在SourceForge Jacob論壇中](https://sourceforge.net/projects/jacob-project/forums/forum/375946/topic/4069124) – Jarekczek

+0

我回答了帖子,儘管它已經快一歲了。我知道如何訪問單個屬性,但我想找到一種查詢所有可用屬性的方法。 – ChristianB

+0

請在此處發佈您的代碼,以便我們可以看到問題的確切位置。而且我們可以從那一刻開始,而不是從頭開始:)。謝謝。 – Jarekczek

回答

4

這是你的問題的答案。我希望如此,因爲我不知道你的問題到底在哪裏。我仍然認爲當你問你應該提供代碼的一部分而不是要求回答者寫一切。

這可能也是一個答案,一個更一般的問題,我剛剛得知:
如何枚舉所有項目的集合中,實施For Each結構?
應該使用EnumVariant Jacob類。

import com.jacob.activeX.*; 
import com.jacob.com.*; 

public class testJacob { 
    public static void main(String args[]) { 
    String sMoniker = "winmgmts:{impersonationLevel=impersonate}!" + 
     "\\\\.\\root\\cimv2"; 
    Dispatch dServ = new Dispatch(sMoniker); 
    Variant v = Dispatch.call(dServ, "SubclassesOf"); 
    // SWbemObjectSet object 
    // http://msdn.microsoft.com/en-us/library/aa393762%28v=vs.85%29.aspx 
    Dispatch objSet = v.getDispatch(); 
    System.out.println("object count: " + objSet.get(objSet, "count")); 
    int cObj = 0; 
    EnumVariant en = new EnumVariant(objSet); 
    while (en.hasMoreElements()) { 
     // SWbemObject object 
     // http://msdn.microsoft.com/en-us/library/aa393741(v=vs.85).aspx 
     Dispatch dItem = en.nextElement().getDispatch(); 
     Dispatch dPath = Dispatch.get(dItem, "Path_").getDispatch(); 
     String sClass = Dispatch.get(dPath, "Class").getString(); 
     System.out.println("path: " + sClass); 
     Dispatch dObj = Dispatch.call(dServ, "get", sClass).getDispatch(); 
     Dispatch dProps = Dispatch.call(dObj, "Properties_").getDispatch(); 
     EnumVariant enProp = new EnumVariant(dProps); 
     while (enProp.hasMoreElements()) { 
     Dispatch dProp = enProp.nextElement().getDispatch(); 
     String sProp = Dispatch.get(dProp, "name").getString(); 
     System.out.println("property: " + sProp); 
     } 
     if (++cObj >= 5) 
     break; 
    } 
    } 
} 
+0

這是否適用於Win32_ComputerSystem類?我可以通過http://msdn.microsoft.com/en-us/library/windows/desktop/aa394102(v=vs.85).aspx#methods查詢屬性的枚舉器嗎?感謝你,我沒有看到類似的東西。 – ChristianB

+0

這不再與雅各布有關,但這是我的理解:當你有一個實例時,你不能得到一個屬性列表。但是您可以獲取類描述並遍歷應用於該實例的屬性和方法。請參閱[檢索類或實例數據](http://msdn.microsoft.com/en-us/library/windows/desktop/aa393246%28v=vs.85%29.aspx) – Jarekczek