文档章节

100%纯java调用windows的wmi获取监控数据

石海龙
 石海龙
发布于 2012/08/16 23:35
字数 1876
阅读 948
收藏 2

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

纯java主要体现在可以跨平台调用com。所用的是j-Interop,它是100%纯java实现的com的调用

1、环境准备

a、windows要开启Remote Registry与Windows Management Instrumentation服务

b、修改安全策略

我系统是英文的,如果是中文系统,翻译为中文,相对应的查找并修改。

Administrative Tools>Local Security Policy>Local Policy>Security Policy>Network access: Sharing and security model for local accounts

修改为Classic(经典)

c、禁用放火墙

d、window2008系统注册表越狱(高版本的win)

需要修改regedit中HKEY_CLASSES_ROOT\CLSID\{76A64158-CB41-11D1-8B02-00600806D9B6}的权限,windows2008不再给Administrators完全控制权。

下载SetACL.exe,下载地址:http://files.helgeklein.com/downloads/SetACL/current/SetACL%20(executable%20version).zip

set_wmi_reg_acl.cmd

1 SetACL.exe -on "HKEY_CLASSES_ROOT\CLSID\{76A64158-CB41-11D1-8B02-00600806D9B6}" -ot reg -actn setowner -ownr "n:Administrators"
2 SetACL.exe -on "HKEY_CLASSES_ROOT\CLSID\{76A64158-CB41-11D1-8B02-00600806D9B6}" -ot reg -actn ace -ace "n:Administrators;p:full"

以超级管理员身份执行这个cms,就会把owner与完全控制权限授予Administrators组


2、程序代码

