zoukankan      html  css  js  c++  java
  • java调用windows的wmi获取设备性能数据

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


    转:http://my.oschina.net/noahxiao/blog/73163

    纯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_ROOTCLSID{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_ROOTCLSID{76A64158-CB41-11D1-8B02-00600806D9B6}" -ot reg -actn setowner -ownr "n:Administrators"
    2
        SetACL.exe -on "HKEY_CLASSES_ROOTCLSID{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)。

  • 相关阅读:
    地铁线路问题分析
    软件工程大作业(社团管理系统)-个人总结报告
    第九组_社团管理系统_原型相关文档
    北京地铁线路出行和规划
    地铁线路规划
    WC 个人项目 ( node.js 实现 )
    自我介绍 + 软工5问
    软工个人项目(Java实现)
    自我介绍+软工五问
    结对编程(前后端分离)
  • 原文地址:https://www.cnblogs.com/Rozdy/p/5522859.html
Copyright © 2011-2022 走看看