最近项目有需要使用java 调用windows WMI脚本,由于对windows了解不是很深感觉还是蛮新鲜的,经过在网上的搜索最终确定使用j-Interop这个纯java方式的开源框架(非纯java的还有com4j之类的),j-interop这东东在国内站上的资料很少再加上本人英文很水浏览英文很吃力所以在查找相关资料时还是费了不少精力的,这里把自己的一些成果拿出来跟大家分享分享也算是为国内网站补补这方面的资料。
首先介绍一下j-interop
官网:http://www.j-interop.org/index.html
这里我只简单描述一下,具体还是去官网上看简介吧:
j-interop是纯java方式操作windows com组件的一个开源库,它可以操作word,excel,sqlserver和windows 的内部组件(注册表,WMI),我想喜欢黑客的兄弟对这个一定感兴趣。
终于要入正题,该示例展示了!
示例1:展示得到CPU信息
1.在写java代码之前我们需要知道在windows下怎样使用VBScript 调用WMI
strComputer = "." '计算机的名称,.代表本机 strClass = "Win32_Processor" Set wbemServices = Getobject("winmgmts:\\" & strComputer) '1.连接到 WMI 服务 Set obj=wbemServices.InstancesOf(strClass) '2.检索 WMI 托管资源的实例 WScript.Echo "---------------------------" For Each objService In obj WScript.Echo objService.GetObjectText_ '3.显示 WMI 托管资源的属性 Next
新建文本文件将脚本COPY到文本中,再将后缀更改为“.vbs”。你可以双击运行不过我推荐打开CMD找到文本存放的位置输入命令"cscript XX.vbs" 如图:
2.相应java代码
public static void main(String[] args) {
String address="127.0.0.1";
JISession session=null;
try{
JISystem.getLogger().setLevel(Level.ALL);
JISystem.setInBuiltLogHandler(false);
JISystem.setAutoRegisteration(true);
/** 1.连接到 WMI 服务 * */
session = JISession.createSession("域名","用户名","密码");
session.useSessionSecurity(true);
session.setGlobalSocketTimeout(5000); // session超时时间
JIComServer server = new JIComServer(JIProgId
.valueOf("WbemScripting.SWbemLocator"), address, session);
IJIDispatch dispatch = (IJIDispatch) JIObjectFactory.narrowObject(server.createInstance()
.queryInterface(IJIDispatch.IID));
// params数组对应的 WMI对象方法参数,JIVariant.OPTIONAL_PARAM()代表可选参数
Object[] params = new Object[] {
new JIString(address),
new JIString("ROOT\\CIMV2"),
JIVariant.OPTIONAL_PARAM(),
JIVariant.OPTIONAL_PARAM(),
JIVariant.OPTIONAL_PARAM(),
JIVariant.OPTIONAL_PARAM(),
new Integer(0), JIVariant.OPTIONAL_PARAM() };
JIVariant[] results = dispatch.callMethodA("ConnectServer", params);
IJIDispatch wbemServices = (IJIDispatch) JIObjectFactory
.narrowObject(results[0].getObjectAsComObject());
/** 2.检索 WMI 托管资源的实例* */
JIVariant[] results2= wbemServices.callMethodA("InstancesOf", new Object[] {
new JIString("Win32_Processor"), new Integer(0), JIVariant.OPTIONAL_PARAM()
});
IJIDispatch wbemObjectSet_dispatch = (IJIDispatch)JIObjectFactory.narrowObject(results2[0].getObjectAsComObject());
/** 3.显示 WMI 托管资源的属性,得到_NewEnum属性迭代元素* */
JIVariant variant_enu = wbemObjectSet_dispatch.get("_NewEnum");
IJIComObject enumComObject = variant_enu.getObjectAsComObject();
IJIEnumVariant enumVariant = (IJIEnumVariant) JIObjectFactory
.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) JIObjectFactory
.narrowObject(variant.getObjectAsComObject());
JIVariant[] v = wbemObjectDispatch.callMethodA(
"GetObjectText_", new Object[] { 1 });
System.out.println(v[0].getObjectAsString().getString());
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (JIException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
JISession.destroySession(session);
} catch (JIException e) {
e.printStackTrace();
}
}
}
以上java代码对于不了解wmi的朋友来说可能有些难懂所以建议先去下面地址了解一下wmi
http://msdn.microsoft.com/zh-cn/library/ms974579.aspx
上面java代码要是无法运行,需要先照如下地址配制一下DCOM(记得看下系统版本)
http://j-integra.intrinsyc.com/support/com/doc/remoteaccess.html
这里还要特别说明下以上代码在公司电脑上是没有问题的,不过在我自己的电脑上没有运行成功。我想可能是域名的关系在我自己电脑上是没有域名的我也不知道如何设置.....如有大侠在本机上运行成功还请指教。
很郁闷的是项目最终没有使用该库,所以我对该库的了解也只有这么一点点!本来还有查询共享目录的例子想和大家分享不过由于公司限制弄不上来,这次先不上等过几天有机会补上!小弟第一次发贴有什么不对还请指教
下面是个英文网站的例子:
http://jeanmichel.guillaume.free.fr/index.php/wmi-wbem-microsoft-hyper-v/