java - 使用本地凭据的 j-interop

标签 java active-directory wmi j-interop

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

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

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

最佳答案

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

关于java - 使用本地凭据的 j-interop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13039939/

相关文章:

java - JButton 鼠标悬停在运动监听器上的小信息框(工具提示)

java - 在 ActionPerformed 上更改 GridLayout 中的 JButton 文本

wmi - 通过 WMI 创建/删除磁盘分区

java - 在 Apache POI 中使用 WordToHtmlConverter 转换器

java - 一个我无法解决的简单错误

regex - powershell - 匹配字符串,如果它具有某个字符之一。即姓氏_名字与姓氏_名字_中间名不匹配

angularjs - 从 WAAD 获取用户组的最简单方法是什么?

active-directory - Kerberos:kvno 在客户端票据中是 '1'

sql-server - 如何使用 PowerShell 监控进程的 CPU 使用率?

c# - 授予远程用户(非管理员)使用 WMI 和 C# 枚举命名空间 cimv2 中 Win32_Service 中的服务的能力