首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用本地凭据的j-interop

使用本地凭据的j-interop
EN

Stack Overflow用户
提问于 2012-10-24 05:55:23
回答 1查看 1.1K关注 0票数 1

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

如何指定系统本地凭据?

public class ServiceManager {

代码语言:javascript
运行
复制
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;
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-04 06:43:47

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13039939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档