2011-01-05 7 views
20

Ehi gente. Ho un progetto commerciale abbastanza grande (quindi le licenze for-pay sono sempre un'opzione) che si sta spostando nello spazio Windows e sto pianificando di fare molto polling con WMI. Questa è un'app client Java 1.6. Ci sono buone risorse o libri là fuori per iniziare a realizzare questo in Java? Sento che il mio .NET fu abbastanza forte, ma spesso non so da dove iniziare a svolgere le stesse attività in Java.Librerie/indicazioni suggerite per l'utilizzo di WMI con java?

Grazie!

risposta

25

Non conosco alcun libro specifico per Java, ma se posso offrire qualche consiglio sarebbe semplicemente iniziare con WMI MSDN documentation. Inoltre, dal momento che WMI è un'API basata su COM, vorrei utilizzare un bridge Java to COM per accedere all'API. Qualsiasi una delle seguenti dovrebbe funzionare:

Per un wrapper Java intorno WMI, c'è la biblioteca jWMI.

+0

Giacobbe e Apollosoft collegamenti sono rotti. Il collegamento di esempio di J-interop non è un esempio, è un'altra domanda SO. – EJP

8

Vorrei spargere qualche parola di avviso riguardo al jWMI: nel caso in cui non si abbia il controllo sui sistemi su cui verrà eseguita la propria app (ad esempio semplice applicazione desktop), prevedere problemi con gli antivirus. jWMI non è una vera libreria, ma semplicemente un'utilità. Crea un file jwmi.vbs in volo e tenta semplicemente di eseguirlo con la chiamata di runtime "cmd/c". Come puoi immaginare, gli antivirus non sono in genere contenti di tale comportamento e sandbox/bloccano immediatamente il file.

+1

Grazie per l'attenzione. La nostra prima implementazione lo ha fatto direttamente, quindi un motivo in più per evitare di usare una libreria per fare lo stesso. – Yablargo

2

Di seguito è riportato un esempio dell'utilizzo di Jawin per ottenere il tempo di attività del sistema tramite WMI.

Per eseguire il codice, è necessario scaricare Jawin biblioteca e aggiungere jawin.dll al eclissi progetto principale

public static void main(String[] args) throws COMException { 
String computerName = ""; 
String userName = ""; 
String password = ""; 
String namespace = "root/cimv2"; 

String queryProcessor = "SELECT * FROM Win32_OperatingSystem"; 

DispatchPtr dispatcher = null; 

try { 

    ISWbemLocator locator = new ISWbemLocator(
      "WbemScripting.SWbemLocator"); 
    ISWbemServices wbemServices = locator.ConnectServer(computerName, 
      namespace, userName, password, "", "", 0, dispatcher); 
    ISWbemObjectSet wbemObjectSet = wbemServices.ExecQuery(
      queryProcessor, "WQL", 0, null); 
    DispatchPtr[] results = new DispatchPtr[wbemObjectSet.getCount()]; 
    IUnknown unknown = wbemObjectSet.get_NewEnum(); 
    IEnumVariant enumVariant = (IEnumVariant) unknown 
      .queryInterface(IEnumVariant.class); 

    enumVariant.Next(wbemObjectSet.getCount(), results); 

    for (int i = 0; i < results.length; i++) { 
     ISWbemObject wbemObject = (ISWbemObject) results[i] 
       .queryInterface(ISWbemObject.class); 

     System.out.println("Uptime: " 
       + wbemObject.get("LastBootUpTime")); 
    } 
} catch (COMException e) { 
    e.printStackTrace(); 
}