다음을 통해 공유


[WMI Sample Code (Managed VB / C#)] WMI でクラスを列挙する方法のサンプル (exe、ソリューションつき)

   皆様こんばんは、今東京は 20:50 分でございます。ういこです。

ちょっと脳が痛いです。もしかしたら私も流行の最先端を行ってインフルエンザになってたらいやです(※昨日からお父さんがインフルエンザ B になっています)。最近すっかり頭が春めいたお父さんがいないオフィスは寂しいです。

さて、今日は寂しいので、私も WMI とやらのプログラムをにょろっと作ってみました。しかも VB 2005 (たぶん VB.NET 以降と、VB2008 でも動くと思うです) と C# で。

今回もソリューションと実行ファイルつきでございますー。いやらしくいじくり倒してみてくださいね♪

ダウンロードはこちら ⇒ JPILMBLG(2009Apr23).zip

元ねたは下記の MSDN ですが、ローカルにログを出力してあげる処理を追加して、ついでに処理を最低限必要な量にシェイプしております。

 

方法 : WMI 名前空間のクラスを一覧表示する

https://msdn.microsoft.com/ja-jp/library/ms257362(VS.80).aspx

 

Visual Basic (Managed)

Imports System.Management

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        'Dim sw As New System.IO.StreamWriter("c:\temp\testvb.log", False, System.Text.Encoding.GetEncoding(0))

        Dim sw As New System.IO.StreamWriter(TextBox1.Text, False, System.Text.Encoding.GetEncoding(0))

        Try

    Dim wmiClass As ManagementClass

            'Dim ms As New ManagementScope("root/CIMV2")

            Dim ms As New ManagementScope(TextBox2.Text)

            'Dim woq As New WqlObjectQuery("select * from meta_class")

            Dim woq As New WqlObjectQuery(TextBox3.Text)

            Dim mos As New ManagementObjectSearcher(ms, woq, Nothing)

           

            For Each wmiClass In mos.Get()

                Console.WriteLine(wmiClass.ToString())

                System.Diagnostics.Debug.WriteLine(wmiClass.ToString())

                sw.Write(wmiClass.ToString() & vbLf)

            Next wmiClass

        Catch ex As ManagementException

            MessageBox.Show("ManagementException 発生!: " & vbLf & ex.Message.ToString())

            System.Diagnostics.Debug.WriteLine("ManagementException 発生!: " & vbLf & ex.Message.ToString())

        Catch ex1 As System.IO.IOException

            MessageBox.Show("IOException 発生!: " & vbLf & ex1.Message.ToString())

            System.Diagnostics.Debug.WriteLine("IOException 発生!: " & vbLf & ex1.Message.ToString())

        Finally

            ' StreamWriter は必ずクローズ!

            sw.Close()

        End Try

    End Sub

End Class

C#

using System;

using System.Windows.Forms;

using System.Management;

namespace WindowsApplication11

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            System.IO.StreamWriter sw = new System.IO.StreamWriter(TextBox1.Text, false, System.Text.Encoding.GetEncoding(0));

            try

            {

                // ManagementScope ms = new ManagementScope("root/CIMV2");

                ManagementScope ms = new ManagementScope(TextBox2.Text);

                // WqlObjectQuery woq = new WqlObjectQuery("select * from meta_class");

                WqlObjectQuery woq = new WqlObjectQuery(TextBox3.Text);

                ManagementObjectSearcher mos = new ManagementObjectSearcher(ms, woq, null);

                foreach (ManagementClass wmiClass in mos.Get())

                {

                    Console.WriteLine(wmiClass.ToString());

                    System.Diagnostics.Debug.WriteLine (wmiClass.ToString());

                    sw.Write(wmiClass.ToString() + "\n");

                }

            }

            catch (ManagementException ex)

            {

                MessageBox.Show("ManagementException 発生!: " + "\n" + ex.Message.ToString());

                System.Diagnostics.Debug.WriteLine("ManagementException 発生!: " + "\n" + ex.Message.ToString());

            }

            catch (System.IO.IOException ex1)

            {

                MessageBox.Show("IOException 発生!: " + "\n" + ex1.Message.ToString());

                System.Diagnostics.Debug.WriteLine("IOException 発生!: " + "\n" + ex1.Message.ToString());

            }

            finally

            {

                sw.Close();

            }

        }

    }

}

【解説】

.NET Framework では WMIの情報を操作するには System.Management 名前空間をつかいます。クラスの一覧を見たい場合は、System.Management.ManagementObjectSearcher クラスにより、クエリすることで取得することができます。(コード中の、"SELECT * FROM meta_class" の部分です!)また、ManagementScope で、"root/default" のような設定をしたり、今回の "CIMV2" といったように明示的に名前空間を指定することにより、希望のクラスの一覧を取得することができます。便利。

-- 参考情報

ManagementObjectSearcher Class

https://msdn2.microsoft.com/ja-jp/library/system.management.managementobjectsearcher(vs.80).aspx

SELECT Statement for Schema Queries :

https://msdn2.microsoft.com/en-us/library/aa393278.aspx

ManagementScope Class

https://msdn2.microsoft.com/ja-jp/library/system.management.managementscope(VS.80).aspx

WqlObjectQuery Class

https://msdn2.microsoft.com/ja-jp/library/system.management.wqlobjectquery(vs.80).aspx

こんな感じです。なんか頭が回らないので、今日はそろそろ帰ります。ちなみに 23 時半から全世界の ILM 一家だよ全員集合(またの名をテレフォンカンファレンス)があるんですよね…英語かぁ。翻訳こんにゃくが(以下略

~ ういこう@これから帰っても息子は寝ている ~

 

(2009/04/24 Update) 修正プログラムのインストール状況を調べるサンプルを作りました。

ファイル出力のところがおバカやってたので、その分の修正版のソリューションと、Debug 版ランタイムが入ってないと動かないかもなので、Release 版をつけたサンプルを以下の記事で Up しています。あわせてご参考いただければ幸いです。

 

[WMI] PC にインストールされている更新プログラム情報を取るために WMI "Win32_QuickFixEngineering" を使用する方法
https://blogs.technet.com/jpilmblg/archive/2009/04/24/how_2D00_to_2D00_get_2D00_qfe_2D00_code_2D00_managed_2D00_vb_2D00_c_2D00_wmi_2D00_exe.aspx.aspx

JPILMBLG(2009Apr23).zip