// you’re reading...

Featured

Windows Management Instrumentation (WMI) und Java

Wenn man mit Java Systeminformationen auslesen möchte, so stößt man mit Java schnell an die Grenzen des Machbaren. Will man die CPU-Geschwindigkeit oder die installierten Festplatten so muss man dies über JNI und einer entsprechenden nativen Bibliothek bedienen.
Mit WMI hat Microsoft eine Möglichkeit geschaffen lokal und über das Netzwerk auf alle erdenklichen Systeminformationen zu zugreifen. WMI ist ab Windows 2000 fester Bestandteil der Microsoft Betriebssysteme. Für Windows 9x und NT 4.0 gibt es jedoch die Möglichkeit diese Funktionalität nach zu installieren.

Da jedoch diese Funktionalität als native Bibliothek vorliegt kann man nicht so ohne weiteres mit Java darauf zugreifen. Abhilfe schafft hier die freie Java-Bibliothek Jawin. Mit dieser Bibliothek ist es möglich auf DLLs oder auf COM-Objekte zu zugreifen. Zusätzlich bietet das Binär-Packet ein Tool namens Jawin Type Browser womit man Stubs für die nativen Objekte von WMI erstellen kann.

Will man nun von Java aus auf WMI zugreifen so erstellt man zuerst Stub-Klassen für Methoden und Objekte mit dem Jawin Type Browser. Dabei startet man die jawinBrowser.jar Datei, die in dem Ordner typebrowser im Binär-Packet von Jawin enthalten ist. Nun erstellt man ein neues Projekt über das Menu Project und gibt einen Dateinamen für das Projekt an. Danach öffnet sich ein Fenster mit den Einstellungen des Projektes. Mit New wählt man nun die Datei wbemdisp.tlb im Ordner C:\windows\system32\wbem\ aus. Als letzte wichtige Einstellung muss noch das Verzeichnis angegeben werden wo die Jawin Stubs gespeichert werden sollen. Dieses legt man Textfeld "Export directory" fest.

Jetzt klickt man auf "Code Generation" und dann auf "Generate full code" wodurch intern die Stubs erstellt wurden. Um diese schließlich in das Verzeichnis zu lagern muss noch auf "Save Java files" im Menü "Code Generation" geklickt werden.

Wurde alles erfolgreich beendet kann man jetzt mit der eigentlichen Programmierung loslegen. Man muss noch darauf achten, dass man das Verzeichnis, in dem die jawin.jar liegt im classpath anpasst.

Hier stelle ich eine Beispielimplementierung rein. Damit ist es möglich die CPU-Frequenz und den Namen auszulesen.

 
public static void main(String[] args) throws COMException {
    String computerName = ".";
    String userName = "";
    String password = "";
    String namespace = "root/cimv2";
 
    String queryProcessor = "SELECT * FROM Win32_Processor";
 
    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("Name: " + wbemObject.get("Name"));
           System.out.println("CurrentClockSpeed: " + wbemObject.get("CurrentClockSpeed"));
        }
    } catch (COMException e) {
        e.printStackTrace();
    }
}

Das gleiche als VBScript würde folgendermaßen aussehen:

 
computerName = "."
Set wmi = GetObject("winmgmts:\\" & computerName & "\root\cimv2")
Set colItems = wmi.ExecQuery("select * from win32_processor")
 
For Each objItem in colItems
    WScript.Echo objItem.Name
    WScript.Echo objItem.CurrentClockSpeed
Next
Bookmarken:
Hat Ihnen dieser Beitrag gefallen? Abonnieren Sie Codegods kostenlos!
  • del.icio.us
  • Google Bookmarks
  • Live
  • MisterWong
  • Technorati
  • StumbleUpon

Ähnliche Beiträge

Discussion

4 Kommentare zu “Windows Management Instrumentation (WMI) und Java”

  1. How if i want to access WMI using Java? Can you help me…give an example code…thnx

    Posted by dee | 03.09.08, 02:52
  2. Actually i want to use WMI to get information about Network Interface status (Wireless or Wired connection)…

    Posted by dee | 03.09.08, 02:56
  3. hello sir,
    i got the code whic u have given …sir some portion of the code is cut..thats y i m not able to run the code….sir can u provide me with the code in which i can terminate a process on remote system…actually i have been given a project by the company. for that i need help…i have my namespace acccount on the other system…and i am able to get all the instances of a given specied class but i dont know how to kill any process on the remote system…….the code which i have is ………….

    package Examples;

    import wmi.ClassFactory;
    import wmi.ISWbemLocator;
    import wmi.ISWbemMethod;
    import wmi.ISWbemObject;
    import wmi.ISWbemObjectPath;
    import wmi.ISWbemObjectSet;
    import wmi.ISWbemProperty;
    import wmi.ISWbemSecurity;
    import wmi.ISWbemServices;

    import java.io.Console;
    import java.util.*;

    import com4j.Com4jObject;
    import com4j.util.ComObjectCollector;

    public class WMIRemote4 {

    public static void main(String[] args) {
    try {
    System.out.println(“inside main….”);

    listEventLog();

    } catch (Exception e) {

    System.out.println(“Caught exception in main…..”);
    e.printStackTrace();
    }
    }

    public static void listEventLog() throws Exception {
    System.out.println(“Connecting to WMI repository of listEventLog…”);

    ISWbemLocator wbemLocator = ClassFactory.createSWbemLocator();
    System.out.println(“Locator ke baad………………”);

    ISWbemSecurity security = wbemLocator.security_();
    System.out.println(“The Security is **********************” + security);

    ISWbemServices wbemServices = wbemLocator.connectServer(“172.28.5.103″,”Root\\CIMv2″,”",”",”",”",0,null);
    System.out.println(“services ke baad………………”);

    ISWbemObjectSet result = wbemServices.execQuery(“Select * from win32_operatingsystem”,”WQL”, 16, null);
    System.out.println(“The result whic we have got is >>>>>>>>>>>>>>>>>>>>” + result);

    for( Com4jObject obj : result ) {

    ISWbemObject wo = obj.queryInterface(ISWbemObject.class);
    System.out.println(“properties are being printed…” + wo.getObjectText_(0));
    System.out.println(“object property is ” + wo);

    //wo.execMethod_(“win32shutdown(2)”, null,0,null);

    ISWbemObjectPath path = wo.path_();
    System.out.println(“the iswbem object path is ” + path);

    }

    }

    }
    plz help me…..what to do…

    Posted by Pushkar | 31.12.08, 10:51
  4. Strange this publish is totaly unrelated to what I was searching google for, however it was listed around the 1st web page. I guess your doing some thing correct if Google likes you enough to place you around the 1st web page of a non associated search.

    Posted by Ellis Holaday | 21.01.11, 14:48

Kommentieren