| 网站首页 | VB.Net实例分析 | .Net技术文摘 | 下载中心 | VB.Net书籍笔记 | .Net源码 | VBS脚本与组件调用 | Windows2008技术文摘 | 给我们留言 | 
最新公告:

  没有公告

您现在的位置: 乐博网 >> VB.Net实例分析 >> WMI编程 >> 实例分析正文
最新推荐 更多内容
采用WMI监视系统性能的实现方法
采用WMI监视系统性能的实现方法
作者:风行    来源:CSDN博客     更新时间:2011-4-6

本文列举了.net利用wmi获取系统性能信息数值的方法,比如硬盘容量剩余、带宽使用等,提供了一些关于利用wmi获取系统性能信息的有益信息。文章中对获取cpu使用率没有做讲解,大家可以自行去做测试,需要交流可以来.Net超级qq群40797788交流。WMI 提供了一整套易于使用的性能计数器类。可以利用这些类来监视处理器使用情况、内存使用情况、网络连接、磁盘使用情况、Web 服务性能、服务器连接、打印机使用情况以及其他各种性能参数。

  WMI提供了多种编程接口,有供C++使用的COM API,供ASP和VB使用的SCRIPT API,供.NET使用的在System.Management 中的类。它们的用法大同小异。在.NET中,也可以用System.Diagnostics命名空间下的PerformanceCounter 类 方便的枚举各种计数器,直接获取相应的信息。但是如果要在ASP中用VBScript使用性能计数器类来监视性能就没.NET中那么方便了,有一些工作还得自己来做。

  首先创建与要监视的服务器之间的连接。

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
    Set objWMIService = objSWbemLocator.ConnectServer(strComputer, _
    "root\cimv2", _
     strUser, _
     strPassword, _
     "MS_409")

其中的几个变量看名字也能知道个差不多,strComputer服务器名,strUser和strPassword是具有管理员权限的用户名和密码。这里需要注意的是如果strComputer是本地计算机,即ASP网页所在的计算机时需要有额外的设置。如果用默认的匿名用户来访问ASP页的时候无法获取正确的监视信息,这是IIS的安全性限制。可以在IIS中将访问性能计数器的ASP页面的匿名访问的用户改为具有管理员权限的用户,这样就能获取正确的监视信息了。你要是把整个目录的匿名访问改为管理员用户肯定也行,不过我想没有人会这样做吧,呵呵。还有一点需要注意的就是访问本地计算机的用户名和密码为空就可以,如果输入了用户名密码反而出错。

  接下来就可以获取各种计数器来得到你想要的信息,只需要用WQL类似SQL语句的简单查询就可以。比如获取已用内存:

Set colItems = objWMIService.ExecQuery ("Select * From Win32_PerfRawData_PerfOS_Memory")
        For Each objItem in colItems
         committedBytes = objItem.CommittedBytes/1024/1024
        Next

 Win32_PerfRawData_PerfOS_Memory的committedBytes 属性直接得到了想要的数据。这是最简单的一种情况。有一些计数器不能直接得到想要的数据,需要相应的计算公式才能得到正确的数据。例如,获取磁盘剩余空间的百分比。

Set colDisks = objWMIService.ExecQuery ("Select * from Win32_PerfRawData_PerfDisk_LogicalDisk Where Name = '_Total'")
        For Each objDisk in colDisks
         intBaseValue = objDisk.PercentFreeSpace_Base
         diskFreeSpacePercent = objDisk.PercentFreeSpace /intBaseValue
        Next

还有更复杂一些的情况。

Set colItems = objWMIService.ExecQuery ("Select * From Win32_PerfRawData_Tcpip_NetworkInterface Where Name<>'MS TCP Loopback interface'")
        For Each objItem in colItems
         CounterValue1 = objItem.BytesTotalPerSec
         TimeValue1 = objItem.TimeStamp_PerfTime
         TimeBase = objItem.Frequency_PerfTime
        Next
        Sleep(100)
        Set colitems = objWMIService.ExecQuery ("Select * From Win32_PerfRawData_Tcpip_NetworkInterface Where Name<>'MS TCP Loopback interface'")
        For Each objItem in colItems
         CounterValue2 = objItem.BytesTotalPerSec
         TimeValue2 = objItem.TimeStamp_PerfTime
         If TimeValue2 - TimeValue1 = 0 Then
         Else
          netWork = (CounterValue2-CounterValue1) /((TimeValue2-TimeValue1)/TimeBase)
         End if
        Next

以上这个例子是获取网络流量。sleep()是用来让程序挂起一定的时间。在VBScript中有内置的函数,但在ASP中不好用,没找到什么好的办法,只好用一个循环来占用CPU的时间。乐博网提示:用循环来占用时间是比较不理想的做法,期间可能导致进程cpu高企,乐博网提供了另外一种磨时间又不影响性能的,附在sleep过程的后面

private Sub  Sleep(n)
Dim timeNow
timeNow = Now()
While DateDiff("s", timeNow, Now()) < n/1000: Wend
End Sub

乐博网提供方法:

    Private Sub LOB_WaitRock(ByVal Int_MilliSecond As Integer)

        Dim LOB_Watch As New Stopwatch
        LOB_Watch.Start()
        Do While LOB_Watch.ElapsedMilliseconds < Int_MilliSecond
            Application.DoEvents()
        Loop
        LOB_Watch.Stop()

    End Sub

WMI中有很多种计数器如何来确定每个计数器属于哪一种类型,应该用什么样的公式来计算呢?当然是查MSDN了。例如要找上面的那个计数器BytesTotalPerSec ,在MSDN中搜索BytesTotalPerSec ,找到其所在的计数器类Win32_PerfRawData_Tcpip_NetworkInterface,在下面对应的属性BytesTotalPerSec 中会看到下面信息。

BytesTotalPerSec
Data type: uint64
Access type: Read-only
Qualifiers: DisplayName("Bytes Total/sec"), PerfDefault, CounterType(272696576), DefaultScale(-4), PerfDetail(200)
其中 CounterType(272696576)代表的计数器的类型,查找272696576,在CounterType Qualifier这章节下面能够找到 272696576 PERF_COUNTER_BULK_COUNT

PERF_COUNTER_BULK_COUNT就是该计数器所属的类型,再通过查找PERF_COUNTER_BULK_COUNT得到其相应的计算公式。

这样就能够正确地得到所有计数器的数据了。

乐博网补充:查看cpu的使用率可以调用Win32_Processor 里面有个属性LoadPercentage就是cpu使用率了,不过这个是以核心和线程统计的,如果你有双核或者四核的cpu,或者双核四线程那就要遍历获取每个核心和线程的使用率来统计了。

  • 上一篇:

  • 下一篇:
  • 【字体: 】【打印此文】【关闭窗口
      相关文章:(只显示最新16条)
    WMI获取系统性能信息的编程经验
    计数器类型使用详解(Win32_PerfRawData)
    性能计数器编程(VB2010实例)

    | 设为首页 | 加入收藏 | 联系站长 | | 友情链接 | 版权申明 |
    乐博网欢迎各种媒体转载我们的原创作品[转载请注明出处];我们鼓励更多VB.Net开发者一起加入研究与探讨;如发现文章访问错误、内容错误或版权疑问、内容有违相关法律(如涉及政治、色情、反动或散布虚假有害信息)等情况,请及时向我们举报,我们将及时纠正!
    联系邮箱:Shiny#vip.qq.com (#替换为@) QQ交流群: 40797788 [闽ICP备05014267号]