====== 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が必要だったよーな気がする。