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" クラスは、カウンターの最終的な値を計算します。
1 つのプロセス、ディスク ドライブ、その他のデータの継続的なパフォーマンス データを取得する 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 オブジェクトを使用します。 このリフレッシャーはオブジェクトを保持するため、コレクションを繰り返し取得する必要はありません。 ほとんどのカウンターはレート カウンターであるため、パフォーマンス データを計算するには、少なくとも 2 つの値が必要です。 リフレッシャーのデータは、初回の表示では空です。

次のスクリプトは、コンピューターが再起動されるか、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_PerfProc_Process などの "Win32_PerfRawData" クラスを使用します。 特定のプロセスのプロパティ データ (PercentProcessorTime など) を 2 回取得します。 そのプロパティの 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