====== WMIから情報を取得する ======
WMI(Windows Management Instrumentation)は、Windowsのいろいろな情報を取得できる、超素敵なしくみ。\\
Windowsの情報はかなりの情報がここから取得できる。\\
ただし、取得の方法は何かクラスを生成して、getHogehoge()!!みたいに簡単には取得できず、ちょっと独特な方法を使う。
===== 方法1 =====
サンプルとして、Windowsのバージョン文字列を取得してみる。\\
この方法はSytem.Management名前空間のクラス群を使って取得する方法。\\
欲しい情報を持っているManagementClassを生成して、GetInstances()メソッドでManagementObjectCollectionを取り出し、それをforeachで1つずつ処理する。
using System.Management;
public string getOSName()
{
StringBuilder s = new StringBuilder();
System.Management.ManagementClass mc =
new System.Management.ManagementClass("Win32_OperatingSystem");
System.Management.ManagementObjectCollection moc = mc.GetInstances();
foreach (System.Management.ManagementObject mo in moc)
{
s.Append(mo["Caption"]);
if (!"".Equals(mo["CSDVersion"]) || null == mo["CSDVersion"])
{
s.Append(" ");
s.Append(mo["CSDVersion"]);
}
}
return s.ToString();
}
===== 方法2 =====
サンプルとして、方法1同様Windowsのバージョン文字列を取得してみる。\\
こちらはManagementObjectSearcherクラスを生成し、そこからGet()メソッドでManagementObjectのコレクションを取り出してforeatchで処理する。\\
foreachの中は方法1と同じ。\\
SQLっぽい文字列使ってます。WQLとか言うらすぃ。。。
using System.Management;
public string getOSName()
{
try
{
StringBuilder s = new StringBuilder();
System.Management.ManagementObjectSearcher searcher =
new System.Management.ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_OperatingSystem");
foreach (System.Management.ManagementObject mo in searcher.Get())
{
s.Append(mo["Caption"]);
if (!"".Equals(mo["CSDVersion"]) || null == mo["CSDVersion"])
{
s.Append(" ");
s.Append(mo["CSDVersion"]);
}
}
}
catch (ManagementException)
{
Console.WriteLine("OSName get failed.");
}
return s.ToString();
}
===== 方法3 =====
プログラムとして情報採取するのではなく、バッチファイルなどで使用する場合、頑張ってコンソールアプリケーションとか作らなくてもPowerShellが素敵にやってくれる。\\
==== 例 ====
PS C:\Uesrs\UserA> Get-WmiObject Win32_BIOS
SMBIOSBIOSVersion : R0XET63W (1.40 )
Manufacturer : LENOVO
Name : R0XET63W (1.40 )
SerialNumber : ********
Version : LENOVO - 1400
単純なものなら、これでOKだけど、大量に出てくるやつの場合は絞り込みも可能。\\
''-query''オプションを使ってSQLライクに書く。
PS C:\Users\UserA> Get-WmiObject -query "SELECT * FROM Win32_Service Where StartMode='Disabled'"
(中略)
ExitCode : 1077
Name : UevAgentService
ProcessId : 0
StartMode : Disabled
State : Stopped
Status : OK
ExitCode : 1077
Name : WebManagement
ProcessId : 0
StartMode : Disabled
State : Stopped
Status : OK
ちなみに、バッチファイルでやる場合はPowerShell -Commandとはを使えばほとんどそのまま処理可能。
C:\Users\UserA> PowerShell -Command "Get-WmiObject -query 'SELECT * FROM Win32_PageFileSetting'"
MaximumSize Name Caption
----------- ---- -------
16384 c:\pagefile.sys c:\ 'pagefile.sys'
===== 情報を探すには…? =====
どこにどんな情報があるのかはMSDNのライブラリとかをくまなく見ればわかるんですが、正直探すのが大変なので、おすすめは**WMICodeCreator**。\\
Microsoft謹製のソフトで、情報のありかを探すのはもちろん、VB、VC#、VBSそれぞれのサンプルコードの生成と、そのサンプルコードのコンパイルと実行(!!)までできちゃう。\\
[[http://www.microsoft.com/en-us/download/details.aspx?id=8572|こちらからダウンロード]]して使ってみてください。\\
たしか動かすには.Net Framework 3.5が必要だったよーな気がする。