Java检索给定Win32_*类对象的所有属性
我目前正在一个基于java的跨平台软件分发服务器上工作,我选择使用本机操作系统机制,以避免用户必须在安装之前进行任何设置 我为SSH2选择了JSCH,为Java选择了JACOB。我意识到JACOB将我限制在Windows上作为起始主机,但这是我可以接受的 我正在围绕JACOB编写一个包装器,以使用一些本机机制通过WMI与目标通信,我遇到了一个小问题。我正在尝试检索给定Win32_uuClass对象的所有可用属性的列表,但未能执行此操作 这个链接显示了你可以在VB中实现它,我想知道在使用JACOB时是否有人能够理解它 编辑:(代码段)Java检索给定Win32_*类对象的所有属性,java,windows,winapi,wmi,jacob,Java,Windows,Winapi,Wmi,Jacob,我目前正在一个基于java的跨平台软件分发服务器上工作,我选择使用本机操作系统机制,以避免用户必须在安装之前进行任何设置 我为SSH2选择了JSCH,为Java选择了JACOB。我意识到JACOB将我限制在Windows上作为起始主机,但这是我可以接受的 我正在围绕JACOB编写一个包装器,以使用一些本机机制通过WMI与目标通信,我遇到了一个小问题。我正在尝试检索给定Win32_uuClass对象的所有可用属性的列表,但未能执行此操作 这个链接显示了你可以在VB中实现它,我想知道在使用JACOB
上面的代码显示我可以询问单个属性,但没有一个好方法可以询问所有属性。以下是您问题的答案。我希望如此,因为我不知道你的问题到底出在哪里。我仍然认为,当询问时,您应该提供代码的一部分,而不是要求回答者编写所有内容 这可能也是我刚刚学到的一个更普遍问题的答案:
如何枚举集合中的所有项,为每个构造实现
?
应该使用
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;
}
}
}
本例中的起点是
GetObject()
vbscript函数。我总是用Jacob开头的CreateObject()
等效项,所以我不知道这是否可行。有一篇关于尝试访问WMI的帖子没有得到回复,我回复了这篇帖子,尽管它已经快一年了。我知道如何访问单个属性,但我想找到一种查询所有可用属性的方法。请将您的代码发布到这里,以便我们了解问题的确切位置。我们可以从那一刻开始,而不是从头开始:)。谢谢。关于GetObject()
。查看Dispatch.cpp
表明,如果activex组件名称包含:
,则它将被视为监视器,并进行CoGetObject
调用。这就是您的代码的工作方式,因此问题必须进一步出现。此代码片段对我没有多大帮助,因为它不是我可以运行并尝试改进的代码。我不知道你是如何得到项的
。这是否适用于Win32\u计算机系统类?我可以要求它为这里定义的属性提供一个枚举器吗?多亏了这一点,我还没有看到任何类似的东西。这不再与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;
}
}
}