На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: maxim84_
  
> Статья по WMI , Базовые знания и ссылки
    Всем привет!
    Хочу вложить свою лепту в развитие форума .NET. Вот написал вчера кое что для FAQ.
    Опыт первый так что критике буду только рад.
    :yes:

    Введение
    WMI – это инструментарий, позволяющий выполнять задачи менеджмента для конечных приложений таких как Microsoft Exchange, Microsoft SQL Server, and Microsoft Internet Information Services (IIS).
    Архитектура WMI
    1. Клиенты (Clients) – програмные компоненты, выполняющие команды WMI
    2. Менеджер объектов (Object manager) - Посредник между клентами и поставщиками (providers) открывающий доступ к ключевым сервисам таким как фильтрация событий, механизм запросов и т.д.
    3. Поставщики (Providers) – Програмные компоненты возвращающие данные приложениям клиента, связывающие клиента с управляемой им структурой.
    Запросы
    Вы можете точно определить данные которые вам нужны используя запросы. Запросы ограничивают количество возвращаемых данных указывая только определенные интересущие вас выходные данные (Используя SELECT) а также использовать условия выборки этох данных (используя предложение WHERE). Например запрос
    SELECT * FROM Win32_LogicalDisk WHERE FreeSpace < 2000000
    возвращает все логические диски у которых свободное пространство меньше 2 MB.
    Кроме запросов есть еще один метод использования WMI – создание объектов ManagementClass..

    Здесь приведу пример класса использующего WQL запросы и объекты WMI классов.
    Не забудьте добавить ссылку на пространство имен System.Management

    ExpandedWrap disabled
      using System;
      using System.Management;
      using System.Management.Instrumentation;
      using System.Data;
       
      namespace WMIClass
      {
          public class WMIClass
          {
              private ManagementObjectSearcher searcher;
              /// Конструктор класса. Инициализация полей.
              public WMIClass()
              {
                  this.searcher = new ManagementObjectSearcher();
              }      
              /// Используя WMI и WQL запрос получить информацию об ОС
              /// (BuildNumber,BuildType,Version,LocalDateTime,LastBootUpTime,InstallDate).
              /// returns Метод класса объект DataTable
              public DataTable GetOSInfo()
              {
                  DataTable res = new DataTable("OperatingSystem"); // Результирующая таблица
                  //Колонки таблицы - свойства класса Win32_OperatingSystem
                  //см http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_operatingsystem.asp
                  res.Columns.Add("BuildNumber", System.Type.GetType("System.String"));
                  res.Columns.Add("BuildType", System.Type.GetType("System.String"));
                  res.Columns.Add("Version", System.Type.GetType("System.String"));
                  res.Columns.Add("InstallDate", System.Type.GetType("System.String"));
                  res.Columns.Add("LocalDateTime", System.Type.GetType("System.String"));
                  res.Columns.Add("LastBootUpTime", System.Type.GetType("System.String"));
       
                  foreach(ManagementObject osObj in this.SendCommand("*", "Win32_OperatingSystem", ""))
                  {
                      DataRow dr = res.NewRow();
                      dr["BuildNumber"] = osObj["BuildNumber"].ToString();
                      dr["BuildType"] = osObj["BuildType"].ToString();
                      dr["Version"] = osObj["Version"].ToString();
                      dr["InstallDate"] = osObj["InstallDate"].ToString();
                      dr["LocalDateTime"] = osObj["LocalDateTime"].ToString();
                      dr["LastBootUpTime"] = osObj["LastBootUpTime"].ToString();
                      res.Rows.Add(dr);
                  }
                  return res;
              }
       
              public string GetOSInfo_ThroughObject()
              {
                  try
                  {
                      string res = "";
                      ManagementClass osClass = new ManagementClass("Win32_OperatingSystem"); // Объект класса Win32_OperatingSystem.
                      //Вызываем метод GetInstances возвращает коллекцию ManagementObjectCollection из свойств класса WMI см.
                      //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemmanagementmanagementobjectcollectionclasstopic.asp
                      ManagementObjectCollection osCollection = osClass.GetInstances();
                      foreach(ManagementObject osObj in osCollection)
                      {
                          res += "Version: " + osObj["Version"].ToString() + "<BR>" +
                              "InstallDate: " + osObj["InstallDate"].ToString() + "<BR>" +
                              "BuildNumber: " + osObj["BuildNumber"].ToString() + "<BR>" +
                              "BuildType: " + osObj["BuildType"].ToString() + "<BR>" +
                              "LocalDateTime: " + osObj["LocalDateTime"].ToString() + "<BR>" +
                              "LastBootUpTime: " + osObj["LastBootUpTime"].ToString() + "<BR>";
                      }
                      return res;
                  }
                  catch(Exception err)
                  {
                      return "Error: " + err.Message;
                  }
              }        
       
              /// Используя WMI и WQL запрос получить информацию о логических дисках на компьютере
              /// returns объект DataTable
              public DataTable GetLocalDiskInfo()
              {
                  try
                  {
                      DataTable res = new DataTable("Disks"); // Результирующая таблица
                      //Колонки таблицы - свойства класса Win32_LogicalDisk
                      res.Columns.Add("Caption", System.Type.GetType("System.String"));
                      res.Columns.Add("FileSystem", System.Type.GetType("System.String"));
                      res.Columns.Add("FreeSpace", System.Type.GetType("System.String"));
                      res.Columns.Add("Name", System.Type.GetType("System.String"));
                      res.Columns.Add("VolumeSerialNumber", System.Type.GetType("System.String"));
                      res.Columns.Add("Size", System.Type.GetType("System.String"));
       
                      //Здесь вызываем метод класса SendCommand с параметром where "DriveType = 3" что означает
                      //локальные логические диски см.
                      //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_logicaldisk.asp
                      foreach(ManagementObject diskObj in this.SendCommand("*", "Win32_LogicalDisk", "DriveType = 3"))
                      {
                          DataRow dr = res.NewRow();
                          dr["Caption"] = diskObj["Caption"].ToString();
                          dr["FileSystem"] = diskObj["FileSystem"].ToString();
                          dr["FreeSpace"] = diskObj["FreeSpace"].ToString();
                          dr["Name"] = diskObj["Name"].ToString();
                          dr["VolumeSerialNumber"] = diskObj["VolumeSerialNumber"].ToString();
                          dr["Size"] = diskObj["Size"].ToString();
                          res.Rows.Add(dr);
                      }
                      return res;
                  }
                  catch(Exception err)
                  {
                      return null;
       
                  }
       
              }
       
              /// Метод формирует команду WQL и  исполняет ее
              /// param name="fields"Поля классов WMI которые нужно возвращать
              /// param name="from"Имя класса WMI из которого выбираются нужные поля
              /// param name="where"Условия выбороки
              /// returnsКоллекцию результатов выполнения запроса
              private ManagementObjectCollection SendCommand(string fields, string from, string where)
              {
                  try
                  {
                      if(where != "")
                          where = " WHERE " + where;
                      else
                          where = "";
                  
                      string command = String.Format("SELECT {0} FROM {1} {2}", fields, from, where);
                      this.searcher.Query.QueryString = command;
                      return this.searcher.Get();
                  }
                  catch
                  {
                      return null;
                  }
              }
          }
      }


    Мспользовались ресурсы
    MSDN
    и вот эта статейка
    Классы WMI
    Сообщение отредактировано: Alexus -
      Таки не понятно где узнавать имена классов WMI. И вообще, уж ОЧЕНЬ поверхностно.
      Надо хотя бы такую ссылку привести: http://www.microsoft.com/downloads/details.aspx?FamilyId=6430F853-1120-48DB-8CC5-F2ABDC3ED314&displaylang=en
        Ссылку на классы WMI поставил
        Цитата
        И вообще, уж ОЧЕНЬ поверхностно.

        Не знаю, для меня этого было бы достаточно чтобы понять что такое WMI и начать писать что-то для конкретных задач
        Сообщение отредактировано: PMAXIM -
          мне необходимо использовать Win32_NetworkAdapterConfiguration. Но если в системе 2 или более адаптера, как выбрать нужный? В Win32_NetworkAdapterConfiguration я не нашел нужного параметра, но он есть в Win32_NetworkAdapter. Как бы их увязать друг с другом? Кажется через Win32_NetworkAdapterSetting, но не пойму как :(
          и еще не пойму, как вызвать метод класса Win32_.... значение мы получаем что-то вроде osObj["BuildNumber"].ToString(). А как быть если нужно не значение, а метод?
          Сообщение отредактировано: Protestant -
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0236 ]   [ 15 queries used ]   [ Generated: 26.04.24, 22:24 GMT ]