问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java j-interop 怎么调用wmi

发布网友 发布时间:2022-05-19 22:39

我来回答

1个回答

热心网友 时间:2023-10-19 10:01

有关WMI的小知识
Windows管理规范(WMI)是微软对来自分布式管理任务组(DMTF)的基于Web的企业管理(WBEM)和通用信息模型(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";
privatestaticfinalStringwin32_namespace="ROOT\\CIMV2";

privatestaticfinalintSTOP_SERVICE=0;
privatestaticfinalintSTART_SERVICE=1;

privateJISessiondcomSession=null;

publicstaticvoidmain(String[]args){
ServiceManagermanager=newServiceManager();
manager.stopService(domainName,hostIP,userName,password,"MySql");//stopsaservicenamedMySql
}

publicvoidstartService(StringdomainName,Stringhostname,Stringusername,Stringpassword,StringserviceName){
execute(domainName,hostname,username,password,serviceName,START_SERVICE);
}

publicvoidstopService(StringdomainName,Stringhostname,Stringusername,Stringpassword,StringserviceName){
execute(domainName,hostname,username,password,serviceName,STOP_SERVICE);
}

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});
java j-interop 怎么调用wmi

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....

java 调用python java怎么调用类方法 java怎么调用另一个类的方法 java调用python脚本 js调用java java调用类 java子类调用父类方法 java函数调用 java方法调用过程
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
求好看的重生文,不要重生回到以前的,女主性格不能软弱无能,不能太... 求双洁的娱乐圈小说(男女主或攻受一定要都身心干净,并且要重生的 )可 ... ...文笔一定要好 重生娱乐圈什么的都无所谓 一定要是婚后的! 浙江高考成绩理科专科排名查询怎么查啊,最好给网站谢谢 各高校是怎么依照高考成绩录取 四不像是什么样的动物 孔家后人为什么要把“四不像”刻在孔府内的照壁上? 中国龙和外国龙的区别西方龙的区别 山东省烟台市高新技术产业开发区的车牌号是什么? 电脑重装系统按个键-(电脑重装系统按个键没反应) 图书馆一个五层书架共放了两百本书每相邻两层中下层书比上层书多10本.那么,最下层有多少本? 读书角和图书角的区别 为什么笔记本反应越来越慢? 农商银行,一年的最后一天本金没还够算逾期吗? 支付宝蚂蚁借呗借钱逾期了,上面显示未还本金有3000,逾期总额有2000, 没还款和逾期有什么区别 贷款18万一个月没还本金和利息会有什么事 问一下:银监局规定信用卡逾期3个月后在还款应该先抵扣本金再抵扣利息那这个本金是什么意思?这个本金指 公积金中 逾期本金 什么意思(我每月按时还款,怎还有所谓的“逾期本金”呢 ) 为啥不买精装修三恒系统的蔚蓝 新鲜的带泥土蛏子怎么保存 最终幻想系列电影怎么样啊? 最终幻想怎么样? 最终幻想Ⅵ的游戏评测 最终幻想15圣王之杖怎么样 FF15圣王之杖位置 最终幻想哪个职业好 各职业分析评测推荐 真的大家觉得ff15怎么样 最终幻想15 steam版怎么样 最终幻想15就目前而言 剧情到底怎么样 最终幻想15感觉怎么样? Java:为什么j=j++后,j等于0呢? java : int j=0; j=++j + j++ + j++ + j++;结果是:7.求解释!!! 国际私法和国际公法研究生论文哪个好写? 有关国际法的论文1500字 推荐一个比较新颖好写的国际法硕士论文题目 国际法方向的硕士毕业论文,求帮助。尼玛,导师*,三次了不让过。要崩溃了 需要写一篇国际法的论文,哪个论题比较新颖 ,容易上手? 国际法硕士论文题目有什么吗,不要别人写过的 国际法毕业论文,关于国际环境保护相关条约的可以写吗? 有关海外并购的相关法律问题研究 已有很多论文了 现在国际法研究生毕业写这方面的论文还有突破吗? 急求国际法方面的论文大纲! 国际法毕业论文 国际法有什么好的方向可以写论文 需要写一篇关于国际法方面的论文,什么论题立意新颖,容易上手? 国际法毕业论文论国家主权与国际人权的辩证关系怎么写 国际法的十个重要组成概念是哪十个?本人要写一篇关于“国际法的十个概念”为主题的论文 国际法论文摘要英文翻译,急用!! 求国际法论文春风得意马蹄疾拜托各位大神 求论文 当代国际法上的国家主权原则 install app是什么意思