Welcome to the Java Programming Forums


The professional, friendly Java community. 21,500 members and growing!


The Java Programming Forums are a community of Java programmers from all around the World. Our members have a wide range of skills and they all have one thing in common: A passion to learn and code Java. We invite beginner Java programmers right through to Java professionals to post here and share your knowledge. Become a part of the community, help others, expand your knowledge of Java and enjoy talking with like minded people. Registration is quick and best of all free. We look forward to meeting you.


>> REGISTER NOW TO START POSTING


Members have full access to the forums. Advertisements are removed for registered users.

Results 1 to 1 of 1

Thread: JAVA and WMI

  1. #1
    Junior Member
    Join Date
    Oct 2013
    Location
    Durban
    Posts
    10
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Default JAVA and WMI

    package montest;


    import java.io.IOException;
    import java.util.logging.Level;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import org.jinterop.dcom.common.IJIUnreferenced;
    import org.jinterop.dcom.common.JIException;
    import org.jinterop.dcom.common.JISystem;
    import org.jinterop.dcom.core.JIComServer;
    import org.jinterop.dcom.core.JIProgId;
    import org.jinterop.dcom.core.JISession;
    import org.jinterop.dcom.core.JIString;
    import org.jinterop.dcom.core.JIVariant;
    import org.jinterop.dcom.impls.JIObjectFactory;
    import org.jinterop.dcom.impls.automation.IJIDispatch;
    /**
    *
    * @author Sihle.Ndlovu
    */
    public class MonTest {
    private static final String WMI_DEFAULT_NAMESPACE = "ROOT\\CIMV2";


    private static JISession configAndConnectDCom( String domain, String user, String pass ) throws Exception
    {
    JISystem.getLogger().setLevel( Level.OFF );

    /**try
    {
    JISystem.setInBuiltLogHandler( false );
    }
    catch ( IOException ignored )
    {
    ;
    }
    * */

    JISystem.setAutoRegisteration( true );

    JISession dcomSession = JISession.createSession( domain, user, pass );
    dcomSession.useSessionSecurity( true );
    return dcomSession;
    }


    private static IJIDispatch getWmiLocator( String host, JISession dcomSession ) throws Exception
    {
    JIComServer wbemLocatorComObj = new JIComServer( JIProgId.valueOf( "WbemScripting.SWbemLocator" ), host, dcomSession );
    return (IJIDispatch) JIObjectFactory.narrowObject( wbemLocatorComObj.createInstance().queryInterface( IJIDispatch.IID ) );
    }


    private static IJIDispatch toIDispatch( JIVariant comObjectAsVariant ) throws JIException
    {
    return (IJIDispatch) JIObjectFactory.narrowObject( comObjectAsVariant.getObjectAsComObject() );
    }


    public static void main( String[] args )
    {

    if ( args.length != 4 )
    {
    System.out.println( "Usage: " + EventLogListener.class.getSimpleName() + " domain host username password" );
    return;
    }

    String domain = args[ 0 ];
    String host = args[ 1 ];
    String user = args[ 2 ];
    String pass = args[ 3 ];

    JISession dcomSession = null;

    try
    {
    // Connect to DCOM on the remote system, and create an instance of the WbemScripting.SWbemLocator object to talk to WMI.
    dcomSession = configAndConnectDCom( domain, user, pass );
    IJIDispatch wbemLocator = getWmiLocator( host, dcomSession );

    // Invoke the "ConnectServer" method on the SWbemLocator object via it's IDispatch COM pointer. We will connect to
    // the default ROOT\CIMV2 namespace. This will result in us having a reference to a "SWbemServices" object.
    JIVariant results[] =
    wbemLocator.callMethodA( "ConnectServer", new Object[] { new JIString( host ), new JIString( WMI_DEFAULT_NAMESPACE ),
    JIVariant.OPTIONAL_PARAM(), JIVariant.OPTIONAL_PARAM(), JIVariant.OPTIONAL_PARAM(), JIVariant.OPTIONAL_PARAM(), new Integer( 0 ),
    JIVariant.OPTIONAL_PARAM() } );

    IJIDispatch wbemServices = toIDispatch( results[ 0 ] );

    // Now that we have a SWbemServices DCOM object reference, we prepare a WMI Query Language (WQL) request to be informed whenever a
    // new instance of the "Win32_NTLogEvent" WMI class is created on the remote host. This is submitted to the remote host via the
    // "ExecNotificationQuery" method on SWbemServices. This gives us all events as they come in. Refer to WQL documentation to
    // learn how to restrict the query if you want a narrower focus.
    final String QUERY_FOR_ALL_LOG_EVENTS = "SELECT * FROM __InstanceCreationEvent WHERE TargetInstance ISA 'Win32_NTLogEvent'";
    final int RETURN_IMMEDIATE = 16;
    final int FORWARD_ONLY = 32;

    JIVariant[] eventSourceSet =
    wbemServices.callMethodA( "ExecNotificationQuery", new Object[] { new JIString( QUERY_FOR_ALL_LOG_EVENTS ), new JIString( "WQL" ),
    new JIVariant( new Integer( RETURN_IMMEDIATE + FORWARD_ONLY ) ) } );
    IJIDispatch wbemEventSource = (IJIDispatch) JIObjectFactory.narrowObject( ( eventSourceSet[ 0 ] ).getObjectAsComObject() );

    // The result of the query is a SWbemEventSource object. This object exposes a method that we can call in a loop to retrieve the
    // next Windows Event Log entry whenever it is created. This "NextEvent" operation will block until we are given an event.
    // Note that you can specify timeouts, see the Microsoft documentation for more details.
    while ( true )
    {
    JIVariant eventAsVariant = (JIVariant) ( wbemEventSource.callMethodA( "NextEvent", new Object[] { JIVariant.OPTIONAL_PARAM() } ) )[ 0 ];
    IJIDispatch wbemEvent = toIDispatch( eventAsVariant );

    // WMI gives us events as SWbemObject instances (a base class of any WMI object). We know in our case we asked for a specific object
    // type, so we will go ahead and invoke methods supported by that Win32_NTLogEvent class via the wbemEvent IDispatch pointer.
    // In this case, we simply call the "GetObjectText_" method that returns us the entire object as a CIM formatted string. We could,
    // however, ask the object for its property values via wbemEvent.get("PropertyName"). See the j-interop documentation and examples
    // for how to query COM properties.
    JIVariant objTextAsVariant = (JIVariant) ( wbemEvent.callMethodA( "GetObjectText_", new Object[] { new Integer( 1 ) } ) )[ 0 ];
    String asText = objTextAsVariant.getObjectAsString().getString();
    System.out.println( asText );
    }
    }
    catch ( Exception e )
    {
    e.printStackTrace();
    }
    finally
    {
    if ( null != dcomSession )
    {
    try
    {
    JISession.destroySession( dcomSession );
    }
    catch ( Exception ex )
    {
    ex.printStackTrace();
    }
    }
    }
    }

    }
    Attached Images Attached Images


Similar Threads

  1. wmi usage or PC info in java
    By roofninja in forum What's Wrong With My Code?
    Replies: 9
    Last Post: September 12th, 2012, 09:08 AM
  2. Help with WMI
    By Henry518 in forum What's Wrong With My Code?
    Replies: 0
    Last Post: October 22nd, 2011, 08:25 AM