Share via


[WMI Sample Code (Managed VB / C#)] PC にインストールされている更新プログラム情報を取るために WMI "Win32_QuickFixEngineering" を使用する方法のサンプル (exe、ソリューションつき)

みなさんおはようございます。ういこです。

昨日の夜は今日来れないんじゃないかとドキがムネムネしてしまいましたが、残念ながら余裕で出社できる状態になってしまいました。でも仕事が大事だから、自分の丈夫さがうれしいです!ということにしてください。

さて、昨日の夜に WMI で PC にインストールされている QFE (修正モジュール) の一覧を取るときの注意を書いたのですが、WMI をこれから始められるかたからしたらどうやって取ればいいか、その時点からわからん!というかたもいるかなと思い当たりました。そもそも、スクリプト センターなどにスクリプトはあるのですが、VBScript なんですよね。.NET アプリで対応されたい方もいらっしゃるかと思いますので、簡単ですがまた VB Managed と C# でサンプルを書いてみました。

昨日アップしたのと同じく、サンプル (ソリューションつき) ダウンロード可能にしてますです。いつものとおり、やる気のないソリューション名なのは勘弁してください。

よく考えたら、昨日のサンプル、Release ビルドじゃないから、デバッグ版モジュールが入ってない環境だと Exe も動かないんですよね。だから Release ビルドつきにしてみました。Exe だけ実行されたい方は、release フォルダの exe を実行してください。

\WindowsApplication10\WindowsApplication10\bin のしたに Debug と Release というフォルダがあります。

サンプル プログラムのダウンロードはこちら♪ ⇒ JPILMBLG(2009Apr24).zip

昨日の記事はこちら ⇒

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

https://blogs.technet.com/jpilmblg/archive/2009/04/23/wmi-sample-code-managed-vb-c-wmi-exe.aspx

[WMI] PC にインストールされている更新プログラム情報を取るために WMI "Win32_QuickFixEngineering" を使用しても取得できないものがある

https://blogs.technet.com/jpilmblg/archive/2009/04/24/wmi-pc-wmi-win32-quickfixengineering.aspx

あと、ちまちま変更があります。

1. ファイル出力を Write から WriteLine にしました。改行がはいらないなーと思ってましたが、WriteLine なら改行つきで出力してくれるなんて太っ腹!全くこっち使おうって昨日は思い至りませんでした。(私のバカ)

2. ManagementClass を ManagementObject にしました。

ちなみに、select * from meta_class でクエリする昨日のサンプルも、ManagementObject にしても大丈夫です。ただ、バリエーションとしてサンプルには残しました。

【コード サンプル】

Visual Basic (Managed)

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.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))

        Dim wmiClass As ManagementObject 'ここを ManagementObject にしました

        Try

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

            Dim woq As New WqlObjectQuery("Select * from Win32_QuickFixEngineering")

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

            For Each wmiClass In mos.Get()

                System.Diagnostics.Debug.WriteLine("HotFixID : " & wmiClass("HotFixID").ToString())

                System.Diagnostics.Debug.WriteLine("Description : " & wmiClass("Description").ToString())

                System.Diagnostics.Debug.WriteLine("ServicePackInEffect : " & wmiClass("ServicePackInEffect").ToString())

           sw.WriteLine("HotFixID : " & wmiClass("HotFixID").ToString())

                sw.WriteLine("Description : " & wmiClass("Description").ToString())

                sw.WriteLine("ServicePackInEffect : " & wmiClass("ServicePackInEffect").ToString())

     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

C#

        private void button2_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");

                WqlObjectQuery woq = new WqlObjectQuery("Select * from Win32_QuickFixEngineering");

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

                         // ここを ManagementObject にしました

                foreach (ManagementObject wmiClass in mos.Get())

                {

                    System.Diagnostics.Debug.WriteLine("HotFixID : " + wmiClass["HotFixID"].ToString());

                    System.Diagnostics.Debug.WriteLine("Description : " + wmiClass["Description"].ToString());

                    System.Diagnostics.Debug.WriteLine("ServicePackInEffect : " + wmiClass["ServicePackInEffect"].ToString());

                    Console.WriteLine("HotFixID : " + wmiClass["HotFixID"].ToString());

                    Console.WriteLine("Description : " + wmiClass["Description"].ToString());

                    Console.WriteLine("ServicePackInEffect : " + wmiClass["ServicePackInEffect"].ToString());

                    sw.WriteLine("HotFixID : " + wmiClass["HotFixID"].ToString());

                    sw.WriteLine("Description : " + wmiClass["Description"].ToString());

                    sw.WriteLine("ServicePackInEffect : " + wmiClass["ServicePackInEffect"].ToString());

                }

            }

            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

            {

           // StreamWriter は必ずクローズ!

                sw.Close();

            }

   }

というわけです。WMI を身近に感じていただければと思います。あ、一点注意点を…。WMI、便利なんですが、すっごい遅いです。大量に処理があると、遠くに逃げたくなるくらいです。というわけで、上記サンプルを実行する際も、無我の境地でお待ちいただければ、いずれ終わるかと思いますのでお待ちください。

~ ういこう@バイオハザードといえば、”うま” だよね ~

JPILMBLG(2009Apr24).zip