WMI入门

IT部门要求统计一下各个Team手里的Windows Server,提供一个大概的配置信息,但是Server太多,逐个查看太过于麻烦,于是想到直接用VMI去获取系统数据,但是必须要本地运行。网上查找发现ManagementScope 可以实现远程登录,正好可以用ManagementScope与WMI写了一个小程序Windows Server获取信息。

1WMI

WMI 即Windows Management Instrumentation,可以通过WMI控制远程计算机。通过DCOM连接实现。还有一种通过SOAP实现管理连接的WinRM。
微软文档:https://msdn.microsoft.com/en-us/library/aa384642(v=vs.85).aspx
官方文档详尽的讲解了VIM,这里直接跳到.NET部分。
System.Management 命名空间下的类及其功能

Technology Area Classes/interfaces/configuration elements
WMI类的信息采集 ManagementObject, ManagementClass
查询数据 SelectQuery, ManagementObjectSearcher, WqlObjectQuery, ObjectQuery
异步查询数据 ManagementObjectCollection, ManagementOperationObserver
执行方法 ManagementBaseObject
异步执行方法 ManagementOperationObserver
接收事件 WqlEventQuery, ManagementEventWatcher
异步接收事件 EventArrivedEventArgs, EventArrivedEventHandler, CompletedEventArgs, CompletedEventHandler
连接远程计算机 ConnectionOptions, ManagementScope

System.Management.Instrumentation命名空间下的类及其功能

Technology Area Classes/interfaces/configuration elements
Creating data providers Instance, InstrumentationClassAttribute, InstrumentedAttribute
Creating event providers BaseEvent, Instrumentation
Registering a provider ManagementInstaller

2 WMI Queries

查询WMI的语句类似于SQL,叫WQL (SQL for WMI)
例如:

SELECT * FROM Win32_OperatingSystem

语法参考:https://msdn.microsoft.com/en-us/library/aa394606(v=vs.85).aspx
微软提供了很多的Win32 Provider,用于查询系统信息。具体需要哪些和对应查询出来的字段含义请参考:https://msdn.microsoft.com/en-us/library/aa394388(v=vs.85).aspx

3代码实现

了解了如上信息,需要查询数据,要用到的类有SelectQuery, ManagementObjectSearcher, WqlObjectQuery, ObjectQuery。远程登录需要用到ConnectionOptions, ManagementScope。
代码如下:

        /// 
        /// 远程连接计算机
        /// 
        /// 计算机名称
        /// 登录用户
        /// 登录密码
        /// 
        private static  ManagementScope getManagementScope(string Host, string UID, string PWD)
        {
            ConnectionOptions connOption = new ConnectionOptions();
            connOption.Username = UID.Trim();
            connOption.Password = PWD;
            return new ManagementScope("//" + Host.Trim() + "/root/cimv2", connOption);
            //return new ManagementScope("//" + Host.Trim() + "/root/cimv2");
        }

        ///   
        /// 获取远程Windows系统的OS信息  
        ///   
        /// 远程主机  
        /// 远程主机的用户名  
        /// 密码  
        /// 操作系统信息,或报告错误信息  
        public static  string GetOSInfo(string Host, string UID, string PWD)
        {
            string rtn = "";
            ManagementScope mms = null;
            ManagementObjectSearcher cmd = null;
            ManagementObjectCollection objs = null;
            try
            {
                mms = getManagementScope(Host, UID, PWD);
                string sql = "Select * from Win32_OperatingSystem";
          
                cmd = new ManagementObjectSearcher(mms, new ObjectQuery(sql));
                objs = cmd.Get();
                foreach (ManagementObject obj in objs)
                {
                    rtn = Host + "," + obj["Caption"].ToString().Trim();
                }
                string sql2 = "Select * from Win32_Processor";
                cmd = new ManagementObjectSearcher(mms, new ObjectQuery(sql2));
                objs = cmd.Get();
                rtn += ",CUP个数,"+objs.Count.ToString();
                rtn += ",CUP型号," + objs.Count.ToString();
                foreach (ManagementObject obj in objs)
                {
                    rtn += "," + obj["Name"].ToString().Trim();
                    rtn += ",核心数," + obj["NumberOfCores"];
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                mms = null;
                if (cmd != null)
                    cmd.Dispose();
                if (objs != null)
                    objs.Dispose();
            }
            return rtn;
        }  

将服务器,用户,密码保存在一个txt文档中,读取调用生成CSV文件

static void Main(string[] args)
        {
           string[] serverList = File.ReadAllLines("server.txt");
            ListInfoList= new List();
            foreach (string item in serverList)
            {
                string[] infos = item.Split('\t');
                if (infos.Count() == 3)
                {
                    try
                    {
                        string result = GetOSInfo(infos[0], infos[1], infos[2]);
                       InfoList.Add(result);
                        Console.WriteLine(result);
                    }
                    catch(Exception ex)
                    {
                        Console.WriteLine(infos[0]+":"+ex.Message);
                    }
                }
            }
            File.WriteAllLines("server.csv", InfoList,Encoding.UTF8);
            Console.WriteLine("pass any key to end");
            Console.ReadLine();
        }

你可能感兴趣的:(WMI入门)