j-interop using local credentials

1.2k views Asked by At

I'm attempting to utilize this WMI sample from the J-interop package. The issue I'm facing is that the system I'm running this against is not a part of the domain. I looked at the Javadoc for j-interop and it says in org.jinterop.dcom.core.JISession that it takes the IJIAuthInfo, domain credentials, or the credentials from another session.

How do I specify credentials local to that system?

public class ServiceManager {

    private static String domainName = "";
    private static String userName="administrator";
    private static String password="";
    private static String hostIP ="127.0.0.1";
    private static final String win32_namespace = "ROOT\\CIMV2";

    private static final int STOP_SERVICE = 0;
    private static final int START_SERVICE = 1;

    private JISession dcomSession = null;
    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        ServiceManager manager = new ServiceManager();
        manager.stopService(domainName, hostIP, userName, password, "MySql");//stops a service named MySql
    }
    /**
     * Starts a given service if its stopped.
     *
     * @param domainName
     * @param hostname
     * @param username
     * @param password
     * @param serviceName
     */
    public void startService(String domainName, String hostname, String username, String password, String serviceName) {
        execute(domainName, hostname, username, password, serviceName, START_SERVICE);
    }
    /**
     * Stops a given service if its running.
     *
     * @param domainName
     * @param hostname
     * @param username
     * @param password
     * @param serviceName
     */
    public void stopService(String domainName, String hostname, String username, String password, String serviceName) {
        execute(domainName, hostname, username, password, serviceName, STOP_SERVICE);
    }
    /**
     * Starts/Stops a given service of remote machine as hostname. 
     *
     * @param domainName
     * @param hostname
     * @param username
     * @param password
     * @param serviceName
     * @param action
     */
    public void execute(String domainName, String hostname, String username, String password, String serviceName, int action) {

        try {
            IJIDispatch wbemServices = createCOMServer();

            final int RETURN_IMMEDIATE = 0x10;
            final int FORWARD_ONLY = 0x20;
            Object[] params = new Object[] {
                    new JIString("SELECT * FROM Win32_Service WHERE Name = '" + serviceName + "'"),
                    JIVariant.OPTIONAL_PARAM(),
                    new JIVariant(new Integer(RETURN_IMMEDIATE + FORWARD_ONLY))
            };
            JIVariant[] servicesSet = wbemServices.callMethodA("ExecQuery", params);
            IJIDispatch wbemObjectSet = (IJIDispatch) narrowObject(servicesSet[0].getObjectAsComObject());

            JIVariant newEnumvariant = wbemObjectSet.get("_NewEnum");
            IJIComObject enumComObject = newEnumvariant.getObjectAsComObject();
            IJIEnumVariant enumVariant = (IJIEnumVariant) narrowObject(enumComObject.queryInterface(IJIEnumVariant.IID));

            Object[] elements = enumVariant.next(1);
            JIArray aJIArray = (JIArray) elements[0];

            JIVariant[] array = (JIVariant[]) aJIArray.getArrayInstance();
            for (JIVariant variant : array) {
                IJIDispatch wbemObjectDispatch = (IJIDispatch) narrowObject(variant.getObjectAsComObject());

                // Print object as text.
                JIVariant[] v = wbemObjectDispatch.callMethodA("GetObjectText_", new Object[] { 1 });
                System.out.println(v[0].getObjectAsString().getString());

                // Start or Stop the service
                String methodToInvoke = (action == START_SERVICE) ? "StartService" : "StopService";
                JIVariant returnStatus = wbemObjectDispatch.callMethodA(methodToInvoke);
                System.out.println("Return status: "+returnStatus.getObjectAsInt()); //if return code = 0 success.See msdn for more details about the method.
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (dcomSession != null) {
                try {
                    JISession.destroySession(dcomSession);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
    /**
     * Initialize DCOM session and connect to SWBEM service on given host machine.
     * @return
     */
    private IJIDispatch createCOMServer() { 
        JIComServer comServer;
        try {           
            JISystem.getLogger().setLevel(Level.WARNING);
            JISystem.setAutoRegisteration(true);
            dcomSession  = JISession.createSession(domainName,userName,password);
            dcomSession.useSessionSecurity(false);
            comServer = new JIComServer(valueOf("WbemScripting.SWbemLocator"),hostIP,dcomSession);

            IJIDispatch wbemLocator = (IJIDispatch) narrowObject(comServer.createInstance().queryInterface(IID));
            //parameters to connect to WbemScripting.SWbemLocator
            Object[] params = new Object[] {
                    new JIString(hostIP),//strServer
                    new JIString(win32_namespace),//strNamespace
                    JIVariant.OPTIONAL_PARAM(),//strUser 
                    JIVariant.OPTIONAL_PARAM(),//strPassword 
                    JIVariant.OPTIONAL_PARAM(),//strLocale 
                    JIVariant.OPTIONAL_PARAM(),//strAuthority
                    new Integer(0),//iSecurityFlags 
                    JIVariant.OPTIONAL_PARAM()//objwbemNamedValueSet
            };
            JIVariant results[] = wbemLocator.callMethodA("ConnectServer", params);
            IJIDispatch wbemServices = (IJIDispatch) narrowObject(results[0].getObjectAsComObject());
            return wbemServices;
        } catch (JIException jie) {
            System.out.println(jie.getMessage());
            jie.printStackTrace();
        } catch (JIRuntimeException jire) {
            jire.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (dcomSession!=null) {
                try {
                    JISession.destroySession(dcomSession);
                } catch (JIException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}
1

There are 1 answers

0
randomwords On BEST ANSWER

Since this server isn't part of a domain it is its own domain and the domainName string needs to be set to the server name. The password should be set to the local Administrator account's password. From there you should be able to get a session authenticated.