Windows Management Instrumentation. Опрос свойств, методов и описателей. Разработка компонента WMIControl, страница 37

Пока вы не забыли про обработчик уведомляющего события CheckedChanged введите его коды. Логика такова: видимость группы элементов boxAdmin должна зависеть от состояния переключателя Current-Remote. Если он в состоянии Remote, то нам следует предоставить пользователю возможность ввести: IP-адрес (или имя) удаленного компьютера, идентификатор пользователя и его пароль. Без этих данных мы не сможем (с помощью классов WMI) получить информацию об удаленном компьютере.

void rdRemote_CheckedChanged(object sender, EventArgs e)

{

boxAdmin.Visible = rdRemote.Checked;

}

Вероятно, вы еще помните про событие UpdateLog, которое было в предыдущем компоненте. Добавьте такое же событие в SysInfoControl. Также добавьте метод SetMessage. Его назначение — генерировать событие UpdateLog для того, чтобы клиентское приложение (главная форма) могло вывести посылаемое нами сообщение.

Для обновления информации о системе предусмотрена кнопка Refresh. Логика обработки ее нажатия достаточно проста.

void bRefresh_Click(object sender, EventArgs e)

{

SetMessage ("Refreshing Computer Information...");

FillTree();

}

Основная логика получения системной информации спрятана в методе FillTree. Создайте заготовку этого метода. Перед тем, как начать опрос системы, используя язык WQL и возможности класса ManagementObjectSearcher, следует обеспечить доступ к информации конкретного (локального или удаленного) компьютера. Как вы помните, доступ к WMI-классам обеспечивает класс ManagementScope. Конструируя объект этого класса, мы должны знать имя или IP-адрес исследуемого компьютера. К этому имени надо прибавить пространство имен root\cimv2. Полученная таким образом текстовая строка, используется как адрес пространства имен, где обитает нужный нам класс WMI. Далее алгоритм прозрачен, он повторяется столько раз, сколько классов WMI мы решили задействовать при опросе базы данных.

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

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

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

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

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

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

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

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

}