使用 J-Interop 在 Java 中调用WMI

关注 (1)
博客?赵老师?显示全文
使用 J-Interop 在 Java 中调用WMI
1评/817阅
发表于:2011-06-16 07:12

有关WMI的小知识

Windows管理规范(WMI)是微软对来自分布式管理任务组DMTF)的基于Web的企业管理(WBEM)和通用信息模型(CIM)标准的实现。WMI用于访问Windows系统、应用、网络、设备等组件,并管理它们。连接到一台机器通过DCOM进行管理。因此,有关DCOM的小知识将有助于本文的理解。你可以到MSDN了解有关WMI的更多细节。

J-Interop

市场上有一些在使用 JAVA 调用 WMI的好库,包括 J-InteropJACOB-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对象连接到SWbemServicesSWbemServices对象提供对本地或远程计算机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});
      

转载于:https://www.cnblogs.com/leeeee/p/7276730.html

好的,我可以举一个简单的例子来说明。假设你正在开发一个 Flutter 应用程序,需要使用一个 Python 库来进行数据处理。你可以使用 dart-py-interop 插件来实现这个功能。 首先,你需要在你的 Flutter 项目添加 dart-py-interop 插件的依赖,可以在 `pubspec.yaml` 文件添加以下代码: ``` dependencies: dart_py_interop: ^0.1.0 ``` 然后,你需要创建一个 Python 脚本,使用你需要的 Python 库来处理数据。例如,假设你需要使用 Pandas 库来处理一个 CSV 文件,你可以编写以下 Python 脚本: ```python import pandas as pd def process_csv(file_path): data = pd.read_csv(file_path) # 对数据进行处理 return processed_data ``` 接下来,你需要在 Flutter 代码调用这个 Python 脚本。你可以使用 dart-py-interop 插件提供的 `PythonInterop` 类来实现这个功能。例如,你可以编写以下代码: ```dart import 'package:dart_py_interop/dart_py_interop.dart'; Future<List<dynamic>> processCsv(String filePath) async { final python = PythonInterop(); await python.loadModuleFromScript('process_csv', 'process_csv.py'); final result = await python.callFunction( 'process_csv', arguments: [filePath], ); python.dispose(); return result; } ``` 在这个代码,我们使用 `PythonInterop` 类加载了一个名为 `process_csv` 的 Python 模块,并且调用了它的 `process_csv` 函数,并将 `filePath` 参数传递给它。最后,我们返回从 Python 返回的结果。 使用 dart-py-interop 插件,你可以轻松地在 Flutter 应用程序调用 Python 代码,实现更加复杂的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值