使用 J
Posted on使用 J-Interop 在 Java 中调用WMI
我的空间 |邀请 |登录|注册 简单就是最好的,java web 开发,simple 让你化繁为简 !
首页新闻资讯博客论坛Simple市场全面介绍simple3演示simple4演示My Portal
使用 J-Interop 在 Java 中调用WMI 5评/3355阅
发表于: 2011-06-16 07:12
有关**WMI**的小知识
Windows**管理规范(WMI)**.aspx)是微软对来自分布式管理任务组(DMTF)的基于Web的企业管理(WBEM)和通用信息模型 "Common Information Model (computing)")(CIM)标准的实现。WMI用于访问Windows系统、应用、网络、设备等组件,并管理它们。连接到一台机器通过DCOM进行管理。因此,有关DCOM的小知识将有助于本文的理解。你可以到MSDN了解有关WMI的更多细节。
J-Interop
市场上有一些在使用 JAVA 调用 WMI 的好库,包括 J-Interop、JACOB-Project 和 J-Integra。其中,我更喜欢J-Interop,因为它是完全免费和开源的API。它提供了没有任何依赖的纯DCOM桥,完全用Java编写的没有任何JNI代码。
使用**WMI管理Windows**服务
现在,来看一个使用JAVA调用WMI的例子。这个例子利用J-Interop的API使用Win32_Service类解释WMI操作,将启动和停止在这个例子中的窗口服务。
步骤**1:连接到WBEM**服务
下面的代码示例显示了使用J-Interop如何初始化DCOM会话,并连接到远程DCOM服务使。它使用SWbemLocator对象连接到SWbemServices,SWbemServices对象提供对本地或远程计算机WMI的访问,它调用“ConnectServer”方法连接到SWbemServices**。在本例中,提供管理员级别的用户连接到远程计算机。** JISessiondcomSession=JISession.createSession(domainName,userName,password); dcomSession.useSessionSecurity(false); JIComServercomServer=newJIComServer(valueOf("WbemScripting.SWbemLocator"),hostIP,dcomSession); IJIDispatchwbemLocator=(IJIDispatch)narrowObject(comServer.createInstance().queryInterface(IID)); //parameterstoconnecttoWbemScripting.SWbemLocator Object[]params=newObject[]{ newJIString(hostIP),//strServer newJIString(win32_namespace),//strNamespace JIVariant.OPTIONAL_PARAM(),//strUser JIVariant.OPTIONAL_PARAM(),//strPassword JIVariant.OPTIONAL_PARAM(),//strLocale JIVariant.OPTIONAL_PARAM(),//strAuthority newInteger(0),//iSecurityFlags JIVariant.OPTIONAL_PARAM()//objwbemNamedValueSet }; JIVariantresults[]=wbemLocator.callMethodA("ConnectServer",params); IJIDispatchwbemServices=(IJIDispatch)narrowObject(results[0].getObjectAsComObject());
(domainName=远程计算机域名,hostIP=远程计算机IP地址,用户名=管理员级别的用户,密码=密码)
第**2步:获取Win32_Service**实例
一旦你获得对SWbemServices对象的引用,就可以调用这个类的任何方法。其中WbemServices.InstancesOf**方法获得任何Win32类的实例。**
也可以使用WMI查询语言(WQL)达到同样的目的,如下所示: finalintRETURN_IMMEDIATE=0x10; finalintFORWARD_ONLY=0x20; Object[]params=newObject[]{ newJIString("SELECT/*FROMWin32_Service"), JIVariant.OPTIONAL_PARAM(), newJIVariant(newInteger(RETURN_IMMEDIATE+FORWARD_ONLY)) }; JIVariant[]servicesSet=wbemServices.callMethodA("ExecQuery",params); IJIDispatchwbemObjectSet=(IJIDispatch)narrowObject(servicesSet[0].getObjectAsComObject());
第三步:执行方法
现在,已得到Win32_Service类的实例,可采用下述代码来调用同一类的方法,因为,它返回多个服务实例,要列举它们以便获取IJIDispatcher服务。 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()); JIVariant returnStatus = wbemObjectDispatch.callMethodA("StopService"); System.out.println(returnStatus.getObjectAsInt()); }
现在,下面的代码显示了一个使用WMI启动和停止Windows服务的完整Java类。
packagecom.wmi.windows; importstaticorg.jinterop.dcom.core.JIProgId.valueOf; importstaticorg.jinterop.dcom.impls.JIObjectFactory.narrowObject; importstaticorg.jinterop.dcom.impls.automation.IJIDispatch.IID; importjava.util.logging.Level; importorg.jinterop.dcom.common.JIException; importorg.jinterop.dcom.common.JIRuntimeException; importorg.jinterop.dcom.common.JISystem; importorg.jinterop.dcom.core.IJIComObject; importorg.jinterop.dcom.core.JIArray; importorg.jinterop.dcom.core.JIComServer; importorg.jinterop.dcom.core.JISession; importorg.jinterop.dcom.core.JIString; importorg.jinterop.dcom.core.JIVariant; importorg.jinterop.dcom.impls.automation.IJIDispatch; importorg.jinterop.dcom.impls.automation.IJIEnumVariant; publicclassServiceManager{ privatestaticStringdomainName=""; privatestaticStringuserName="administrator"; privatestaticStringpassword=""; privatestaticStringhostIP="127.0.0.1"; privatestaticfinalStringwin32namespace="ROOT\CIMV2"; privatestaticfinalintSTOP_SERVICE=0; privatestaticfinalintSTART_SERVICE=1; privateJISessiondcomSession=null; /// / /@paramargs // publicstaticvoidmain(String[]args){ ServiceManagermanager=newServiceManager(); manager.stopService(domainName,hostIP,userName,password,"MySql");//stopsaservicenamedMySql } /// /Startsagivenserviceifitsstopped. / /@paramdomainName /@paramhostname /@paramusername /@parampassword /@paramserviceName // publicvoidstartService(StringdomainName,Stringhostname,Stringusername,Stringpassword,StringserviceName){ execute(domainName,hostname,username,password,serviceName,START_SERVICE); } /// /Stopsagivenserviceifitsrunning. / /@paramdomainName /@paramhostname /@paramusername /@parampassword /@paramserviceName // publicvoidstopService(StringdomainName,Stringhostname,Stringusername,Stringpassword,StringserviceName){ execute(domainName,hostname,username,password,serviceName,STOP_SERVICE); } /// /Starts/Stopsagivenserviceofremotemachineashostname. / /@paramdomainName /@paramhostname /@paramusername /@parampassword /@paramserviceName /@paramaction // publicvoidexecute(StringdomainName,Stringhostname,Stringusername,Stringpassword,StringserviceName,intaction){ try{ IJIDispatchwbemServices=createCOMServer(); finalintRETURN_IMMEDIATE=0x10; finalintFORWARD_ONLY=0x20; Object[]params=newObject[]{ newJIString("SELECT/*FROMWin32_ServiceWHEREName='"+serviceName+"'"), JIVariant.OPTIONAL_PARAM(), newJIVariant(newInteger(RETURN_IMMEDIATE+FORWARD_ONLY)) }; JIVariant[]servicesSet=wbemServices.callMethodA("ExecQuery",params); IJIDispatchwbemObjectSet=(IJIDispatch)narrowObject(servicesSet[0].getObjectAsComObject()); JIVariantnewEnumvariant=wbemObjectSet.get("_NewEnum"); IJIComObjectenumComObject=newEnumvariant.getObjectAsComObject(); IJIEnumVariantenumVariant=(IJIEnumVariant)narrowObject(enumComObject.queryInterface(IJIEnumVariant.IID)); Object[]elements=enumVariant.next(1); JIArrayaJIArray=(JIArray)elements[0]; JIVariant[]array=(JIVariant[])aJIArray.getArrayInstance(); for(JIVariantvariant:array){ IJIDispatchwbemObjectDispatch=(IJIDispatch)narrowObject(variant.getObjectAsComObject()); //Printobjectastext. JIVariant[]v=wbemObjectDispatch.callMethodA("GetObjectText",newObject[]{1}); System.out.println(v[0].getObjectAsString().getString()); //StartorStoptheservice StringmethodToInvoke=(action==START_SERVICE)?"StartService":"StopService"; JIVariantreturnStatus=wbemObjectDispatch.callMethodA(methodToInvoke); System.out.println("Returnstatus:"+returnStatus.getObjectAsInt());//ifreturncode=0success.Seemsdnformoredetailsaboutthemethod. } }catch(Exceptione){ e.printStackTrace(); }finally{ if(dcomSession!=null){ try{ JISession.destroySession(dcomSession); }catch(Exceptionex){ ex.printStackTrace(); } } } } /// /InitializeDCOMsessionandconnecttoSWBEMserviceongivenhostmachine. /@return /*/ privateIJIDispatchcreateCOMServer(){ JIComServercomServer; try{ JISystem.getLogger().setLevel(Level.WARNING); JISystem.setAutoRegisteration(true); dcomSession=JISession.createSession(domainName,userName,password); dcomSession.useSessionSecurity(false); comServer=newJIComServer(valueOf("WbemScripting.SWbemLocator"),hostIP,dcomSession); IJIDispatchwbemLocator=(IJIDispatch)narrowObject(comServer.createInstance().queryInterface(IID)); //parameterstoconnecttoWbemScripting.SWbemLocator Object[]params=newObject[]{ newJIString(hostIP),//strServer newJIString(win32_namespace),//strNamespace JIVariant.OPTIONAL_PARAM(),//strUser JIVariant.OPTIONAL_PARAM(),//strPassword JIVariant.OPTIONAL_PARAM(),//strLocale JIVariant.OPTIONAL_PARAM(),//strAuthority newInteger(0),//iSecurityFlags JIVariant.OPTIONAL_PARAM()//objwbemNamedValueSet }; JIVariantresults[]=wbemLocator.callMethodA("ConnectServer",params); IJIDispatchwbemServices=(IJIDispatch)narrowObject(results[0].getObjectAsComObject()); returnwbemServices; }catch(JIExceptionjie){ System.out.println(jie.getMessage()); jie.printStackTrace(); }catch(JIRuntimeExceptionjire){ jire.printStackTrace(); }catch(Exceptione){ e.printStackTrace(); }finally{ if(dcomSession!=null){ try{ JISession.destroySession(dcomSession); }catch(JIExceptione){ e.printStackTrace(); } } } returnnull; } }
【原文】http://nikunjp.wordpress.com/ 评论 (共 5 条评论)
匿名 (219.142.23.106), 475天前
j-interop 远程收集WIN7 的eventlog日志怎么不行啊,求助赵老师 回复|支持|反对 匿名 (219.142.23.106), 475天前
匿名 (59.40.119.215), 497天前
xp的开始Remote Register 服务就可以了。 win7还在研究中 回复|支持|反对 匿名 (219.133.0.1), 501天前
win7平台为什么会用不了呢? 我也测试过了,xp的机器可以成功运行。 有些xp的也不行,我觉得可能是有什么配置项没有配置而导致。 回复|支持|反对
匿名 (111.4.219.247), 722天前
我测试报错:The system cannot find the file specified. win7平台。 回复|支持|反对 (共5, 显示全部)/
表情 发表评论
相关主题
JAVA问题定位技术 2/3333
sword, 799天前
Java序列化和克隆 0/1568
书生, 870天前 Java EE6中的装饰器,高级用法 0/1163
赵老师, 733天前
通过 Java 编程处理 XML 服务定义 1/1691
书生, 877天前 解析Java软件开发中的五种认识误区 0/1178
书生, 792天前
Java内省和反射机制三步曲之(2)反射 0/1409
书生, 854天前
simpleframework.net Copyright ©2011 版权所有
Powered by SimpleFramework [ 0.156 s ]
*
- 数据装载中... *