LoginSignup
14
11

More than 5 years have passed since last update.

JScriptでWMI(その1)

Posted at

はじめに

Windows Management Instrumentation (WMI) のプロパティ値を取得してみます。

以前、JScriptでODBCのドライバ一覧を表示
で利用した、「WbemScripting.SWbemLocator」を利用します。

WMI値取得

WMIのプロパティを取得するメソッドを作成します。
結果を連想配列の配列として返します。
また、要素が配列の場合は配列で設定します。

function wmiProps(query) {
    // 結果
    var result = [];
    try {
        // 「SWbemLocator」オブジェクト取得
        var locator = new ActiveXObject("WbemScripting.SWbemLocator");
        // 「SWbemServices」オブジェクト取得(ローカルコンピュータ、名前空間「root\CIMV2」)
        var services = locator.ConnectServer(null, "root\\CIMV2");
        // クエリ実行、「SWbemObjectSet」オブジェクト取得
        var set = services.ExecQuery(query);
        // 「SWbemObjectSet」をJScriptで扱えるように「Enumerator」に変換
        var enumSet = new Enumerator(set);
        // 「SWbemObjectSet」の最後までループ
        while (!enumSet.atEnd()) {
            // 要素「SWbemObject」を取得
            var item = enumSet.item();
            // プロパティ「SWbemPropertySet」取得
            var props = item.Properties_;
            // 「SWbemPropertySet」をJScriptで扱えるように「Enumerator」に変換
            var enumProps = new Enumerator(props);
            // アイテム変数
            var item = {};
            // プロパティ分ループ
            while (!enumProps.atEnd()) {
                var val = null;
                // プロパティ取得
                var prop = enumProps.item();
                // nullチェック
                if (prop.Value != null) {
                    // 配列判定
                    if (prop.IsArray) {
                        // 配列化
                        val = new VBArray(prop.Value).toArray();
                    } else {
                        val = prop.Value;
                    }
                }
                // アイテム設定
                item[prop.Name] = val;
                // 次のプロパティへ移動
                enumProps.moveNext();
            }
            // アイテム設定
            result.push(item);
            // 次の要素へ移動
            enumSet.moveNext();
        }
    } catch (e) {
        // エラーの場合
        throw e;
    }
    return result;
}

WMIのプロパティで取得される配列はJScriptでそのまま解釈できない為
「VBArray」を利用して、配列にします。

val = new VBArray(prop.Value).toArray();

変換

配列をそのまま出力すると、見づらい為、CSV形式に変換するメソッドを用意します。
要素が配列の場合は、改行(CRLF)で区切ります。

function props2csv(props) {
    var csv = "";
    // キー配列
    var keys = null;
    // プロパティ配列数分ループ
    for (var i = 0; i < props.length; i++) {
        // 1行分の要素取得
        var items = props[i];
        // キー存在チェック
        if (keys == null) {
            // 初期化
            keys = [];
            // 要素のキー取得
            for (key in items) {
                keys.push(key);
            }
            // キーをヘッダに設定
            csv += keys.join(",") + "\r\n";
        }
        // 1行分のデータ
        var line = [];
        // 要素数分ループ
        for (var j = 0; j < keys.length; j++) {
            // 要素取得
            var item = items[keys[j]];
            // 要素存在チェック
            if (item != null) {
                // 要素配列チェック
                if (item instanceof Array) {
                    // 配列の場合、改行で連結
                    item = item.join("\r\n");
                } else {
                    // 文字列化
                    item = "" + item;
                }
                // ダブルコーテーションフラグ偽
                var isQuote = false;
                // 要素にダブルコーテーションの存在チェック
                if (item.indexOf("\"") >= 0) {
                    // ダブルコーテーションを置き換え
                    item = item.replace(/\"/g, "\"\"");
                    // ダブルコーテーションフラグ真
                    isQuote = true;
                } else if (item.indexOf(",") >= 0
                    || item.indexOf("\r") >= 0
                    || item.indexOf("\n") >= 0) {
                    // 要素に、「,」「CR」「LF」のいづれかがあるので
                    // ダブルコーテーションフラグ真
                    isQuote = true;
                }
                // ダブルコーテーションフラグ判定
                if (isQuote) {
                    // 両端をダブルコーテーションで囲む
                    item = "\"" + item + "\"";
                }
            }
            // 要素設定
            line.push(item);
        }
        // 1行分のデータを設定
        csv += line.join(",") + "\r\n";
    }
    return csv;
}

利用例

私が良く使うWMIの情報をいくつか挙げます。

プロセス一覧取得

プロセスの一覧を取得する場合、WMIの「Win32_Process」を参照します。

var query = "SELECT * FROM Win32_Process";
var props = wmiProps(query);
var csv = props2csv(props);
WScript.Echo(csv);

私が良く使うのは、以下の項目となります。

名前 説明
Caption 簡単な説明文、イメージ名
ProcessID プロセスID、PID
WorkingSetSize メモリ量、ワーキングセット(メモリ)

「*」で全体を取得するのではなく、項目指定の場合は以下のようになります。

var query = "SELECT Caption,ProcessID,WorkingSetSize FROM Win32_Process";
var props = wmiProps(query);
var csv = props2csv(props);
WScript.Echo(csv);

ローカル記憶領域情報取得

ローカルディスクの情報は、「Win32_LogicalDisk」を参照します。

var query = "SELECT * FROM Win32_LogicalDisk";
var props = wmiProps(query);
var csv = props2csv(props);
WScript.Echo(csv);

私が良く使うのは、以下の項目となります。

名前 説明
Caption 簡単な説明文、ドライブ名
FileSystem ファイルシステム
FreeSpace 空き容量
Size 全体の容量

「*」で全体を取得するのではなく、項目指定の場合は以下のようになります。
また、タイプ「DriveType」はローカルドライブだけを指定したい為
WHERE句にローカルディスク「3」を指定します。

var query = "SELECT Caption,FileSystem,FreeSpace,Size FROM Win32_LogicalDisk WHERE DriveType = '3'";
var props = wmiProps(query);
var csv = props2csv(props);
WScript.Echo(csv);

ネットワークアダプター情報取得

ネットワークの情報は、「Win32_NetworkAdapterConfiguration」を参照します。

var query = "SELECT * FROM Win32_NetworkAdapterConfiguration";
var props = wmiProps(query);
var csv = props2csv(props);
WScript.Echo(csv);

私が良く使うのは、以下の項目となります。

名前 説明
Description 説明
IPAddress IPアドレス
IPSubnet サブネットマスク
MACAddress 物理アドレス

「*」で全体を取得するのではなく、項目指定の場合は以下のようになります。
また、TCP/IPがバインドされていて有効なアダプターのみを指定したい為
WHERE句として「IPEnabled」に「true」を指定します。

var query = "SELECT Description,IPAddress,IPSubnet,MACAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = true";
var props = wmiProps(query);
var csv = props2csv(props);
WScript.Echo(csv);
14
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
11