Windows Management Instrumentation. События в WMI. Библиотека классов MyWMI. Особенности работы с большим деревом, страница 22

¨  Создаем объект класса ManagementObjectSearcher, который учитывает адрес пространства имен и строку запроса,

¨  Создаем узел дерева, текст которого отражает суть запроса. Он почти совпадает с именем класса WMI.

¨  Получаем ссылку на коллекцию объектов класса ManagementObject, которую возвращает метод Get класса ManagementObjectSearcher, Эта коллекция — есть ни что иное, как RecordSet, то есть множество строк таблицы базы данных, полученной в результате запроса.

¨  В цикле по всему множеству строк получаем интересующие нас данные, создаем узел дерева с текстом, соответствующим полученной информации,

¨  Вкладываем этот узел внутрь узла, соответствующего запросу.

Учитывая сказанное, внесите изменения в начальную заготовку функции GetSysInfo.

private void GetSysInfo()

{

  string sMachine = // В зависимости от состояния кнопки rdCurrent создаем имя компьютера

  if (sMachine.Trim().Equals (string.Empty))

  {

    MessageBox.Show ("Machine IP address or name is needed");

    return;

  }

  ConnectionOptions co = new ConnectionOptions();

  if (textUserID.Text.Trim().Length > 0)

  {

    co.Username = // IP-адрес или имя машины

    co.Password = // Пароль

  }

//====== Начало блока, который будет повторяться для каждого класса WMI

  ManagementScope ms = new ManagementScope("\\\\" + sMachine+ "\\root\\cimv2", co);

      // Создайте сообщение, которое появится в статус строке. Например: "Getting Computer Information"

  // Создайте сообщение объект класса ManagementObjectSearcher

  // (2-й параметр типа ObjectQuery  должен содержать строку запроса с именем класса (Win32_ComputerSystem)

  TreeNode node = // Создайте узел с именем "Computer System" и индексами иконок 0, 1

  // Вставьте узел в дерево

  TreeNodeCollection nodes = // Получаем ссылку на множество вложенных узлов

  foreach (объект из searcher.Get())

  {

    try

    {

      nodes.Add (Новый узел с текстом "Computer Name: " + mo["Name"], 0, 1));

      string size = string.Format ("{0:f1}  Mb",

        (int.Parse (mo["TotalPhysicalMemory"].ToString())) / (1024.0 * 1024.0));

      nodes.Add (new TreeNode ("Total Physical Memory: " + size, 0, 1));

      // Продолжайте в том же духе

    }

    catch (Exception e) { MessageBox.Show(e.Message); }

}

//====== Конец блока, который должен повторяться для каждого класса WMI

  // Продолжайте в том же духе

}

Повторяйте блок команд, но изменяйте суть запросов (классы WMI). Приведем примерный перечень: Win32_Processor, Win32_LogicalMemoryConfiguration, Win32_LogicalDisk, Win32_VideoController, Win32_OperatingSystem, Win32_TimeZone, Win32_Bios, Win32_NetworkConnection. Не забывайте изменять индексы иконок, которые вы должны вставить в ImageList, соответствующий нашему дереву. В заключение приведу вспомогательную функцию, которая может понадобиться для повышения читабельности.

private string KiloToMegaBytes (object o)

{

return string.Format ("{0:f1}  Mb", Int64.Parse(o.ToString()) / 1024.0);

}

Мне захотелось создать такую функцию, чтобы многократно не повторять одни и те же преобразования. Кроме того, я использовал выражения вида:

string size = string.Format ("{0:f1}  Mb",

  (int.Parse (mo["TotalPhysicalMemory"].ToString())) / (1024.0 * 1024.0));

При решении задачи напрашивается обобщающий прием вида:

foreach (PropertyData data in mo.Properties)

nodes.Add (new TreeNode (data.Name + ": " + mo[data.Name], 2, 3));

и он очень полезен с познавательной точки зрения (обязательно исследуйте его), но с практической точки зрения он создает массу ненужных строк, забивающих эфир (jamming the air).