JavaScript、WSH、WMIを使用しローカルPCのIPアドレスを取得する方法

更新日:

過去にJavaScriptを使用し、ローカルPCのIPアドレスを取得する必要があり、
下記サイトを参考にし解決しました。
Get Client MAC Address & IP Address using Javascript (2010/11)
http://codingresource.blogspot.jp/2010/02/get-client-mac-address-ip-address-using.html

WMI( Windows Management Instrumentation ) を使用しており、
WSHやHTA(HTML Applications)で使用可能です。

2012年頃に記事にしていたのですが、ブログリニューアルついでに
もう少し詳しく書いてみようかと思います。

IPを取得する

WMIを使用する関数を作成する

//----------------------------------
// Windows Management Instrumentation (WMI) プロパティ取得
//----------------------------------
function getWMIProperties( query ){
    var result = [];
    try{
        var locator  = new ActiveXObject("WbemScripting.SWbemLocator");

        // 第一引数にリモート先を指定すれば、ローカル以外の情報も取得可能
        // リモートアクセス時にユーザーを指定する場合は、
        // 第三引数にユーザー名、第四引数にパスワードを指定
        var services = locator.ConnectServer(null, "root\\CIMV2");

        var set  	 = services.ExecQuery(query);
        var enumSet  = new Enumerator(set);

        for( ; !enumSet.atEnd() ; enumSet.moveNext() ){
            var item  = enumSet.item();
            var props = new Enumerator( item.Properties_ );
            var obj   = {};

            for( ; !props.atEnd() ; props.moveNext() ){
                var val  = null;
                var prop = props.item();
                if( prop.Value != null ){
                    if( prop.IsArray ){
                        val = new VBArray(prop.Value).toArray();
                    }else{
                        val = prop.Value;
                    }
                }
                obj[prop.Name] = val;
            }
            result.push( obj );
    	}
	}catch( e ){
        throw e;
    }
    return result;
}

※今後、WMIを使った記事をいくつか書きます。その際にも使用します。

WMIを使用してIPを取得する

先ほど作成した関数に検索クエリーを渡し、情報を取得します。
今回は、TCP/IP がバインドされ有効になっているネットワークアダプターの情報を取得するという事、以下を指定しています。

SELECT
 IPAddress
FROM
 Win32_NetworkAdapterConfiguration 
WHERE(条件式)
 IPEnabled = true
var ip_list = [];

// 取得したいプロパティをクエリーで指定する
var query = "SELECT IPAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = true";
var props = getWMIProperties(query);

for( var i = 0 ; i < props.length ; ++i ){
    ip_list.push( props[i].IPAddress[0] );
}

WScript.Echo( ip_list.join("\n") );

IPAddressのプロパティは配列になっていて、IPv4, IPv6 の二種類の情報が入っています。
今回は、IPv4のプロパティを取得しています。

WSHサンプル

サンプルを確認したい場合は、テキストを開きコピペ。拡張子を「wsf」にして保存してご確認下さい。

<job>
<script language="JScript">

var ip_list = [];

// 取得したいプロパティをクエリーで指定する
var query = "SELECT IPAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = true";
var props = getWMIProperties(query);

for( var i = 0 ; i < props.length ; ++i ){
    ip_list.push( props[i].IPAddress[0] );
}

WScript.Echo( ip_list.join("\n") );

//----------------------------------
// Windows Management Instrumentation (WMI) プロパティ取得
//----------------------------------
function getWMIProperties( query ){
    var result = [];
    try{
        var locator  = new ActiveXObject("WbemScripting.SWbemLocator");

        // 第一引数にリモート先を指定すれば、ローカル以外の情報も取得可能
        // リモートアクセス時にユーザーを指定する場合は、
        // 第三引数にユーザー名、第四引数にパスワードを指定
        var services = locator.ConnectServer(null, "root\\CIMV2");

        var set  	 = services.ExecQuery(query);
        var enumSet  = new Enumerator(set);

        for( ; !enumSet.atEnd() ; enumSet.moveNext() ){
            var item  = enumSet.item();
            var props = new Enumerator( item.Properties_ );
            var obj   = {};

            for( ; !props.atEnd() ; props.moveNext() ){
                var val  = null;
                var prop = props.item();
                if( prop.Value != null ){
                    if( prop.IsArray ){
                        val = new VBArray(prop.Value).toArray();
                    }else{
                        val = prop.Value;
                    }
                }
                obj[prop.Name] = val;
            }
            result.push( obj );
    	}
	}catch( e ){
        throw e;
    }
    return result;
}
</script>
</job>

Win32_NetworkAdapterConfigurationクラス

WMIを用いてIPアドレスを取得しましたが、Win32_NetworkAdapterConfiguration には他にも多くのプロパティが存在。

説明プロパティ名参考値
名前DescriptionRealtek PCIe GBE Family Controller
IPアドレス(IPv4)IPAddress[0]192.168.1.24
IPアドレス(IPv6)IPAddress[1]fa11::486:3e8b:ca67:da3
サブネットマスクIPSubnet[0]255.255.255.0
MACアドレスMACAddressAB:1C:D2:34:E5:6F
DHCPが有効かどうかDHCPEnabledtrue

詳しくはWMI Fun !! : Win32_NetworkAdapterConfiguration 等を確認するとよいかと思います。

デバッガーが使用できるのであれば、SELECTに「*」を指定しデバッガーで止めてプロパティを確認した方が確実ではあります。その一部を紹介します。

参考リンク

今回ネットーワーク関連という事でWin32_NetworkAdapterConfiguration を指定しましたが、Win32_LogicalDisk を使用してドライブにアクセスしたり様々な事が可能です。

詳しくは以下サイトを確認下さい。

WMI Fun !! WMI Library
http://www.wmifun.net/library/

WMI Fun !! : Win32_NetworkAdapterConfiguration クラス
http://www.wmifun.net/library/win32_networkadapterconfiguration.html

MSDN : Win32_NetworkAdapterConfiguration class
https://msdn.microsoft.com/en-us/library/aa394217(v=vs.85).aspx

PowerShell from Japan!! Blog [WMI] ネットワーク情報を取得する (2011/11)
http://blog.powershell-from.jp/?tag=wmi

Get Client MAC Address & IP Address using Javascript (2010/11)
http://codingresource.blogspot.jp/2010/02/get-client-mac-address-ip-address-using.html

ipconfigが使えない環境でIPアドレスを知りたい (WMIを使う) (2014/02)
http://argius.hatenablog.jp/entry/2014/02/24/222935

-JavaScript
-, , , ,

Copyright© 打ち聞かせ , 2021 All Rights Reserved Powered by STINGER.