java类
001 package org.noah.wmitest;
002
003 import org.jinterop.dcom.common.JIException;
004 import org.jinterop.dcom.common.JISystem;
005 import org.jinterop.dcom.core.*;
006 import org.jinterop.dcom.impls.JIObjectFactory;
007 import org.jinterop.dcom.impls.automation.IJIDispatch;
008 import org.jinterop.dcom.impls.automation.IJIEnumVariant;
009 import org.slf4j.Logger;
010 import org.slf4j.LoggerFactory;
011
012 import java.net.UnknownHostException;
013 import java.util.logging.Level;
014
015 /**
016 * Created with IntelliJ IDEA.
017 * User: noah
018 * Date: 8/16/12
019 * Time: 8:00 AM
020 * To change this template use File | Settings | File Templates.
021 */
022 public class WmiService {
023
024 private JIComServer m_ComStub = null;
025 private IJIComObject m_ComObject = null;
026 private IJIDispatch m_Dispatch = null;
027 private String m_Address = null;
028 private JISession m_Session = null;
029 private IJIDispatch m_WbemServices = null;
030
031 private static final String WMI_CLSID = "76A6415B-CB41-11d1-8B02-00600806D9B6";
032 private static final String WMI_PROGID = "WbemScripting.SWbemLocator";
033
034 private Logger logger = LoggerFactory.getLogger(this.getClass());
035
036
037 public WmiService(String address) {
038 JISystem.setAutoRegisteration(true);
039 JISystem.getLogger().setLevel(Level.WARNING);
040 m_Address = address;
041 }
042
043 public void query(String strQuery) {
044
045 System.out.println("query:" + strQuery);
046
047 JIVariant results[] = new JIVariant[0];
048 try {
049 results = m_WbemServices.callMethodA("ExecQuery", new Object[]{new JIString(strQuery), JIVariant.OPTIONAL_PARAM(), JIVariant.OPTIONAL_PARAM(), JIVariant.OPTIONAL_PARAM()});
050 IJIDispatch wOSd = (IJIDispatch) JIObjectFactory.narrowObject((results[0]).getObjectAsComObject());
051
052 int count = wOSd.get("Count").getObjectAsInt();
053
054 IJIComObject enumComObject = wOSd.get("_NewEnum").getObjectAsComObject();
055 IJIEnumVariant enumVariant = (IJIEnumVariant) JIObjectFactory.narrowObject(enumComObject.queryInterface(IJIEnumVariant.IID));
056
057 IJIDispatch wbemObject_dispatch = null;
058
059 for (int c = 0; c < count; c++) {
060
061 Object[] values = enumVariant.next(1);
062 JIArray array = (JIArray) values[0];
063 Object[] arrayObj = (Object[]) array.getArrayInstance();
064 for (int j = 0; j < arrayObj.length; j++) {
065 wbemObject_dispatch = (IJIDispatch) JIObjectFactory.narrowObject(((JIVariant) arrayObj[j]).getObjectAsComObject());
066 }
067
068 String str = (wbemObject_dispatch.callMethodA("GetObjectText_", new Object[]{1}))[0].getObjectAsString2();
069 System.out.println("(" + c + "):");
070 System.out.println(str);
071 System.out.println();
072 }
073
074
075 } catch (JIException e) {
076 e.printStackTrace();
077 }
078 }
079
080 public void connect(final String domain, final String username, final String password) {
081 try {
082
083 m_Session = JISession.createSession(domain, username, password);
084 m_Session.useSessionSecurity(true);
085 m_Session.setGlobalSocketTimeout(5000);
086
087 m_ComStub = new JIComServer(JIProgId.valueOf(WMI_PROGID), m_Address, m_Session);
088
089 IJIComObject unknown = m_ComStub.createInstance();
090 m_ComObject = unknown.queryInterface(WMI_CLSID);
091
092 m_Dispatch = (IJIDispatch) JIObjectFactory.narrowObject(m_ComObject.queryInterface(IJIDispatch.IID));
093 JIVariant results[] = m_Dispatch.callMethodA(
094 "ConnectServer",
095 new Object[]{
096 new JIString(m_Address),
097 JIVariant.OPTIONAL_PARAM(),
098 JIVariant.OPTIONAL_PARAM(),
099 JIVariant.OPTIONAL_PARAM(),
100 JIVariant.OPTIONAL_PARAM(),
101 JIVariant.OPTIONAL_PARAM(),
102 0,
103 JIVariant.OPTIONAL_PARAM()
104 }
105 );
106
107 m_WbemServices = (IJIDispatch) JIObjectFactory.narrowObject((results[0]).getObjectAsComObject());
108
109 } catch (JIException e) {
110 e.printStackTrace();
111 if (m_Session != null) {
112 try {
113 JISession.destroySession(m_Session);
114 } catch (JIException e1) {
115 logger.error(e.getMessage(), e);
116 }
117 }
118 } catch (UnknownHostException e) {
119 if (m_Session != null) {
120 try {
121 JISession.destroySession(m_Session);
122 } catch (JIException e1) {
123 logger.error(e.getMessage(), e);
124 }
125 }
126 }
127 }
128
129 public void disconnect() {
130 try {
131 JISession.destroySession(m_Session);
132 } catch (JIException e) {
133 logger.error(e.getMessage(), e);
134 }
135 }
136
137
138 public static void main(String[] args) {
139
140 WmiService wmiService = new WmiService("172.16.158.129");
141
142 //域(一般为空字符),用户名,密码
143 wmiService.connect("", "username", "password");
144
145 //系统信息
146 wmiService.query("SELECT * FROM Win32_ComputerSystem");
147
148 //CPU信息
149 wmiService.query("SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name != '_Total'");
150
151 //内存信息
152 wmiService.query("SELECT * FROM Win32_PerfFormattedData_PerfOS_Memory");
153
154 //磁盘信息
155 wmiService.query("SELECT * FROM Win32_PerfRawData_PerfDisk_PhysicalDisk Where Name != '_Total'");
156
157 wmiService.disconnect();
158 }
159 }

