WMI入门
 

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。

  代码如下:

  /// <summary>

  /// 远程连接计算机

  /// </summary>

  /// <param name="Host">计算机名称</param>

  /// <param name="UID">登录用户</param>

  /// <param name="PWD">登录密码</param>

  /// <returns></returns>

  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");

  }

  /// <summary>

  /// 获取远程Windows系统的OS信息

  /// </summary>

  /// <param name="Host">远程主机</param>

  /// <param name="UID">远程主机的用户名</param>

  /// <param name="PWD">密码</param>

  /// <returns>操作系统信息,或报告错误信息</returns>

  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");

  List<string>InfoList= new List<string>();

  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();

  }