3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.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つしか返ってこなくてもループでまわしていることが多いので、そうしました。

ほんとにいろんな情報取れるので、時間あったらどこまでの情報がとれるのか試してみたいものですね。