j-interop使用本地凭据

时间:2012-10-23 21:55:23

标签: java active-directory wmi j-interop

我正在尝试使用J-interop包中的这个WMI示例。我面临的问题是我运行此系统的系统不是域的一部分。我查看了javadoc的j-interop,它在org.jinterop.dcom.core.JISession中说它接受了IJIAuthInfo,域凭据或来自另一个会话的凭据。

如何指定该系统的本地凭据?

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;
}

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 个答案:

答案 0 :(得分:1)

由于此服务器不是域的一部分,因此它是自己的域,并且domainName字符串需要设置为服务器名称。密码应设置为本地管理员帐户的密码。从那里你应该能够通过身份验证进行会话。