Windows Server 容量監視スクリプト

必要になったっぽいので、容量監視用のJScriptを作ってみました。
VBは見たくもないので基本WSHJScriptで作ります)
以下のサイトがとても参考になりました。

[Windows] Windows Scriptファイル(wsf)を使ってイベントログを保存したりメールを送信したりするサンプル(JScript使用版)
http://d.hatena.ne.jp/seraphy/20081010


【CheckDiscSize.wsf】

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<package>
    <job id="CheckDiscSize">
        <?job error="true" debug="true" ?>

        <!-- 設定情報はJScriptで定義する(型も宣言できるため一番楽で正確)-->
        <script language="JScript">
        <![CDATA[
            var config =
            {
                "BoundaryValue": 0.9
                , "SMTP":
                {
                    "Host": "SMTPサーバアドレス"
                    , "Port": 25
                    , "From": "送信元メールアドレス"
                    , "To": "宛先メールアドレス"
                    , "CC": ""
                    , "Subject": "[Warning] ディスク容量監視アラート(90%超過) - サーバ名"
                    , "Body": ""
                }
            };
        ]]>
        </script>

        <script language="JScript" src="CheckDiskSize.js"></script>
    </job>
</package>


【CheckDiskSize.js】

/**
* Disk Size Name
* 数値を PB TB GB MB KB B に変換する。
*/
var dsn = function (num) {
    var sizename = [];
    sizename[0] = "B";
    sizename[1] = "KB";
    sizename[2] = "MB";
    sizename[3] = "GB";
    sizename[4] = "TB";
    sizename[5] = "PB";

    for (var cnt = 0; 0 < Math.floor(num / 1024); cnt++) {
        num /= 1024;
    }
    num = Math.round(num * 100) / 100;
    return (new String(num) + '' + sizename[cnt]);
}

/**
 * DISK一覧を取得
 */
var GetDisks = function(bv) {
    var check = 0;
    var arr = [];
    var locator = new ActiveXObject("WbemScripting.SWbemLocator");
    var service = locator.ConnectServer();
    var drives = service.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3");
    var e = new Enumerator(drives);

    arr.push("ドライブ名\t容量\t空き容量\t使用容量率%")

    for (; !e.atEnd(); e.moveNext()) {
        var drive = e.item();
        var space = 1 - (drive.FreeSpace / drive.Size);
        if (!check) check = bv <= space;
        var space = Math.round(space * 100)
        arr.push(drive.DeviceID + "\t" + dsn(drive.Size) + "\t" + dsn(drive.FreeSpace) + "\t" + space + "%");
    }
    return { "Check":check, "Text": arr.join("\r\n") }
}

/**
 * メールの送信
 */
var SendMail = function (config) {
    if (!config.From) {
        WScript.echo("[ERROR] メールの送信元が設定されていません。");
        WScript.Quit(1);
    }
    if (!config.To) {
        WScript.echo("[ERROR] メールの送信先が設定されていません。");
        WScript.Quit(1);
    }
    if (!config.Body) {
        WScript.echo("[ERROR] メールの本文が設定されていません。");
        WScript.Quit(1);
    }

    var msgobj = new ActiveXObject("CDO.Message");

    // 送信内容設定
    msgobj.From = config.From;
    msgobj.To = config.To;
    msgobj.Cc = config.CC;
    msgobj.Subject = config.Subject;
    msgobj.TextBody = config.Body;

    // サーバ設定
    msgobj.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2;
    msgobj.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = config.Host;
    msgobj.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = config.Port;
    msgobj.Configuration.Fields.Update();

    // 送信
    msgobj.send();
};

// 実行
var diskinfo = GetDisks(config.BoundaryValue);
if (diskinfo.Check) {
    config.SMTP.Body = diskinfo.Text;
    SendMail(config.SMTP);
}