SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

スクリプトとタスクによるサーバ監視の自動化

WSH/WMI/CDOを組み合わせてサーバの状況をメールで通知する


WMIを呼び出してみよう

 WMIは、先ほども述べたようにCOM経由で呼び出すことができます。VBSから呼び出す場合には、次のような一文でWMIサービスを取得できます。

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でメールを送信します。

 このように、非常に簡単にメールを送信することができます。

次のページ
今までの要素を組み合わせてみよう

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

中 博俊(ナカ ヒロトシ)

大阪でフリーのソフトウェアエンジニア兼テクニカルライターとして日々新技術で楽しんでいる。MSMVP for C# ブログ:http://blogs.wankuma.com/naka/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/501 2008/08/21 21:10

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー