WMIを呼び出してみよう
WMIは、先ほども述べたようにCOM経由で呼び出すことができます。VBSから呼び出す場合には、次のような一文でWMIサービスを取得できます。
Set objWMIService = GetObject( _ "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
まずWMIのサービスを取得してから、実際に取得したい情報を取得することになります。
Set objSWbemObjectCollection = _ objWMIService.ExecQuery("Select * from Win32_LogicalDisk")
いかがでしょうか? SQLのようなクエリ言語で記述されていることが分かるかと思います。このSQLのようなクエリ言語をWQL(WMI Query Language)と言います。
ではWQLを利用して、取得した情報を表示させる部分も組み立ててみましょう。
Set objWMIService = GetObject( _ "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") Set objSWbemObjectCollection = _ objWMIService.ExecQuery("Select * from Win32_LogicalDisk") For Each objSWbemObject in objSWbemObjectCollection WScript.Echo objSWbemObject.DeviceID & vbtab & _ objSWbemObject.DriveType & vbTab & objSWbemObject.VolumeName Next

今回呼び出したWQLは、Win32_LogicalDiskのすべての情報を取得するというものでした。それらをFor Eachで列挙して、デバイスID(C:のようなもの)、ドライブタイプ(3がローカルディスク)、ボリューム名を表示しています。
ここで取得した情報はWin32_LogicalDiskクラスというもので、他にもさまざまな情報を保持しています。詳細は、MSDNを参照してください。
これらの情報を取り出したり設定したり、Where条件に設定したりすることで、絞込みなどのさまざまなことが行えます。
ディスク監視をしてみよう
ディスク容量が少なくなった際に誰も監視していないと、いきなりシステムに不調をきたしたり、保存に失敗したりします。
そのような事態はサーバを運営する上で絶対に避けなければいけません。ハードディスクの空き領域を自動的に監視し、使用率が80%を超えた場合に分かるようにするスクリプトを書いてみたいと思います。
Dim Body Set objWMIService = GetObject( _ "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") Set objSWbemObjectCollection = objWMIService.ExecQuery( _ "Select * from Win32_LogicalDisk Where DriveType = 3") For Each objSWbemObject in objSWbemObjectCollection 'デバイスID C:などを取得する DeviceID = objSWbemObject.DeviceID 'ハードディスクのフルサイズを取得する Size = objSWbemObject.Size 'ハードディスクの空き領域を取得する FreeSpace = objSWbemObject.FreeSpace '使用率を計算する ExistPersent = 100 - FreeSpace / Size * 100 '使用率が80%以上の場合に警告メッセージを表示する設定を行う If ( ExistPersent > CDbl(80) ) Then Caution = "CAUTION!!!" Else Caution = "" End If '本文を組み立てる Body = Body & DeviceID & vbTab & Int(FreeSpace / 1024 / 1024) _ & "MB" & vbTab & Int(Size / 1024 / 1024) & "MB" & vbTab _ & Int(ExistPersent) & "%" & vbTab & Caution & vbCrLf Next WScript.Echo Body
先ほどまでのスクリプトの応用です。
初めに、WQLでドライブタイプを3に指定しています、3はローカルに接続されているハードディスクのことを意味するので、監視すべき対象をハードディスクに絞り込むことが可能です。
続いて、ハードディスクのフルサイズや空き領域なども同様に取得することができるので、それらから使用比率を算出し、文字列として組み立てています。
最後にWScript.Echoで画面に表示しています。

CDOを利用してメールを送ってみよう
Windows 2000以上の環境では、CDO(Collaboration Data Objects)というExchangeへのアクセスや、メール送信などの機能も持ったCOMオブジェクトが標準でインストールされています。
CDOは送信メールにやや問題のあることが分かっていますが、不特定多数に送るメールでない限り、大きな支障はないと思います。
Call SendMail("test@wankuma.com", "naka@wankuma.com", _ "テストメール", "TEST" ) Sub SendMail(FromMailAddress, ToMailAddress, Subject, Body ) '設定を作成する Dim objConfig Set objConfig = CreateObject("CDO.Configuration") 'SMTPを利用する objConfig.Fields.Item( _ "http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 'メールサーバを指定する objConfig.Fields.Item( _ "http://schemas.microsoft.com/cdo/configuration/smtpserver") _ = "mail.wankuma.com" objConfig.Fields.Update 'メッセージを作成する Dim objMessage Set objMessage = CreateObject("CDO.Message") '設定を関連付ける Set objMessage.Configuration = objConfig 'From, To, Subject, Bodyなどのメールの情報を設定する objMessage.From = FromMailAddress objMessage.To = ToMailAddress objMessage.Subject = Subject objMessage.TextBody = Body 'メールを送信する objMessage.Send End Sub
今回は再利用しやすいように、SendMailというサブルーチンを定義しています。
CDOを使ってSMTP送信するにはまず設定を作成しなくてはいけません。それがCDO.Configurationです。この中でsendusing=2というのがSMTPを利用するという宣言で、smtpserver=の部分でメールサーバを指定しています。
続いてCDO.Messageがメールメッセージの本体です。Configration=で先に作成した設定と関連付けを行っています。さらにFromやToなど必要最小限のデータを設定し、最後に.Sendでメールを送信します。
このように、非常に簡単にメールを送信することができます。
