在做程序开发时,有时候要获取系统的一些基本信息,比如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,大家可以根据自己的需要对其中的代码作修改优化。