`
t42dw
  • 浏览: 58534 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

使用java调用windows WIN脚本

阅读更多

最近项目有需要使用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/

 

  • 大小: 18.1 KB
分享到:
评论
1 楼 di1984HIT 2014-04-07  
呵呵,一般都是权限问题。

相关推荐

    windows 系统下启动与结束java的jar包的脚本(包括如何设置进程名称)

    ### Windows系统下启动与结束Java的JAR包的脚本(包括如何设置进程名称) 在Windows环境下管理和控制Java应用程序的启动与停止是一项常见的任务。本文将详细介绍如何编写一个批处理脚本来实现这些功能,并且还会...

    java在win下启动bat和在linux下启动shell脚本

    在Windows环境下,`RunScript.java`可能会使用类似`"cmd /c start script.bat"`的命令来启动批处理脚本。而在Linux中,它可能会使用`"/bin/sh script.sh"`这样的命令。在执行这些命令时,可能还需要考虑脚本的路径和...

    windows下java调用ffmpeg视频处理源码

    6. **环境搭建**:配合"windows下java调用ffmpeg视频处理环境搭建",这部分可能包括如何在Windows系统上安装FFmpeg,设置环境变量,以及如何确保Java程序能正确找到并执行FFmpeg的可执行文件。 7. **错误处理和日志...

    Springboot-服务-Windows 一键启动、停止脚本

    2. **检查Java是否已安装**:为了确保Java运行时环境(JRE)的存在,脚本会检查`JAVA_HOME`环境变量,并验证`java.exe`是否可执行。 3. **启动Spring Boot应用**:使用`java -jar`命令来启动Spring Boot的可执行JAR...

    jar包启动脚本与关闭脚本win+linux

    本文将详细介绍如何为Spring Boot应用创建和使用启动及关闭脚本,适用于Windows和Linux操作系统。 首先,我们来看标题提到的"jar包启动脚本"。在Spring Boot项目中,一个可执行的jar文件包含了运行应用所需的所有...

    Windows服务自动重启Java服务

    总之,要在Windows上实现Java服务的自动重启,我们可以利用Java Service Wrapper的内置功能,或者通过编写bat脚本结合Windows任务计划程序来达到目的。无论哪种方式,关键在于正确地监控服务状态并在需要时执行启动...

    Java代码实现调用RapidOCR(基于PaddleOCR),适配Mac、Win、Linux,支持最新PP-OCRv4

    在本文中,我们将深入探讨如何使用Java来调用RapidOCR,这是一个基于PaddleOCR的OCR(光学字符识别)工具,适用于Mac、Windows和Linux操作系统,并且已经更新至支持最新的PP-OCRv4版本。RapidOCR是一款高效、准确的...

    windows脚本教程大全

    5. **Linux Shell脚本**:在Windows环境中,虽然主要使用批处理,但学习Linux Shell脚本(如bash)有助于跨平台工作,理解如何在Linux系统中自动化任务,这对于多系统环境下的开发非常有用。 6. **XML**:XML是一种...

    JAVA实现按键精灵效果

    总的来说,通过JNA和`swt.win32.extension`,Java程序员能够跨越Java和C之间的障碍,实现对操作系统底层功能的调用,比如设置全局键盘钩子,从而构建出能够自动响应键盘事件的工具,比如按键精灵。这在自动化测试、...

    java环境变量一键配置脚本

    在Windows系统中,一键配置脚本可能会使用`setx`命令来永久设置环境变量,例如: ```batch setx JAVA_HOME "C:\Program Files\Java\jdk1.8.0_202" setx PATH "%JAVA_HOME%\bin;%PATH%" ``` 而在Linux或macOS中,它...

    利用Java创建Windows服务

    首先,我们需要了解Java中的`java.util.Service`接口,它并不是用来直接创建Windows服务的,而是用于Java的SPI(Service Provider Interface)机制,允许加载和使用第三方服务。然而,在Windows系统上创建服务,我们...

    java文件对比软件 WinMerge

    9. **命令行接口**:对于自动化任务,WinMerge提供了命令行接口,可以与其他工具或脚本结合使用。 10. **插件支持**:通过安装插件,WinMerge的功能可以得到进一步扩展,例如增强对特定文件类型的处理。 在实际...

    Windows使用bat批处理实现守护进程脚本.bat

    Windows使用bat批处理实现守护进程脚本

    Java实现获取窗口句柄并操作窗口jna-4.4.0

    为了弥补这个不足,开发人员可以使用Java Native Access (JNA),这是一个Java平台上的库,允许Java代码调用本机库函数,与操作系统进行更直接的交互。 JNA是Java与本机代码之间的一个桥梁,它消除了编写C/C++头文件...

    Windows下设置守护进程JAR包挂掉自动重启,bat文件(已完美测试)

    这个bat脚本资源可以在Windows环境下实现Java程序的守护进程和自动重启。它通过一个循环监控Java程序进程,如果检测到程序异常退出,会自动重启程序。同时具有可配置的重启次数和重启间隔时间。 这个小巧但实用的bat...

    清理window电脑、服务器日志bat脚本

    下面将详细介绍如何编写和使用这类脚本,以及如何通过Windows的任务计划程序设置定时任务。 1. **删除n天以前的文件脚本**: 在Windows批处理脚本中,可以使用`FORFILES`命令来选择并操作指定日期之前的文件。例如...

    Win-TC 程序应用

    在使用Win-TC时,首先需要解压缩下载的文件,通常会得到一个名为"WinTc"的文件夹。这个文件夹包含了Win-TC的所有组件和配置文件。进入文件夹后,找到并双击`.EXE`可执行文件,就可以启动Win-TC程序。初次运行,可能...

    最新版本 JEnv-for-Windows, java多版本管理

    JEnv-for-Windows 是一个针对Windows系统的Java版本管理工具,类似于Linux上的JEnv工具。它旨在帮助用户在本地系统上方便地切换多个Java Development Kit (JDK) 版本。JEnv-for-Windows的工作原理和特性主要包括: ...

    windos上java操作的东西hadoop2.9.0 win32 64

    总之,Windows上使用Java和Hadoop 2.9.0涉及安装Java、配置Hadoop、启动服务以及编写和运行MapReduce程序等多个环节。这个过程需要对Java编程和分布式系统有一定的理解,但一旦配置成功,就能在本地环境中进行大数据...

Global site tag (gtag.js) - Google Analytics