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的时间。
private Sub Sleep(n)
Dim timeNow
timeNow = Now()
While DateDiff("s", timeNow, Now()) < n/1000: Wend
End Sub
WMI中有很多种计数器如何来确定每个计数器属于哪一种类型,应该用什么样的公式来计算呢?当然是查MSDN了。例如要找上面的那个计数器BytesTotalPerSec ,在MSDN中搜索BytesTotalPerSec ,找到其所在的计数器类Win32_PerfRawData_Tcpip_NetworkInterface,在下面对应的属性BytesTotalPerSec 中会看到下面信息。
BytesTotalPerSecAccess type: Read-only
Qualifiers: DisplayName( "Bytes Total/sec"), PerfDefault, CounterType( 272696576), DefaultScale( -4), PerfDetail( 200)
272696576 | PERF_COUNTER_BULK_COUNT |
PERF_COUNTER_BULK_COUNT就是该计数器所属的类型,再通过查找PERF_COUNTER_BULK_COUNT得到其相应的计算公式。
这样就能够正确地得到所有计数器的数据了。