Search code examples
batch-filedcomj-interop

How to call a remote bat file using jinterop


GlassFish Application Server uses a script, asadmin.bat, that in turns starts a JVM.

I'd like to call this script using jinterop and DCOM from Java on a remote machine. I can't find any help on this specific usage. Any help would be greatly appreciated.


Solution

  • I use the Windows Scripting Host Shell to execute some program or batch on a remote computer.

    The code looks like:

    // Create a session
    JISession session = JISession.createSession(<domain>, <user>, <password>);
    session.useSessionSecurity(true);
    
    // Execute command
    JIComServer comStub = new JIComServer(JIProgId.valueOf("WScript.Shell"),<IP>, session);
    IJIComObject unknown = comStub.createInstance();
    final IJIDispatch shell =     (IJIDispatch)JIObjectFactory.narrowObject((IJIComObject)unknown.queryInterface(IJIDispatch.I ID));
    JIVariant results[] = shell.callMethodA("Exec", new Object[]{new JIString("%comspec% /c asadmin.bat" )});
    

    If you need the output from the batch you can use StdOut to read it.

    JIVariant stdOutJIVariant = wbemObjectSet_dispatch.get("StdOut"); 
    IJIDispatch stdOut =  (IJIDispatch)JIObjectFactory.narrowObject(stdOutJIVariant.getObjectAsComObject());
    
    // Read all from stdOut
    while(!((JIVariant)stdOut.get("AtEndOfStream")).getObjectAsBoolean()){ 
        System.out.println(stdOut.callMethodA("ReadAll").getObjectAsString().getString()); 
    }