Windows Server 容量監視スクリプト
必要になったっぽいので、容量監視用のJScriptを作ってみました。
(VBは見たくもないので基本WSHはJScriptで作ります)
以下のサイトがとても参考になりました。
[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); }