ユーザ用ツール

サイト用ツール


ja:visual_csharp:wmiから情報を取得する

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それぞれのサンプルコードの生成と、そのサンプルコードのコンパイルと実行(!!)までできちゃう。
こちらからダウンロードして使ってみてください。
たしか動かすには.Net Framework 3.5が必要だったよーな気がする。

ja/visual_csharp/wmiから情報を取得する.txt · 最終更新: 2020/02/16 07:41 by makoto