◆VBA (VB6)でのWindows Service制御 - WMI編

[ 上へ ] [ Service - VB2005 - 前準備 ] [ Service - VBA(VB6) - Win32 API編 ] [ Service - VBA(VB6) - WMI編 ] [ Service - VC++ 2005 - Win32API編 ]

始める前に、ここを読んでください

・WMIとは

以前は、サービスやプロセス、レジストリなどシステムの情報にアクセスするには、 前述のWin32 APIで処理するしかありませんでした。VB、VBAでもできるのですが、C言語で書かれて いるのでやはりC/C++での作業が多かったと思います。その高い敷居をぐっと低くしてくれる 便利なツール・ユーティリティがWMIです。WMIではCOMベースのライブラリ ( WMI スクリプトライブラリ)が用意されていますので、VBAなどの開発言語だけでなく、 VB Script、JScriptなどのスクリプト言語からでも利用できます。 このライブラリを使えば、あっという間に?Windowsサービスが制御できてしまいます。そこで、 ライブラリが利用しようとしているWMIの概要を先に書いて、その後VBAで実装します。

まずは、WMIのインストールですが、Windows2000、XPユーザでしたら既にインストールされて、 サービスとして実行されています。コントロールパネル→管理ツール→サービスでサービスの 一覧を表示してください。その中に Windows Management Instrumentationがあると思うので、 ダブルクリックしてください。

もし、Windows 98ユーザなどでしたら、 こちらからダウンロードしてインストールしてください。

WMIを利用するには、 WMI スクリプト ライブラリ のオブジェクトからこのサーバ(CIMOM)に 接続します。サーバがWMIの他のシステムと交信し、情報をやり取りしてくれます。この辺の アーキテクチャにかかわる部分は本題はないですし、WMIを使うにあたってあんまり意識する 必要はないと思うので興味がある方は英語ですが ここをご覧ください。

・WMIの構成

<名前空間>
WMIのアーキテクチャはわからなくても、それがどうゆう構成 (装備といったほうがいいのかな?)をしているのかを知っておかなければ利用できません。 この構成・装備をMicrosoftはCIMと呼んでいます。
例えば、自動車の場合、エンジンはどうやってできているのとか、ブレーキの仕組みをしらなくても 運転はできます。ですが、自動車を制御するパーツ(部品)はどのようなものがあってどこに配置 されていて、その使用法はどうなのかを知っておかないと運転できません。ここでいうパーツとは ハンドルや、アクセルペダル、ギアなどを指します。

この構成 はオブジェクト指向で使われる用語とよく似ています。名前空間、クラス、インスタンス、 継承などと名前が似ているということはそのモデルも似ているということ?です。

トップの構成レベルは名前空間です。 これより下部のレベルのスコープを制御し、ユーザは WMIスクリプトライブラリ を通じて名前空間に接続します。 名前空間は自身で拡張することができますが、どんなものがあるかは簡単に知ることができます。 コントロールパネル→管理ツール→コンピュータの管理 で表示されるダイアログで左側のペインの ツリービューのサービスとアプリケーションを拡張してください。 その中にWMIコントロールという項目が あるはずなので右クリックをしてプロパティを選択してください。 WMIコントロールのプロパティという ダイアログが表示されますのでセキュリティタブを選択してください。

Root名前空間をトップに10あまりあります。 これらのいくつかは下部にさらに名前空間があります。 このうち多くの部分がroot\CIMV2名前空間にあり今回利用 クラスもこの中にあります。

<クラス>
クラスという用語を前項で持ち出しましたが、 それは「対象物」の雛形で実体物ではありません。 例えば、「PC」はクラスで実体ではありません。 それはCPUの種類や画面の大きさなど(メンバ変数)や、キーボードを打つという動作 (メンバ関数)を定義したもので、IntelのCore2DuoのCPUで、19インチのCRTで、 キーボードを打つと画面に文字が表示される目の前で見ている物が実体物( インスタンス)です。

例えば、WMIには今回のテーマであるWindowsサービスを扱う Win32_Serviceという クラスがありますが、 前回の話題にあがったSQL Server 2005 サービスや、前項のWindows Management Instrumentation サービスがその実体(インスタンス)になります。

