(.Net)遅延バインディングを使わず WMI からハードウェア情報を取得
(.Net)VB.Netには遅延バインディング足るものがあった!!の続きです。

WMIの情報取得を遅延バインディングを使わずに取得する方法です。
実は WMI を今まで使ったことないのでちょこっと調べるのに手間取りました。
今回取得したいのはPCの型番、製造番号というハードウェア固有情報と、OSのProductIDといった情報です。

で、.Net Framework だと System.Management 名前空間配下のクラスを使うことで、簡単に WMI にアクセスできるようですね。
ということで、 System.Management を参照設定する必要があります。
参考にさせていただいたのは宇宙仮面の C# プログラミング:WMI
いくつか方法はあるようですが、SQLちっくな WQL(WMI Query Language) を使って WMI オブジェクトを取得する方法にしてみました。
困ったのは WMI のクラスのリファレンスです。WMI のクラスはあまりに膨大であり、情報も少ないためほしい情報をもっているクラスを見つけるのに苦労します。
まず、よく使うクラスはここで列挙されてるのであたりを付けます。
そして、クラスの詳細やメンバはMSDN:Win32 Classesで調べます。ただ英語サイトしか情報ないのが残念ですね。さっさと日本語の情報のっけてほしいものです。
(後、クラスの一覧やメンバを知るツールとして、wbemtest.exe というものがあるらしいので、ファイル名指定して実行し、確認する方法もありかも知れません。)

ということで、ManagementObjectSearcher + WQLを使って幾つかの情報を取得するコードのサンプル(C#)です。

Console.WriteLine("SELECT * FROM Win32_ComputerSystem ");
ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem ");
ManagementObjectCollection queryCollection1 = query1.Get();
foreach (ManagementObject mo in queryCollection1)
{
Console.WriteLine("Model: " + mo["Model"]);
Console.WriteLine("Name: " + mo["Name"]);
Console.WriteLine("UserName: " + mo["UserName"]);
}
Console.WriteLine("");
 
Console.WriteLine("SELECT * FROM Win32_ComputerSystemProduct ");
query1 = new ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystemProduct ");
queryCollection1 = query1.Get();
foreach (ManagementObject mo in queryCollection1)
{
Console.WriteLine("IdentifyingNumber: " + mo["IdentifyingNumber"]);
Console.WriteLine("Name: " + mo["Name"]);
Console.WriteLine("Vendor: " + mo["Vendor"]);
Console.WriteLine("Version: " + mo["Version"]);
Console.WriteLine("Caption: " + mo["Caption"]);
Console.WriteLine("SKUNumber: " + mo["SKUNumber"]);
Console.WriteLine("Description: " + mo["Description"]);
}
Console.WriteLine("");
 
Console.WriteLine("SELECT * FROM Win32_OperatingSystem ");
query1 = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem ");
queryCollection1 = query1.Get();
foreach (ManagementObject mo in queryCollection1)
{
Console.WriteLine("SerialNumber: " + mo["SerialNumber"]);
Console.WriteLine("BootDevice: " + mo["BootDevice"]);
Console.WriteLine("BuildNumber: " + mo["BuildNumber"]);
Console.WriteLine("BuildType: " + mo["BuildType"]);
Console.WriteLine("InstallDate: " + mo["InstallDate"]);
//↓はVistaでのエディションを表すらしいので、XPや2003で動かすと例外発生する。。
//Console.WriteLine("OperatingSystemSKU: " + mo["OperatingSystemSKU"]);
Console.WriteLine("PlusProductID: " + mo["PlusProductID"]);
Console.WriteLine("SystemDevice: " + mo["SystemDevice"]);
Console.WriteLine("SystemDirectory: " + mo["SystemDirectory"]);
Console.WriteLine("SystemDrive: " + mo["SystemDrive"]);
}
Console.WriteLine("");

取得したWMIオブジェクトをループでまわしてますが、大抵のサンプルでも1つしか返ってこなくてもループでまわしていることが多いので、そうしました。
ほんとにいろんな情報取れるので、時間あったらどこまでの情報がとれるのか試してみたいものですね。
[PR]
by jehoshaphat | 2009-06-10 00:56 | .Net開発 | Trackback | Comments(2)
トラックバックURL : http://jehupc.exblog.jp/tb/10402715
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。
Commented by なっち at 2014-02-06 15:47 x
おおー!参考になります!
文章の最後が「時間あったらどこまでどれる・・・」になってますw
Commented by jehoshaphat at 2014-02-11 15:45
3流PGです。
指摘ありがとうございます。どうも誤字脱字が多いものでorz


<< DELLのOSのProduct... (.Net)VB.Netには遅... >>