您当前的位置:首页 > 互联网教程

java j-interop 怎么调用wmi

发布时间:2025-05-21 16:33:30    发布人:远客网络

java j-interop 怎么调用wmi

一、java j-interop 怎么调用wmi

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

市场上有一些在使用 JAVA调用 WMI的好库,包括 J-Interop、JACOB-Project和 J-Integra。其中,我更喜欢J-Interop,因为它是完全免费和开源的API。它提供了没有任何依赖的纯DCOM桥,完全用Java编写的没有任何JNI代码。

现在,来看一个使用JAVA调用WMI的例子。这个例子利用J-Interop的API使用Win32_Service类解释WMI操作,将启动和停止在这个例子中的窗口服务。

下面的代码示例显示了使用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

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地址,用户名=管理员级别的用户,密码=密码)

一旦你获得对SWbemServices对象的引用,就可以调用这个类的任何方法。其中WbemServices.InstancesOf方法获得任何Win32类的实例。

也可以使用WMI查询语言(WQL)达到同样的目的,如下所示:

finalintRETURN_IMMEDIATE=0x10;

newJIString("SELECT*FROMWin32_Service"),

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类。

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;

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){

IJIDispatchwbemServices=createCOMServer();

finalintRETURN_IMMEDIATE=0x10;

newJIString("SELECT*FROMWin32_ServiceWHEREName='"+serviceName+"'"),

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();

IJIDispatchwbemObjectDispatch=(IJIDispatch)narrowObject(variant.getObjectAsComObject());

JIVariant[]v=wbemObjectDispatch.callMethodA("GetObjectText_",newObject[]{1});

二、java生成word文档的问题

Jacob解决Word文档的读写问题收藏

Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。Jacob下载的地址为:

(1)将解压包中的jacob.dll(x86常用,x64)拷到jdk安装目录下的jre\bin文件夹或windows安装路径下的WINDOWS\system32文件夹下

(2)将jacob.jar文件拷到classpath下即可

对于”java.lang.UnsatisfiedLinkError: C:\WINDOWS\system32\jacob-1.14.3-x86.dll:由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正”这个问题,可以通过

重新下载Jacob的jar及dll文件(最好版本比现在的低,如1.11)解决

实例制作(主要功能:标题制作,表格制作,合并表格,替换文本,页眉页脚,书签处理):

import com.jacob.activeX.ActiveXComponent;

import com.jacob.com.Dispatch;

public static void main(String args[]){

ActiveXComponent wordApp= new ActiveXComponent("Word.Application");//启动word

// Set the visible property as required.

Dispatch.put(wordApp,"Visible", new Variant(true));////设置word可见

Dispatch docs= wordApp.getProperty("Documents").toDispatch();

// String inFile="d:\\test.doc";

// Dispatch doc= Dispatch.invoke(docs,"Open", Dispatch.Method,

// new Object[]{ inFile, new Variant(false), new Variant(false)},//参数3,false:可写,true:只读

// new int[1]).toDispatch();//打开文档

Dispatch document= Dispatch.call(docs,"Add").toDispatch();// create new document

String userName= wordApp.getPropertyAsString("Username");//显示用户信息

System.out.println("用户名:"+ userName);

//文档对齐,字体设置////////////////////////

Dispatch selection= Dispatch.get(wordApp,"Selection").toDispatch();

Dispatch align= Dispatch.get(selection,"ParagraphFormat")

.toDispatch();//行列格式化需要的对象

Dispatch font= Dispatch.get(selection,"Font").toDispatch();//字型格式化需要的对象

//标题处理////////////////////////

Dispatch.put(align,"Alignment","1");// 1:置中 2:靠右 3:靠左

Dispatch.put(font,"Bold","1");//字型租体

Dispatch.put(font,"Color","1,0,0,0");//字型颜色红色

Dispatch.call(selection,"TypeText","Word文档处理");//写入标题内容

Dispatch.call(selection,"TypeParagraph");//空一行段落

Dispatch.put(align,"Alignment","3");// 1:置中 2:靠右 3:靠左

Dispatch.put(selection,"Text","");

Dispatch.call(selection,"MoveDown");//光标标往下一行

//表格处理////////////////////////

Dispatch tables= Dispatch.get(document,"Tables").toDispatch();

Dispatch range= Dispatch.get(selection,"Range").toDispatch();

Dispatch table1= Dispatch.call(tables,"Add", range, new Variant(3),

new Variant(2), new Variant(1)).toDispatch();//设置行数,列数,表格外框宽度

Variant tableAmount= Dispatch.get(tables,"count");

System.out.println(tableAmount);

Dispatch t1= Dispatch.call(tables,"Item", new Variant(1))

Dispatch t1_row= Dispatch.get(t1,"rows").toDispatch();//所有行

int t1_rowNum= Dispatch.get(t1_row,"count").getInt();

Dispatch.call(Dispatch.get(t1,"columns").toDispatch(),"AutoFit");//自动调整

int t1_colNum= Dispatch.get(Dispatch.get(t1,"columns").toDispatch(),

System.out.println(t1_rowNum+""+ t1_colNum);

for(int i= 1; i<= t1_rowNum; i++){

for(int j= 1; j<= t1_colNum; j++){

Dispatch cell= Dispatch.call(t1,"Cell", new Variant(i),

new Variant(j)).toDispatch();//行,列

Dispatch.call(cell,"Select");

Dispatch.put(selection,"Text","cell"+ i+ j);//写入word的内容

Dispatch.put(font,"Bold","0");//字型租体(1:租体 0:取消租体)

Dispatch.put(font,"Color","1,1,1,0");//字型颜色

Dispatch.put(font,"Italic","1");//斜体 1:斜体 0:取消斜体

Dispatch.put(font,"Underline","1");//下划线

Dispatch Range= Dispatch.get(cell,"Range").toDispatch();

String cellContent= Dispatch.get(Range,"Text").toString();

System.out.println((cellContent.substring(0, cellContent

Dispatch.call(selection,"MoveDown");//光标往下一行(才不会输入盖过上一输入位置)

//合并单元格////////////////////////

Dispatch.put(selection,"Text","");

Dispatch.call(selection,"MoveDown");//光标标往下一行

Dispatch range2= Dispatch.get(selection,"Range").toDispatch();

Dispatch table2= Dispatch.call(tables,"Add", range2, new Variant(8),

new Variant(4), new Variant(1)).toDispatch();//设置行数,列数,表格外框宽度

Dispatch t2= Dispatch.call(tables,"Item", new Variant(2))

Dispatch beginCell= Dispatch.call(t2,"Cell", new Variant(1),

new Variant(1)).toDispatch();

Dispatch endCell= Dispatch.call(t2,"Cell", new Variant(4),

new Variant(4)).toDispatch();

Dispatch.call(beginCell,"Merge", endCell);

for(int row= 1; row<= Dispatch.get(

Dispatch.get(t2,"rows").toDispatch(),"count").getInt(); row++){

for(int col= 1; col<= Dispatch.get(

Dispatch.get(t2,"columns").toDispatch(),"count").getInt(); col++){

Dispatch cell= Dispatch.call(t2,"Cell", new Variant(1),

new Variant(1)).toDispatch();//行,列

Dispatch.call(cell,"Select");

Dispatch.put(font,"Color","1,1,1,0");//字型颜色

Dispatch.put(selection,"Text","merge Cell!");

Dispatch cell= Dispatch.call(t2,"Cell", new Variant(row),

new Variant(col)).toDispatch();//行,列

Dispatch.call(cell,"Select");

Dispatch.put(font,"Color","1,1,1,0");//字型颜色

Dispatch.put(selection,"Text","cell"+ row+ col);

Dispatch.call(selection,"MoveDown");

//Dispatch.call(selection,"MoveRight", new Variant(1), new Variant(1));//取消选择

// Object content= Dispatch.get(doc,"Content").toDispatch();

// Word文档内容查找及替换////////////////////////

Dispatch.call(selection,"TypeParagraph");//空一行段落

Dispatch.put(align,"Alignment","3");// 1:置中 2:靠右 3:靠左

Dispatch.put(font,"Color", 0);

Dispatch.put(selection,"Text","欢迎,Hello,world!");

Dispatch.call(selection,"HomeKey", new Variant(6));//移到开头

Dispatch find= Dispatch.call(selection,"Find").toDispatch();//获得Find组件

Dispatch.put(find,"Text","hello");//查找字符串"hello"

Dispatch.put(find,"Forward","True");//向前查找

// Dispatch.put(find,"Format","True");//设置格式

Dispatch.put(find,"MatchCase","false");//大小写匹配

Dispatch.put(find,"MatchWholeWord","True");//全字匹配

Dispatch.call(find,"Execute");//执行查询

Dispatch.put(selection,"Text","你好");//替换为"你好"

//使用方法传入的参数parameter调用word文档中的MyWordMacro宏//

//Dispatch.call(document,macroName,parameter);

//Dispatch.invoke(document,macroName,Dispatch.Method,parameter,new int[1]);

//页眉,页脚处理////////////////////////

Dispatch ActiveWindow= wordApp.getProperty("ActiveWindow")

Dispatch ActivePane= Dispatch.get(ActiveWindow,"ActivePane")

Dispatch View= Dispatch.get(ActivePane,"View").toDispatch();

Dispatch.put(View,"SeekView","9");//9是设置页眉

Dispatch.put(align,"Alignment","1");//置中

Dispatch.put(selection,"Text","这里是页眉");//初始化时间

Dispatch.put(View,"SeekView","10");// 10是设置页脚

Dispatch.put(align,"Alignment","2");//靠右

Dispatch.put(selection,"Text","这里是页脚");//初始化从1开始

//书签处理(打开文档时处理)////////////////////////

//Dispatch activeDocument= wordApp.getProperty("ActiveDocument").toDispatch();

Dispatch bookMarks= Dispatch.call(document,"Bookmarks").toDispatch();

boolean isExist= Dispatch.call(bookMarks,"Exists","bookMark1")

Dispatch rangeItem1= Dispatch.call(bookMarks,"Item","bookMark1")

Dispatch range1= Dispatch.call(rangeItem1,"Range").toDispatch();

Dispatch.put(range1,"Text", new Variant("当前是书签1的文本信息!"));

String bookMark1Value= Dispatch.get(range1,"Text").toString();

System.out.println(bookMark1Value);

System.out.println("当前书签不存在,重新建立!");

Dispatch.call(bookMarks,"Add","bookMark1", selection);

Dispatch rangeItem1= Dispatch.call(bookMarks,"Item","bookMark1")

Dispatch range1= Dispatch.call(rangeItem1,"Range").toDispatch();

Dispatch.put(range1,"Text", new Variant("当前是书签1的文本信息!"));

String bookMark1Value= Dispatch.get(range1,"Text").toString();

System.out.println(bookMark1Value);

//保存操作////////////////////////

Dispatch.call(document,"SaveAs","D:/wordOperate.doc");

//Dispatch.invoke((Dispatch) doc,"SaveAs", Dispatch.Method, new Object[]{htmlPath, new Variant(8)}, new int[1]);//生成html文件

//Dispatch.call(document,"Close", new Variant(0));

//// worddoc.olefunction("protect",2,true,"");

//// Dispatch bookMarks= wordApp.call(docs,"Bookmarks").toDispatch();

//// System.out.println("bookmarks"+bookMarks.getProgramId());

////Dispatch.call(doc,"Save");//保存

//// Dispatch.call(doc,"Close", new Variant(true));

////wordApp.invoke("Quit",new Variant[]{});

// wordApp.safeRelease();//Finalizers call this method

三、java中的private到底有什么用

1、private直接翻译过来为私有的,但在Java中它的含义并不是私有的。而是本类中可用的,表面上是说只有本类中可以使用(更改)该变量或者方法。

2、但他还有一个含义为:只要在我这个类的范围内部(括号内)即可使用,他不关心使用者是谁,是他自己或者别的类中的实例(例如通过this使用)。只要你在我的类里面用就行了。所以private应该理解为本类中可使用的,而非是本类私有的。

3、将属性和方法用private封装后表示,被封装的属性与方法只能在本类中使用,类外部不可见。

4、此时要想访问被封装的属性,必须提供getter与setter方法

5、setter方法:主要进行属性内容的设置与修改

6、getter方法:主要进行属性内容的取得

7、类的设计原则:编写类的时候,没有额外说明,所有属性必须使用private封装(成员变量)

8、private不能用于外部类的封装,但是可以用于内部类的封装

9、Private变量只能在包含其声明的模块中使用。可以使用 Private语句声明变量的数据类型。例如,下面的语句声明了一个 Integer类型的变量:“Private NumberOfEmployees As Integer”也可以使用 Private语句来声明变量的对象类型。

10、实例声明一个变量,Private X As New Worksheet如果在定义对象变量时没有使用 New关键字,则在使用该变量之前,必须使用 Set语句将一个已有的对象赋给该引用对象的变量。

11、在赋值之前,所声明的这个对象变量有一个特定值 Nothing,这个值表示该变量没有指向任何对象的实例。可以用带空圆括号的 Private语句来声明动态数组,然后可以在过程内用 ReDim语句来定义该数组的维数和元素。

12、如果试图在 Private,Public或 Dim语句中重新定义一个已显式定义了大小的数组的维数,就会发生错误。当初始化变量时,数值变量被初始化为 0,变长的字符串被初始化为一个零长度的字符串(""),而定长的字符串则用 0填充。

13、Variant变量被初始化为 Empty,用户自定义类型的变量的每个元素作为各自独立的变量进行初始化。注意当在过程中使用 Private语句时,通常将 Private语句放在过程的开始。

14、参考资料:百度百科- Private(编程语句)

15、百度百科- Java(计算机编程语言)