mavne配置(pom.xml)
01 <?xml version="1.0" encoding="UTF-8"?>
02 <project xmlns="http://maven.apache.org/POM/4.0.0"
03 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
04 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
05 <modelVersion>4.0.0</modelVersion>
06
07 <groupId>org.noahx</groupId>
08 <artifactId>wmi-test</artifactId>
09 <version>1.0</version>
10
11
12 <dependencies>
13
14 <dependency>
15 <groupId>org.kohsuke.jinterop</groupId>
16 <artifactId>j-interop</artifactId>
17 <version>2.0.8-kohsuke-1</version>
18 </dependency>
19
20 <dependency>
21 <groupId>org.slf4j</groupId>
22 <artifactId>slf4j-log4j12</artifactId>
23 <version>1.6.4</version>
24 </dependency>
25
26 </dependencies>
27
28 </project>

运行结果
001 query:SELECT * FROM Win32_ComputerSystem
002 (0):
003
004 instance of Win32_ComputerSystem
005 {
006 AdminPasswordStatus = 1;
007 AutomaticResetBootOption = FALSE;
008 AutomaticResetCapability = TRUE;
009 BootOptionOnLimit = 3;
010 BootOptionOnWatchDog = 3;
011 BootROMSupported = TRUE;
012 BootupState = "Normal boot";
013 Caption = "NAK-E1A7C21EA3C";
014 ChassisBootupState = 3;
015 CreationClassName = "Win32_ComputerSystem";
016 CurrentTimeZone = 480;
017 Description = "AT/AT COMPATIBLE";
018 Domain = "WORKGROUP";
019 DomainRole = 0;
020 EnableDaylightSavingsTime = TRUE;
021 FrontPanelResetStatus = 3;
022 InfraredSupported = FALSE;
023 KeyboardPasswordStatus = 3;
024 Manufacturer = "VMware, Inc.";
025 Model = "VMware Virtual Platform";
026 Name = "NAK-E1A7C21EA3C";
027 NetworkServerModeEnabled = TRUE;
028 NumberOfLogicalProcessors = 2;
029 NumberOfProcessors = 1;
030 OEMStringArray = {"[MS_VM_CERT/SHA1/27d66596a61c48dd3dc7216fd715126e33f59ae7]", "Welcome to the Virtual Machine"};
031 PartOfDomain = FALSE;
032 PauseAfterReset = "3932100000";
033 PowerOnPasswordStatus = 0;
034 PowerState = 0;
035 PowerSupplyState = 3;
036 PrimaryOwnerName = "nak";
037 ResetCapability = 1;
038 ResetCount = -1;
039 ResetLimit = -1;
040 Roles = {"LM_Workstation", "LM_Server", "NT", "Potential_Browser", "Master_Browser"};
041 Status = "OK";
042 SystemStartupDelay = 0;
043 SystemStartupOptions = {"\"Microsoft Windows XP Professional\" /noexecute=optin /fastdetect"};
044 SystemStartupSetting = 0;
045 SystemType = "X86-based PC";
046 ThermalState = 3;
047 TotalPhysicalMemory = "1610063872";
048 UserName = "NAK-E1A7C21EA3C\\a";
049 WakeUpType = 6;
050 };
051
052
053 query:SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name != '_Total'
054 (0):
055
056 instance of Win32_PerfFormattedData_PerfOS_Processor
057 {
058 C1TransitionsPersec = "77";
059 C2TransitionsPersec = "0";
060 C3TransitionsPersec = "0";
061 DPCRate = 0;
062 DPCsQueuedPersec = 4;
063 InterruptsPersec = 71;
064 Name = "0";
065 PercentC1Time = "96";
066 PercentC2Time = "0";
067 PercentC3Time = "0";
068 PercentDPCTime = "0";
069 PercentIdleTime = "100";
070 PercentInterruptTime = "0";
071 PercentPrivilegedTime = "0";
072 PercentProcessorTime = "0";
073 PercentUserTime = "0";
074 };
075
076
077 (1):
078
079 instance of Win32_PerfFormattedData_PerfOS_Processor
080 {
081 C1TransitionsPersec = "83";
082 C2TransitionsPersec = "0";
083 C3TransitionsPersec = "0";
084 DPCRate = 0;
085 DPCsQueuedPersec = 10;
086 InterruptsPersec = 67;
087 Name = "1";
088 PercentC1Time = "96";
089 PercentC2Time = "0";
090 PercentC3Time = "0";
091 PercentDPCTime = "0";
092 PercentIdleTime = "100";
093 PercentInterruptTime = "0";
094 PercentPrivilegedTime = "0";
095 PercentProcessorTime = "0";
096 PercentUserTime = "0";
097 };
098
099
100 query:SELECT * FROM Win32_PerfFormattedData_PerfOS_Memory
101 (0):
102
103 instance of Win32_PerfFormattedData_PerfOS_Memory
104 {
105 AvailableBytes = "1142099968";
106 AvailableKBytes = "1115332";
107 AvailableMBytes = "1089";
108 CacheBytes = "70725632";
109 CacheBytesPeak = "72904704";
110 CacheFaultsPersec = 634;
111 CommitLimit = "3063078912";
112 CommittedBytes = "326488064";
113 DemandZeroFaultsPersec = 13965;
114 FreeSystemPageTableEntries = 159743;
115 PageFaultsPersec = 13965;
116 PageReadsPersec = 0;
117 PagesInputPersec = 0;
118 PagesOutputPersec = 0;
119 PagesPersec = 0;
120 PageWritesPersec = 0;
121 PercentCommittedBytesInUse = 10;
122 PoolNonpagedAllocs = 38040;
123 PoolNonpagedBytes = "7585792";
124 PoolPagedAllocs = 57820;
125 PoolPagedBytes = "29380608";
126 PoolPagedResidentBytes = "28622848";
127 SystemCacheResidentBytes = "40235008";
128 SystemCodeResidentBytes = "1867776";
129 SystemCodeTotalBytes = "1167360";
130 SystemDriverResidentBytes = "0";
131 SystemDriverTotalBytes = "4071424";
132 TransitionFaultsPersec = 0;
133 WriteCopiesPersec = 0;
134 };
135
136
137 query:SELECT * FROM Win32_PerfRawData_PerfDisk_PhysicalDisk Where Name != '_Total'
138 (0):
139
140 instance of Win32_PerfRawData_PerfDisk_PhysicalDisk
141 {
142 AvgDiskBytesPerRead = "138920448";
143 AvgDiskBytesPerRead_Base = 8000;
144 AvgDiskBytesPerTransfer = "208285696";
145 AvgDiskBytesPerTransfer_Base = 13701;
146 AvgDiskBytesPerWrite = "69365248";
147 AvgDiskBytesPerWrite_Base = 5701;
148 AvgDiskQueueLength = "581460650";
149 AvgDiskReadQueueLength = "405581626";
150 AvgDisksecPerRead = 2794786622;
151 AvgDisksecPerRead_Base = 8000;
152 AvgDisksecPerTransfer = 322083534;
153 AvgDisksecPerTransfer_Base = 13701;
154 AvgDisksecPerWrite = 1822264208;
155 AvgDisksecPerWrite_Base = 5701;
156 AvgDiskWriteQueueLength = "175879024";
157 CurrentDiskQueueLength = 0;
158 DiskBytesPersec = "208285696";
159 DiskReadBytesPersec = "138920448";
160 DiskReadsPersec = 8000;
161 DiskTransfersPersec = 13701;
162 DiskWriteBytesPersec = "69365248";
163 DiskWritesPersec = 5701;
164 Frequency_Object = "0";
165 Frequency_PerfTime = "3034010000";
166 Frequency_Sys100NS = "10000000";
167 Name = "0 C:";
168 PercentDiskReadTime = "405581626";
169 PercentDiskReadTime_Base = "129895856572522792";
170 PercentDiskTime = "581460650";
171 PercentDiskTime_Base = "129895856572522792";
172 PercentDiskWriteTime = "175879024";
173 PercentDiskWriteTime_Base = "129895856572522792";
174 PercentIdleTime = "18446744072967667781";
175 PercentIdleTime_Base = "129895856572522792";
176 SplitIOPerSec = 1074;
177 Timestamp_Object = "0";
178 Timestamp_PerfTime = "3635534093651";
179 Timestamp_Sys100NS = "129895856572522792";
180 };<span style='font-family: "sans serif, tahoma, verdana, helvetica"; font-size: x-small;'><span style="line-height: 18.18px; white-space: normal;"> </span></span>


