一部の情報は非常に古いもの(20年以上前〜)ですので、利用する際はご注意ください(Java 1.4 とか .NET 1.0 とか、Windows 2000 とか)
お問い合せは wiki@shise.net まで。Gmail に転送されるので、スパムは全部カットされます。
WMIで何が出来るのか
WMI は Windows 上でいろんな情報を取得することが出来る機能です。
どんな情報が取れるかというと、
- CPU名、CPU数、L2キャッシュサイズ、クロック周波数、など・・・
- 物理メモリ量、仮想メモリ量、物理メモリ使用量、メモリー枚数など・・・
- NIC名、NIC枚数、NICのマックアドレス、IPアドレス、サブネットマスク、リンク速度、など・・・
- ネットワーク使用率、送信バイト数、受信バイト数、など・・・
- OS のバージョン、コンピュータ名、ドメイン名、言語、など・・・
- ターミナルサービスの、セッション数、ログインユーザーのメモリ使用量、ログイン時間、など・・・
自分がいじった事があるのは、このへんですが、他にも、セキュリティソフトの情報だとか、インストールされてるソフトの情報だとか、・・・・なんかもう、いろいろ取得出来ます。
もちろん、API を叩けば取得できなくも無いんですが、WMI 一つで、こんな詳細な情報を取得できるわけです。
特に C# の場合は、API 叩くのが面倒なので、その点、WMI は素敵です。
実際に、どんなデータが取得できるのかを見たい場合は、WMIで情報取得するツールのコードをコンパイルして、実行してみてください。
あと、この辺とか参考になるかも。
http://www.anchorsystems.co.jp/anchor/ashp/netmon/samples/wmi_os.html
WMIのメモ
WMI の使い方の流れとしては、
- クラス(情報のかたまり?)を取得
- クラスから、コレクション(データの配列みたいな)を取得
- コレクションから一つオブジェクトをとりだす。
- オブジェクトのプロパティを取得する。
こんな感じ。
コレクションに複数データがあるのは、
例えば CPU が複数ある場合・・・。
- CPUの情報を取得するクラスを生成
- CPU一覧を取得
- CPU一覧から、1つ目を取得
- 取得した1つ目のCPU情報の詳細を見る。
というイメージで、一覧を取得したら、繰り返し処理する可能性がある。
CPUが一つしか無いマシンであれば、CPU一覧にデータは一つしか無い。
実際にコード
Win32_Processor クラスを使用して、CPU一覧の情報をコンソールに出力するサンプル(抜粋)
参照の追加で、「System.Management」 を追加して、
using System.Management;
// クラスを取得 ManagementClass mc = new ManagementClass("Win32_Processor"); // CPU一覧を取得 ManagementObjectCollection moc = mc.GetInstances(); Console.WriteLine("-------------------------"); // CPU情報を一つずつ取り出す foreach (ManagementObject mo in moc) { // 情報を表示 Console.WriteLine("DeviceID = {0}", mo["DeviceID"]); Console.WriteLine("Name = {0}", mo["Name"]); Console.WriteLine("MaxClockSpeed = {0}", mo["MaxClockSpeed"]); Console.WriteLine("L2CacheSize = {0}", mo["L2CacheSize"]); Console.WriteLine("-------------------------"); }
こうすると、CPUの情報一覧が表示されると思う。
ただ、Win32_Processor での情報取得処理は、なぜか時間がかかる。
理由は良く知らんが、情報は取れてるから問題ないだろう。
他にどんな情報が取れるかは、WMIで情報取得するツール を参照。
その他メモ
ローカルのドライブを列挙する
注意
.NET Framework 2.0 から、System.IO.DriveInfo というクラスが出来ました。
こいつを使うと、WMI を触らずに、しかも簡単にハードディスクの空き容量などを取得することが出来ます。
なので、ドライブの情報を取るために、無理に WMI を使う必要はありません。
- 使用するクラス
- Win32_LogicalDisk
- ドライブの種類
- MediaType ? DriveType ?
- DriveType
- 2 3.5インチフロッピードライブ
- 3 ハードディスクドライブ
- 5 CD-ROM ドライブ
- MediaType
- 5 3.5インチフロッピードライブ
- 12 ハードディスクドライブ
- 11 CD-ROM ドライブ
- ドライブ番号
- DeviceID
- ファイルシステム
- FileSystem
- 全容量
- Size
ディスクが無かったら null
- 空き容量
- FreeSpace
その他
これの注意点としては、フロッピーの容量を調べようとして(?)、その結果フロッピーにアクセスしようとします。CDも同様。
ManagementObjectSearcher を使って、
SELECT * FROM Win32_LogicalDisk WHERE DriveType <> 2
ってしても、一緒。
どーしてもフロッピーにアクセスしてしまうみたい。
ローカルのハードディスクだけを列挙するだけなら、Win32_DiskDrive を使うっぽ?