名前空間にこの クラス群が継承関係を含めて膨大な数?存在していて それらの関係を図示すると以下のようになります。

・ユーティリティ

WMIの構成(CIM)の概略は分かりましたが、 実際にWMIを使って何かしたいときには、膨大な量のクラスから目的のものを 探さなくてはなりません。それにいったいどんなクラス があるかもわからないので、目的のことができるかどうかもわかりせん。 そうなることがわからないMicrosoftではないので目的のクラスを簡単に探すユーティリティを ちゃんと用意してくれています。

WMI Tester (wbemtest.exe)

WMIがインストールされていればつまり、Windows2000、Windows XPユーザなら すべてに用意されています。

エクスプローラでwbemtest.exeを検索して実行すると上記のダイアログが表示されます。 GUIでそれなりに使いやすいのですが、クラス を列挙するのに基底クラスを入力しなければならなかったり、CIMの全体像が つかみづらかったりするので私はほとんど使ったことはありません。

 

CIM Studio

実は、WMIの存在を知ってからこんな便利なユーティリティがあるのことを 長い間知りませんでした。CIM Studioを知らない期間は目的のクラスを見つけ出すのに ひたすらネットを彷徨っているだけで、「WMIなんてぜんぜん使えないじゃん」と思ってました。 私がバカでした。なぜ知らなかったかというと、ひとつはWMIに標準でついていないということ、 もうひとつは、このツール、米国のMSのサイトにしかアップされていないからということです。 (英文読んでると極端に頭痛くなる)当然、英語版なのですがGUIがしっかりしてイメージが わきやすいので以外にとっつきやすいです。

以後、必要になったときはこれで説明しますので早速ダウンロードします。

WMI Administrative Tools
http://www.microsoft.com/downloads/details.aspx?familyid=6430F853-1120-48DB-8CC5-F2ABDC3ED314&displaylang=en

WMITools.exeを実行してインストールをすると、 スタート→プログラム(P)→WMI Tools以下にWMI CIM Studio、 WMI Object Browser、WMI Event Registration、WMI Event Viewの4つが登録されていると思います。 今回使うのはCIM Studioです。早速CIM Studioをクリックしてみます。

最初にConnect To namespaceとどの名前空間に接続するか聞いてきますが、デフォでroot\cimv2と なっていると思いますのでそのままOKで進んでください。ブラウザが開いたら左上のほうの「Class in」 コンボボックスの2つ右の双眼鏡のアイコン(Search for Class)をクリックしてください。そこに目的の サービスを表すクラス名Win32_Serviceを入力してGoをクリックしてください。 いくつか結果がでてくるのでWin32_Serviceを選んでOKを押すと、以下のような画面になります。

小さくてほとんど見えませんが、左側のツリービューの各アイテムは クラスをあらわし、ノードの深さは 継承関係を表します。右側のペインは、選択したクラスのメンバでいわゆるプロパティやメソッドが あります。Win32_Serviceクラスを選択して右側に現れたメンバのうちStateとStartModeが今回扱おう としているサービスの状態とスタートアップの種類です。

これでクラス名がわかったので、実際どんなインスタンスがあるか、 例えばWin32_Serviceクラスの場合はSQL ServerやWindows Installerなど コントロールパネル→管理ツール→サービスで表示される ダイアログボックスにあらわれるサービスを見てみます。

右側のペインのにあるボタンのうち左から6番目のInstancesボタンを クリックしてください。Name列にずらっとサービスのインスタンスが列挙されているので MSSQL$SQLEXPRESSをダブルクリックしてみます。 (SQL Serverがインストールされてない方は他の適当なサービスでやってみてください) すると、さまざまなプロパティとその値が表示されます。その中でStateとStartModeが目的の プロパティです。
あと、説明は省きますがクラス名とインスタンスが分かっていればObjectBrowserも よく使うのでこちらも試してみてください。

CIM StudioをつかったGUI操作でサービスの状態とスタートアップの種類を取得できました。今度は これを先に述べた WMI スクリプト ライブラリ使ってVBA(VB6)で実装していきます。