3、有可能出现的问题

报错a
01 org.jinterop.dcom.common.JIException: Message not found for errorCode: 0xC0000034
02 at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKLM(JIWinRegStub.java:115)
03 at org.jinterop.dcom.core.JIProgId.getIdFromWinReg(JIProgId.java:130)
04 at org.jinterop.dcom.core.JIProgId.getCorrespondingCLSID(JIProgId.java:162)
05 at org.jinterop.dcom.core.JIComServer.<init>(JIComServer.java:413)
06 at org.noah.wmitest.WmiService.connect(WmiService.java:122)
07 at org.noah.wmitest.WmiService.main(WmiService.java:177)
08 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
09 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
10 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
11 at java.lang.reflect.Method.invoke(Method.java:597)
12 at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
13 Caused by: jcifs.smb.SmbException: The system cannot find the file specified.
14 at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:522)
15 at jcifs.smb.SmbTransport.send(SmbTransport.java:622)
16 at jcifs.smb.SmbSession.send(SmbSession.java:239)
17 at jcifs.smb.SmbTree.send(SmbTree.java:109)
18 at jcifs.smb.SmbFile.send(SmbFile.java:718)
19 at jcifs.smb.SmbFile.open0(SmbFile.java:923)
20 at jcifs.smb.SmbFile.open(SmbFile.java:940)
21 at jcifs.smb.SmbFileOutputStream.<init>(SmbFileOutputStream.java:142)
22 at jcifs.smb.TransactNamedPipeOutputStream.<init>(TransactNamedPipeOutputStream.java:32)
23 at jcifs.smb.SmbNamedPipe.getNamedPipeOutputStream(SmbNamedPipe.java:187)
24 at rpc.ncacn_np.RpcTransport.attach(RpcTransport.java:92)
25 at rpc.Stub.attach(Stub.java:105)
26 at rpc.Stub.call(Stub.java:110)
27 at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKLM(JIWinRegStub.java:113)
28 ... 10 more

