在做程序开发时,有时候要获取系统的一些基本信息,比如CPU、内存等,甚至需要获取远程机器的一些信息,而通常我们可以通过WMI来获取这些信息;但是WMI有很多命名空间,每个命名空间中又有很多对象(如WIN7下root/CIMV2命名空间下有1215个对象),而每个对象会有多个属性(Win32_LogicalDisk对象在WIN7下有40个属性),并且有一条或者多条数据记录(如Win32_LogicalDisk表示磁盘,有几个盘,就会有几条记录),并且不同操作系统版本,这些数据是有差异的。
对于刚开始接触WMI的朋友,可能很难找到WMI的一些命名空间和对象,并且对于这些对象的属性又不是很清楚。所以在这里分享一个WMI助手,帮助查询。
一。首先建立一个winform窗口SchemaBrowerForm,把以下代码复制进去(参考MSDN)。
public partial class SchemaBrowerForm : Form { private System.Windows.Forms.Label lblNameSpace; private System.Windows.Forms.Label lblResult; private System.Windows.Forms.TextBox txtNameSpace; private System.Windows.Forms.ListBox lbResult; private System.Windows.Forms.Button btnQuery; private int count; private System.Windows.Forms.Label lblStatus; private System.Windows.Forms.Label lblStatusShow; public SchemaBrowerForm() { Control.CheckForIllegalCrossThreadCalls = false; count = 0; InitializeComponent(); } private void btnQuery_Click(object sender, System.EventArgs e) { count = 0; this.lbResult.Items.Clear(); if (txtNameSpace.Text.Equals("")) { this.AddNamespacesToList(); } else { System.Threading.ThreadPool. QueueUserWorkItem(new System.Threading.WaitCallback(this.AddClassesToList)); } //WaitCallback指定回调函数,不过回调函数需要参数object } private void AddNamespacesToList() { //查询所有命名空间 try { ManagementClass nsClass =new ManagementClass( new ManagementScope("root"), new ManagementPath("__namespace"), null); foreach (ManagementObject ns in nsClass.GetInstances()) { this.lbResult.Items. Add("root/"+ns["Name"].ToString()); count++; } this.lblStatusShow.Text ="共有 "+count + " 个命名空间"; } catch (ManagementException e) { this.lblStatusShow.Text = e.Message; } } private void AddClassesToList(object o) { try { ManagementObjectSearcher searcher = new ManagementObjectSearcher( new ManagementScope(txtNameSpace.Text),new WqlObjectQuery("select * from meta_class"),null); foreach (ManagementClass wmiClass in searcher.Get()) { this.lbResult.Items.Add(wmiClass["__CLASS"].ToString()); count++; } this.lblStatusShow.Text ="共有 "+count +" 个类"; } catch (ManagementException ex) { this.lblStatusShow.Text = ex.Message; } } private void lbResult_SelectedIndexChanged(object sender, EventArgs e) { txtNameSpace.Text = lbResult.SelectedItem.ToString(); } }
二、这是一个查询命名空间、以及命名空间下对应的对象的界面。
三、至此,我们基本上可以查询出所有WMI相关的命名空间以及对象。但是如何查询对象对应的属性呢,以及对应的数据记录条数呢?我们先上截图,后上源码。
(1)查询对象的所有记录,只需要录入对象名称即可,此对象就是前面查询得来的WMI对象。(如WIN7下查询本机的内存条记录)
(2)假如我们不需要那么多属性值得时候,可以在属性输入框中输入属性,以逗号隔开,后面的条件中可以加查询条件。
(3)可能大家注意到了,前面有两个勾选项,一个“本地”,一个“只查询属性”。
“本地”勾选了,表示只查询本机的数据,如果去掉此勾选,然后设置好远程机器的连接,就可以查询远程机器的信息了;
“只查询属性”,表示只查询WMI对象的属性,而不查询其对应的值,并且属性、条件两个输入框灰显无效。
我们现在就测试一下远程机器,并且只查询属性(如果查询本机WIN7的话应该是48个属性,这个是远程的WINSERVER2012的环境,所有CPU的属性有51个):
(4)由于这只是一个辅助开发的工具,代码写得十分丑陋,就不贴出来了。直接附上源码的网盘链接 http://yunpan.cn/cZGerNCyUScea 访问密码 f678,大家可以根据自己的需要对其中的代码作修改优化。