はじめに
Windows XPに標準でインストールされているWMI(Windows Management Instrumentation)を利用することで、様々なコンピュータの管理作業を行なうことができます。
WMIの詳細については TechNet スクリプトセンターで確認してください。
ここでは.NET FraemworkからWMIを利用してpingを実行し、その結果を取り出すプログラムを作成します。
対象読者
.NET Framework からWMIを利用する管理ツールを作成したい方。
サンプルは C#で記述していますが、VB.NETへの置き換えは難しくないと思います。
必要な環境
.NET Framework ver1.1がインストールされたWindows XPマシン。
WMIを利用してpingを実行する
ネットワーク上のマシンの稼動確認をするには、相手のマシンに対してpingを実行し、その結果を確認するというのが一般的です。
WMIを利用すると、pingの結果をプログラムから扱える形で取り出すことができるため、自分なりの死活監視ツールを簡単に作成することができます。
サンプルとして、複数のマシン名、またはIPアドレスを引数として渡すことにより、そのマシンに対してping を実行するコンソールアプリケーションを作成してみます。
using System; using System.Management; class PingExec { public static void Main(string[] args) { if(args.Length > 0) { foreach(string arg in args) { // クエリ文字列の設定 ManagementObjectSearcher searcher = new ManagementObjectSearcher( "select * from Win32_PingStatus where address = '" + arg + "'"); // クエリ結果のとりだし foreach( ManagementObject mo in searcher.Get() ) { // 結果のプロパティのチェックと状態の表示 if(mo.Properties["StatusCode"].Value == null || Convert.ToInt32(mo.Properties["StatusCode"].Value) != 0) { Console.WriteLine(arg + ":稼働していません"); } else { Console.WriteLine(arg + ":稼働中"); Console.WriteLine("IPAddress:" + mo.Properties["ProtocolAddress"].Value); Console.WriteLine("ResponseTime:" + mo.Properties["ResponseTime"].Value); } } Console.WriteLine("----------------"); } } } }
.NET FrameworkではSystem.Management
名前空間に存在しているクラスからWMIにアクセスできます。
上記サンプルでは、ManagementObjectSearcher
クラスのコンストラクタにクエリ文字列を渡し、Get
メソッドでそのクエリの結果を取り出しています。そして、その結果が持っているプロパティの内容を確認して、状態を表示しています。
このサンプルでわかるように、WMIのクエリはSQL文のクエリとよく似た形式になっています。from句にはテーブルのかわりにWMIのクラスを指定します。そして、where句にはクラスに合わせた選択条件を記述することになります。また、実行結果を確認するには、ManagementObject
クラスのProperties
メソッドにWMIクラスが持つプロパティ名を設定することで状態を取り出しています。
WMIにどのようなクラスがあり、そのクラスがどのようなプロパティを持っているか、また、どのようなクエリを記述することで利用できるか、を調べるにはTechNetスクリプトセンターのスクリプト一覧でサンプルを探すのがもっともわかりやすいでしょう。実際に上記のサンプルはスクリプト一覧の中の「コンピュータにpingを実行」を参考にして作成しています。
この他にWMIを使ったいくつかの管理ツールの例を筆者のサイト「どっとねっとふぁんblog」の「C#からWMIを利用してみよう」で見ることができますので、こちらも参考にしてください。
強い型付けされたWMIクラスを利用する
上記のサンプルではクエリとプロパティはすべて文字列でした。このため、文字列中にタイプミスがあったとしても、実行時までエラーは確認できません。
.NET Framework SDKに含まれる 「MgmtClassGen」ツール(MgmtClassGen.exe)を利用すると、強い型付けをされたWMIクラスを作成することができます。この使い方を見てみましょう。
MgmtClassGenツールの使い方は簡単です。パスが通っていてMgmtClassGenツールが実行できる環境で、コマンドプロンプトから以下のように入力してください。
> MgmtClassGen Win32_PingStatus
これで「PingStatus.CS」というファイルが自動的に生成され、そのファイルの中にPingStatus
クラスが作成されます。このPingStatus
クラスを利用するサンプルは以下のようになります。
using System; using ROOT.CIMV2.Win32; class PingExec2 { public static void Main(string[] args) { if(args.Length > 0) { foreach(string arg in args) { // 選択条件の設定と結果の取り出し foreach( PingStatus ps in PingStatus .GetInstances("address = '" + arg + "'") ) { // 結果のチェックと状態の表示 if(ps.IsStatusCodeNull || ps.StatusCode != 0) { Console.WriteLine(arg + ":稼働していません"); } else { Console.WriteLine(arg + ":稼働中"); Console.WriteLine("IPAddress:" + ps.ProtocolAddress); Console.WriteLine("ResponseTime:" + ps.ResponseTime); } } Console.WriteLine("----------------"); } } } }
System.Management
名前空間の代わりに、「PingStatus.CS」ファイルに定義された ROOT.CIMV2.Win32
名前空間を指定していることに注意してください。
このサンプルは「PingStatus.CS」ファイルと一緒にコンパイルすることで、実行ファイルを作成することができます。
ここでは文字列は選択条件の部分にしかでてきませんので、コンパイルの時点でタイプミス等の多くはチェックされることになります。また、「PingStatus.CS」ファイルを Visual Studio .NET 2003に読み込ませた場合、各プロパティはインテリセンスによって補完されるようになります。このため、効率的な開発が可能になります。
まとめ
System.Management
名前空間に含まれるクラスを利用することで、WMIを利用した管理ツールを作成することができます。- SDKに含まれるMgmtClassGenツールを利用すると、強い型付けをされたWMIクラスを生成することができます。
参考資料
- TechNetスクリプトセンター
- どっとねっとふぁん 『C#からWMIを利用してみよう』
- Microsoftダウンロードセンター 『Visual Studio .NET 2003 Server ExplorerでのWMIベースの管理拡張機能』