需要开启Remote Registry服务

报错b
01 org.jinterop.dcom.common.JIException: Message not found for errorCode: 0xC0000001
02 at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKLM(JIWinRegStub.java:115)
03 at org.jinterop.dcom.core.JIProgId.getIdFromWinReg(JIProgId.java:130)
04 at org.jinterop.dcom.core.JIProgId.getCorrespondingCLSID(JIProgId.java:162)
05 at org.jinterop.dcom.core.JIComServer.<init>(JIComServer.java:413)
06 at org.noah.wmitest.WmiService.connect(WmiService.java:87)
07 at org.noah.wmitest.WmiService.main(WmiService.java:142)
08 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
09 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
10 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
11 at java.lang.reflect.Method.invoke(Method.java:597)
12 at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
13 Caused by: jcifs.smb.SmbException: Connection timeout
14 jcifs.util.transport.TransportException: Connection timeout
15
16
17
18 org.jinterop.dcom.common.JIException: Message not found for errorCode: 0x8001FFFF
19 at org.jinterop.dcom.core.JIComServer.init(JIComServer.java:576)
20 at org.jinterop.dcom.core.JIComServer.initialise(JIComServer.java:481)
21 at org.jinterop.dcom.core.JIComServer.<init>(JIComServer.java:414)
22 at org.noah.wmitest.WmiService.connect(WmiService.java:87)
23 at org.noah.wmitest.WmiService.main(WmiService.java:142)
24 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
25 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
26 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
27 at java.lang.reflect.Method.invoke(Method.java:597)
28 at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
29 Caused by: java.net.ConnectException: Connection timed out

