これは2005年に投稿したエントリーで、以前のブログから引き継いだものに加筆したものです。
必要に迫られてWMI(Windows Management Instrumentation)を利用したスクリプトを作成することになりました。基本的にはWindows提供のパフォーマンス・モニタを利用してできることなのですが、期待することが実現できないため、あえてスクリプトを作成した次第です。
github.com
スクリプト中でWMIを利用するにはインスタンス化しなければなりません。例えばCPU全体のCPU時間を取得するならば、
Dim p_cpuuse Set p_cpuuse = GetObject("winmgmts:!\\" & "" & Server & "" "\root\cimv2:Win32_PerfRawData_PerfOS_Processor.Name='_Total'")
もしくは
Dim myWMI Dim myCPU set myWMI = GetObject("winmgmts:!\\" & myServer & "\root\cimv2") set myCPU = myWMI.get("Win32_PerfRawData_PerfOS_Processor.Name='_Total'")
個人的には後者の書き方が好みです。
Win32クラス名だけでなく、Nameプロパティを指定しなければなりません。例えば、複数のCPUを搭載している場合、どのCPUを確認するか、もしくは全CPUを単体として確認するのかを指定しなければならないということです。先の記述では、単体としての全CPUの値を取得しています。このようなケースに当てはまる要素は、次のコードでNameの一覧を取得できます。
Option Explicit Dim objWMI Dim strComputer dim colClass dim objClass strComputer = "." Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colClass = objWMI.ExecQuery("Select * from Win32_PerfRawData_PerfNet_Server",,48) WScript.Echo "Query: Win32_PerfRawData_PerfOS_System::Name" On Error Resume Next For Each objClass in colClass WScript.Echo "Name: " & objClass.Name Next Set objClass = Nothing Set colClass = Nothing Set objWMI = Nothing
先のケースに当てはまらない場合、例えば、Win32_PerfRawData_PerfNet_ServerなどではNullが返されます。このようなクラスをインスタンス化する場合には、Nameプロパティへ@を指定します。こんな感じです。
set mySVR = myWMI.get("Win32_PerfRawData_PerfNet_Server=@")
ちなみにパフォーマンス・モニタで取得可能な項目はほとんどWin32クラスで網羅されています。リファレンスとしてこちらが有用でしょう。
参照すべきクラスと、それが保持するプロパティさえ分かれば、後はインスタンス化したものから必要なプロパティを参照するだけです。例えば、サーバー内のファイル・オープン数とサーバー・セッションを参照したければ、
Dim myWMI Dim mySVR set myWMI = GetObject("winmgmts:!\\" & myServer & "\root\cimv2") set mySVR = myWMI.get("Win32_PerfRawData_PerfNet_Server=@") MsgBox mySVR.FilesOpen MsgBox mySVR.ServerSessions set mySVR = nothing set myWMI = nothing
今回は、これをを利用して次の機能を持つスクリプトを作成しました。
- 監視対象サーバーを別ファイルの一覧から読み込む。
- 5分間隔で、連続23時間55分以上、24時間未満、監視を続ける。
- 監視項目はタブ区切りのCSVファイルで出力する。
- エラーはイベント・ログへ出力する。
監視項目は以下の通りです。
- PercentProcessorTime
- AvailableMBytes
- FileReadBytesPerSec
- FileWriteBytesPerSec
- FilesOpen
- LogonPerSec
- PoolNonPagedBytes
- PoolNonPagedFailures
- PoolPagedBytes
- PoolPagedFailures
- ServerSessions
ちなみに.Net Framework環境ではパフォーマンス監視用クラスが提供されているので、こちらを利用すればより容易に実現できます。ウチの場合、W2K、2003混在環境で、W2KにFrameworkをインストールするわけにも行かず、Win32クラスを利用している次第です。
このスクリプトは次のハイパーリンクからダウンロードすることができます。
github.com