スポンサーリンク

メモリ・CPUなどハードウェアの構成情報を,バッチで取得しよう (WSH/JScriptでWMIを使う方法)


WSH/JScriptから,Windowsのハードウェア情報を取得するサンプルコード。

  • CPU情報を取得
  • メモリ情報を取得

ほかにも大量の情報を取得可能。


すぐに試せる。


以下のコードを保存して,ダブルクリックするだけ。

wmi.js

WScript.Echo( getCpuInfo() );

WScript.Echo( getMemoryInfo() );



// CPU情報を取得(WQLを使う)
function getCpuInfo()
{
	// Wbem利用のためのオブジェクトを取得
	var locator = WScript.CreateObject("WbemScripting.SWbemLocator");
	
	// ローカルマシン内のWbemサーバ(WMI)に接続し,サービスを開始
	var wbem_service = locator.ConnectServer();
	
	// CPU情報テーブルに対してクエリSQL(WQL)を発行し,結果セットを取得
	var record_set = wbem_service.ExecQuery("SELECT * FROM Win32_Processor");
	
	var ret = "";
	
	// Enumeratorを使って,結果セットを1行ずつ読み取る
	var e = new Enumerator( record_set );
	for( ; ! e.atEnd(); e.moveNext() )
	{
		// 1件分のレコードを取得
		var record = e.item();
		
		ret += "CPU名称:" 
			+ record.Name
			+ ", 最大周波数:"
			+ record.MaxClockSpeed
			+ "MHz, 現在の周波数:"
			+ record.CurrentClockSpeed
			+ "MHz\r\n"
		;
	}
	
	return ret;
}



// メモリ情報を取得(WQLを使わない)
function getMemoryInfo()
{
	// ローカルマシンのWBEMサーバに接続
	var wbem_service = GetObject("winmgmts:{impersonationLevel=impersonate}");
	
	// メモリ構成情報を一括取得
	var record_set = wbem_service.instancesOf("Win32_LogicalMemoryConfiguration");
	
	var ret = "";
	
	// Enumeratorを使って,結果セットを1行ずつ読み取る
	var e = new Enumerator( record_set );
	for( ; ! e.atEnd(); e.moveNext() )
	{
		// 1件分のレコードを取得
		var record = e.item();
		
		ret += "解説:" 
			+ record.Description
			+ ", 合計物理容量:"
			+ record.TotalPhysicalMemory
			+ "KB, 合計仮想容量:"
			+ record.TotalVirtualMemory
			+ "KB\r\n"
		;
	}
	
	return ret;
}


これを手元の環境(Windows XP)で実行したら,

CPU名称:Intel Pentium II プロセッサ, 最大周波数:1728MHz, 現在の周波数:1728MHz


解説:論理メモリの構成, 合計物理容量:1833008KB, 合計仮想容量:496576KB

と表示された。

WMIとは何か

  • WBEM((Windows Management Instrumentation)とは,ネットワーク経由でコンピュータを管理するための標準規格。
  • WMI(Windows Management Instrumentation)とは,マイクロソフトによるWBEMの実装。
  • WMIプロバイダとは,WBEM(WMI)に基づいて各種管理対象にアクセスするための窓口となるDLL。

WBEM
http://ja.wikipedia.org/wiki/Web-Base...

  • 仕組み:WBEMクライアントが,WBEMサーバに対して管理情報をたずねる。
  • 管理しようとしているデバイスのWBEMサーバは,通常そのデバイス自身のある装置上で動作。


WMI
http://vbscript.g.hatena.ne.jp/keywor...


GUIを超えて進化するWindows管理ツール
http://www.atmarkit.co.jp/fwin2k/insi...

  • WMIアーキテクチャの図がわかりやすい

CIMとWQL

  • CIM(Common Information Model)とは,WBEMによる管理情報を扱うためのモデルのこと。データベースのテーブルのような形式で参照可能。
  • CIMリポジトリとは,CIMに基づいた情報を格納する場所のこと。ただし動的に変化してゆく情報はいちいちここにキャッシュされない。
  • WQL(WMI Query Language)とは,CIMリポジトリを含め,WMIがCIM形式で管理している情報に対して検索操作を行なうための,SQLのような言語。

SQL文でWMIの情報を取得[WQL]
http://www.bnote.net/windows/wsh/wmi0...

  • SQLの対象はデータベースやテーブルだが,WQLの対象はWMIクラス。
  • WQLでWMIクラスのインスタンスを取得し,そのプロパティを取得することで情報を取得する。


WQLのサンプルは世の中に大量に存在する。

VBS for Windows Management Instrumentation
http://www.geocities.jp/maru3128/wmi....

  • 大量のWQLサンプルコード。


WMI サンプル集
http://www.anchorsystems.jp/anchor/as...

  • 同じく,大量のWQLサンプルコード。


DBでいうところの「テーブル」に相当するものは「WMIクラス」である。

WMIクラスの一覧表(MSDNの公式リファレンス)
http://msdn.microsoft.com/en-us/libra...


↓ ここから,欲しい情報を格納しているクラスを見つける。


Win32_Processor Class
http://msdn.microsoft.com/en-us/libra...


Win32_LogicalMemoryConfiguration Class
http://msdn.microsoft.com/en-us/libra...

WSHからWMI


通称SWbemLocatorと呼ばれるオブジェクトを生成すれば,WBEMサーバに接続して,WQLを発行し,各種デバイスの情報を取得できる。

WbemScripting.SWbemLocator
http://vbscript.g.hatena.ne.jp/keywor...

  • VBScriptでの使い方


SWbemLocator.ConnectServer Method
http://msdn.microsoft.com/en-us/libra...

  • 接続メソッド。引数を省略すると自動的にローカルマシンに接続する。(If you do not provide this parameter, the call defaults to the local computer.)

WQLを書かなくても,WMIを利用することができる。

この場合,WSHでは「GetObject」関数のお世話になる。

GetObject([pathname, class]):ファイルから取得したオートメーション オブジェクトへの参照を返します。
http://www.kanaya440.com/contents/scr...

  • CreateObjectと違う点は,ファイルパスをベースにしてオブジェクトにアクセスすること。

WMI スクリプト入門 : 第 1 部
http://msdn.microsoft.com/ja-jp/libra...

  • WQLを書かないでWMIを利用するサンプルコード
  • 「WMI スクリプト ライブラリのモニカ名である "winmgmts:" に続けてターゲット コンピュータの名前を指定して GetObject に渡します。」