需要禁用放火墙

4、总结

j-Interop纯java跨平台,我就是linux系统。
用j-Interop就可以很方便的调用windows系统com,虽然这里只演示了WMI。
如果关心WMI与监控的话,建议去opennms-wmi看一看,他们有更好api封装(底层也是j-Interop)。

本文转载自:http://my.oschina.net/noahxiao/blog/73163

石海龙
粉丝 3
博文 16
码字总数 6148
作品 0
宝山
程序员
私信 提问
100%纯java调用windows的wmi获取监控数据

纯java主要体现在可以跨平台调用com。所用的是j-Interop,它是100%纯java实现的com的调用 1、环境准备 a、windows要开启Remote Registry与Windows Management Instrumentation服务 b、修改安...

NoahX
2012/08/16
9.5K
11
QT还有前途吗?迷茫中....

所谓的跨平台,windows有注册表、服务、WMI,这些QT本身都无法实现,如果调用系统API又无法跨平台,况且资源过少,都是MFC实例,如果想看懂WMI,又得学MFC,而学会了MFC,windows平台就没必要...

Pwarn
2015/08/29
5.4K
14
Berkeley DB数据库学习1

BDB使用教程 Berkeley DB是历史悠久的嵌入式数据库系统,在06年被 Oracle 收购了。现在我们在 Oracle 网站上会看到: BerkeleyDB、BerkeleyDB XML 和 BerkeleyDB JAVA Edition 这个三个东东。...

月下独酌100
2013/02/17
362
0
Java调用wmi执行dos命令

如题,我在网上找了一段代码,是java调用wmi的,但是这代码只能监控主机状态,查看了api也没有找到能执行dos命令得方法,请问调用wmi后是否可以执行dos命令?如果可以,请大神明示。 最后有个...

一身正气
2015/01/14
1K
3
JRuby 1.4 发布

JRuby 1.4.0发布了!JRuby是Ruby编程语言的100%纯Java实现,它结合了Ruby简洁的语法以及Java丰富的类库。 重要特性: 新的YAML分析器 改进了对java集成的支持 Windows安装程序 新的嵌入式框架...

红薯
2009/11/12
236
0

没有更多内容

加载失败,请刷新页面

加载更多

图的拓扑排序(动图)

概述 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,...

大洼X
23分钟前
5
0
CentOS7安装Redis和搭建Redis高可用集群

一、CentOS7下Redis安装 1.查看linux内核版本 此步骤可以省略,一般CentOS7内核版本都应该满足,因为搭建Redis高可用集群是Redis3以上才支持的,而Redis3需要linux内核高于3.10版本,所有才有...

liddblog
26分钟前
4
0
活动泄漏了最初添加的窗口

这是什么错误,为什么会发生? 05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c4......

技术盛宴
26分钟前
4
0
IT兄弟连 HTML5教程 DIV+CSS的兼容性问题

使用DIV+CSS布局网页其实是很容易的事情,但各种浏览器之间的不兼容性问题,加大了页面布局的难度,给程序员带来很多不便,于是需要花费更多的时间在调试各种浏览器的兼容性上。因为部分CSS...

老码农的一亩三分地
28分钟前
4
0
商家发货

商家发货 商家发货 打开后台-订单-订单列表 1.点击筛选出待发货的订单可进行批量操作。批量发货、批量打印快递单、批量打印发货单。 2.点击发货时,弹出框显示待发货的商品,发货方式可选需要...

Geek-Chic
30分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部