Java JACOB 检索给定 Win32_* 类对象的所有属性

标签 java windows winapi wmi jacob

我目前正在开发一个基于 java 的跨平台软件分发器,我选择使用 native 操作系统机制来防止用户事先进行任何设置。

我为 SSH2 选择了 JSCH,为 Java 选择了 JACOB。我意识到 JACOB 将我限制为将 Windows 作为起始主机,但这是我可以接受的。

我正在围绕 JACOB 编写一个包装器,以使用一些 native 机制通过 WMI 与目标通信,但我遇到了一个小问题。我正在尝试检索可用于给定 Win32_ 类对象的所有属性的列表,但我无法做到这一点。

此链接显示您可以在 VB 中完成 http://www.vbsedit.com/scripts/misc/wmi/scr_1333.asp我想知道在使用 JACOB 时是否有人能够弄清楚。

编辑:(代码片段)

item = enumVariant.nextElement().toDispatch();
            //Dispatch.class returns a variant which can convert to java form
            String serviceName = Dispatch.call(item, "Name").toString();
            String servicePath = Dispatch.call(item,"PathName").toString();
            int servicePID = Dispatch.call(item,"ProcessId").getInt();
            //System.out.println("Service: "+serviceName+" ServicePath: "+servicePath+" PID: "+servicePID);
            //System.out.println(serviceName+" "+servicePath+" "+servicePID);
            list.add(serviceName+" "+servicePID);

上面的代码显示我可以请求单个属性,但没有一个好的方法来请求所有属性。

最佳答案

这是您问题的答案。我希望如此,因为我不知道你的问题到底出在哪里。我仍然认为,在询问时应该提供部分代码,而不是要求回答者编写所有内容。

这也可能是对一个更普遍的问题的回答,我刚刚了解到:
如何枚举集合中的所有项目,实现For Each结构?
应该使用 EnumVariant Jacob 类。

import com.jacob.activeX.*;
import com.jacob.com.*;

public class testJacob {
  public static void main(String args[]) {
    String sMoniker = "winmgmts:{impersonationLevel=impersonate}!" +
      "\\\\.\\root\\cimv2";
    Dispatch dServ = new Dispatch(sMoniker);
    Variant v = Dispatch.call(dServ, "SubclassesOf");
    // SWbemObjectSet object
    // http://msdn.microsoft.com/en-us/library/aa393762%28v=vs.85%29.aspx
    Dispatch objSet = v.getDispatch();
    System.out.println("object count: " + objSet.get(objSet, "count"));
    int cObj = 0;
    EnumVariant en = new EnumVariant(objSet);
    while (en.hasMoreElements()) {
      // SWbemObject object
      // http://msdn.microsoft.com/en-us/library/aa393741(v=vs.85).aspx
      Dispatch dItem = en.nextElement().getDispatch();
      Dispatch dPath = Dispatch.get(dItem, "Path_").getDispatch();
      String sClass = Dispatch.get(dPath, "Class").getString();
      System.out.println("path: " + sClass);
      Dispatch dObj = Dispatch.call(dServ, "get", sClass).getDispatch();
      Dispatch dProps = Dispatch.call(dObj, "Properties_").getDispatch();
      EnumVariant enProp = new EnumVariant(dProps);
      while (enProp.hasMoreElements()) {
        Dispatch dProp = enProp.nextElement().getDispatch();
        String sProp = Dispatch.get(dProp, "name").getString();
        System.out.println("property: " + sProp);
      }
      if (++cObj >= 5)
        break;
    }
  }
}

关于Java JACOB 检索给定 Win32_* 类对象的所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12698653/

相关文章:

c++ - 如何在 Windows 服务程序中捕获 SERVICE_CONTROL_SHUTDOWN 代码

java - 使用 spock 数据表填充对象

windows - 打开 WDK 项目导致 "One or more errors occurred"消息

c++ - 替换或修改外部应用程序中的 API 调用(GetOpenFileName、GetSaveFileName)

java - SWT TableViewer 标题高度

Windows MIrror Driver Remote Display Driver VNC 服务器 windows 8

java - 使用@ApplicationScoped bean 是否更有效?

java - 使用 tomcat 部署期间避免临时 404 错误

java - 格式化字符串和简单字符串的区别

c++ - 如何创建 std::string 包装器,将 ptr 保留到 std::string 并将 ptr 保留到创建该包装器实例的类中的特殊类函数?