WMI 任务:性能监视

使用从性能计数器获取数据的 WMI 类来访问和刷新有关计算机性能的数据。 有关其他示例,请通过 https://www.microsoft.com/technet 访问 TechNet ScriptCenter。 有关详细信息,请参阅性能库和 WMI监视性能数据

本主题中所示的脚本示例仅从本地计算机获取数据。 有关如何使用脚本从远程计算机获取数据的详细信息,请参阅连接到远程计算机上的 WMI

以下过程介绍了如何运行脚本。

运行脚本

  1. 复制代码并将其保存在扩展名为 .vbs 的文件中,例如 filename.vbs。 确保文本编辑器不会向该文件添加 .txt 扩展名。
  2. 打开命令提示符窗口并导航到保存该文件的目录。
  3. 在命令提示符下键入 cscript filename.vbs。
  4. 如果无法访问事件日志,请进行检查以查看是否正从提升的命令提示符运行。 某些事件日志(例如安全事件日志)可能受用户访问控制 (UAC) 的保护。

注意

默认情况下,cscript 会在命令提示符窗口中显示脚本的输出。 由于 WMI 脚本可以生成大量输出,因此可能需要将输出重定向到文件。 在命令提示符下键入 cscript filename.vbs > outfile.txt 以将 filename.vbs 脚本的输出重定向到 outfile.txt。

下表列出了可用于从本地计算机获取各种类型的数据的脚本示例。

如何实现... WMI 类或方法
…获取可在脚本的 Perfmon 实用工具中看到的性能计数器数据? 使用名称以“Win32_PerfFormattedData”开头的类,例如 Win32_PerfFormattedData_PerfProc_Process。 名称如 PageFileBytes 的属性对应于 Perfmon 中所看到的性能计数器。 “Win32_PerfFormattedData”类会为你计算计数器的最终值。
…获取单个进程、磁盘驱动器和其他数据的持续性能数据? 使用 Win32_PerfFormattedData_PerfProc_Process 或设置适当格式的性能计数器类SWbemObjectEx.Refresh_ 方法。 有关详细信息,请参阅使用 SWbemObject 编写脚本
在 C++ 中,使用 IWbemConfigureRefresher::AddObjectByPathIWbemRefresher::Refresh。 有关详细信息,请参阅监视性能数据
以下脚本将运行到计算机重启、WMI 停止或脚本停止为止。 若要手动停止脚本,请使用任务管理器来停止进程。 若要以编程方式停止脚本,请在 Win32_Process 类中使用 Terminate 方法。

VB
              
              strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") set PerfProcess = objWMIService.Get(_ "Win32_PerfFormattedData_PerfProc_Process.Name='Idle'") 

While (True) PerfProcess.Refresh_
Wscript.Echo PerfProcess.PercentProcessorTime Wscript.Sleep 1000 Wend

…无需重复轮询即可获取所有进程的持续性能数据?

使用名称以“Win32_PerfFormattedData”开头的类和 SWbemRefresher 对象。 刷新器会保存对象,因此无需重复获取集合。 计算性能数据至少需要两个值,因为大多数计数器都是速率计数器。 首次显示刷新器数据时,刷新器是空的。

以下脚本将无限期运行,直到计算机重启、WMI 停止或脚本停止。 若要手动停止脚本,请使用任务管理器来停止进程。 若要以编程方式停止脚本,请在 Win32_Process 类中使用 Terminate 方法。

VB
              
              strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") set objRefresher = CreateObject("WbemScripting.Swbemrefresher") Set objProcessor = objRefresher.AddEnum _ (objWMIService, _ "Win32_PerfFormattedData_PerfOS_Processor").ObjectSet 

While (True) objRefresher.Refresh For each RefreshItem in objRefresher For each objProcess in RefreshItem.ObjectSet Wscript.Echo objProcess.GetObjectText_ Next Next Wscript.Sleep 5000 Wend

…获取并计算 Windows 2000 进程的性能数据?

使用“Win32_PerfRawData”类,例如 Win32_PerfRawData_PerfProc_Process。 为特定进程获取两次属性数据,例如 PercentProcessorTime。 查找属性的 CounterType 限定符中指定的公式并进行计算。 示例中的 CounterType 是 PERF_100NSEC_TIMER_INV。 有关详细信息,请参阅监视性能数据

以下脚本将无限期运行,直到计算机重启、WMI 停止或脚本停止。 若要手动停止脚本,请使用任务管理器来停止进程。 若要以编程方式停止脚本,请在 Win32_Process 类中使用 Terminate 方法。

VB
              
              strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") 

While (True) Set object1 = objWMIService.Get( _ "Win32_PerfRawData_PerfOS_Processor.Name='_Total'") N1 = object1.PercentProcessorTime D1 = object1.TimeStamp_Sys100NS Wscript.Sleep(1000) set object2 = objWMIService.Get( _ "Win32_PerfRawData_PerfOS_Processor.Name='_Total'") N2 = object2.PercentProcessorTime D2 = object2.TimeStamp_Sys100NS ' CounterType - PERF_100NSEC_TIMER_INV ' Formula - (1- ((N2 - N1) / (D2 - D1))) x 100 PercentProcessorTime = (1 - ((N2 - N1)/(D2-D1)))*100 Wscript.Echo "% Processor Time=" , PercentProcessorTime Wend

脚本和应用程序的 WMI 任务

WMI C++ 应用程序示例

TechNet ScriptCenter