`
javan
  • 浏览: 55764 次
社区版块
存档分类
最新评论

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

 
阅读更多


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

纯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.18181800842285px;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)。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics