[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