Заключение. В результате работы получена программа, позволяющая получать информацию о системе при помощи wql-запросов к wmi-таблицам

В результате работы получена программа, позволяющая получать информацию о системе при помощи wql-запросов к wmi-таблицам. Все базы в удобном виде хранятся в Microsoft Access. Их всегда можно дополнить так, чтобы программа выводила нужную информацию и о других устройствах системы.

В будущем в программу можно будет добавить диаграммы для более наглядного вывода информации. Вывод статистики по системе и её параметрам в виде графиков и схем.

Возможно, будет добавлен вывод отчёта в виде сохранения документов в Microsoft Word и Microsoft Exel, а также распечатка результата. Возможно реализовать сетевую версию программы, позволяющую выводить информацию не только о текущем компьютере пользователя, а также о других компьютерах и устройствах в сети.

Список использованной литературы

1. Попов Андрей, Шишкин Евгений. Администрирование Windows с помощью WMI и WMIC, 2004г. 752стр.

2. Язык программирования С# 2010 и платформа.NET 4: Эндрю Троелеен — Москва, Вильямс, 2011г., 1392стр.

3. Ален Лиссуар WMI: программирование на JavaScript.

4. Н. Голодный «Практикум по WMI». Москва 2015г. 768стр.

5. С# 2008 и платформа.NET 3.5 Framework: Кристиан Гросс — Санкт Петербург, Вильямс, 2009г. 480с.

6. С# для профессионалов (комплект из 2 книг) — Москва, Лори, 2005г. 1000стр.

Приложение «А». Листинг программы

using System;

using System.Management; // классы из этого пространства имен используются для работы с WMI

using System.Data.OleDb; // классы из этого пространства имен используются для работы с базой MS ACCESS

using System.Windows.Forms;

namespace get_sys_info_test

{

public partial class SystemManagment_form: Form

{

public SystemManagment_form()

{

InitializeComponent();

}

// Метод заполнения комбокса

// Параметры

// String comText - запрос на основе которого будет заполнятся данными cmb

// ComboBox cmb - ComboBox, который будет заполнятся данными на основе запроса comText

// String field - столбец из которого будут браться данные для заполнения ComboBox

void fill_ComboBox(String comText, ComboBox cmb, String field)

{

OleDbConnection con = new OleDbConnection(); // создаем экземпляр OleDbConnection (подключение к источнику данных т.е БД)

OleDbCommand oleCmd = new OleDbCommand(); // создание экземпляра OleDbCommand (позволяет выполнять запрос к БД)

oleCmd.Connection = con; // делаем привязку oleCmd к соединению con (т.е чтобы наш запрос выполнялся именно к БД к которой есть соединение con)

con.ConnectionString = conStr_osn + path_to_db; // указываем строку соединения (логин, пароль, поставщик услуг, и самое главное БД)

cmb.Items.Clear(); // очищаем ComboBox (на тот случай если там были данные от предыдущих запросов)

try

{

con.Open(); // пробуем открыть соединие с БД

}

catch (OleDbException oldbe1) // если происходит ошибка

{

MessageBox.Show(oldbe1.Message); // выводим сообщение с информацией об ошибке

return; // прекращаем выполение функции

}

oleCmd.CommandText = comText; // передаем oleCmd наш запрос, который мы хотим выполнить

OleDbDataReader reader = oleCmd.ExecuteReader(); // создаем экзмпляр OleDbDataReader (он будет построчно читать данные полученные на основе нашего запроса)

while (reader.Read()) // в цикле считаем все строки (reader.Read() читает строку и переходит на следующую)

{

cmb.Items.Add((reader[field]).ToString()); // заполняем cmb.Items значениями столбца field из выборки п

}

cmb.Text = cmb.Items[0].ToString(); // присваем полю cmb.Text первый элемент cmb.Items (чтобы комбокс после заполнения не казался пустым, а сразу было видно первое значения из полученных данных)

reader.Close(); // закрываем reader

con.Close(); // закрываем соединение

}

// Метод заполнения DataGridView

// Параметры

// DataGridView dtv - DataGridView который будет заполнятся данными на основе запроса query

// String query - запрос на основе которого будет заполнятся dtv

// String name_table - имя таблицы из которой будет извлекаться информация

void fill_dtv(DataGridView dtv, String query, String name_table)

{

// Действия аналогичны как и в функции fill_ComboBox

OleDbConnection con = new OleDbConnection();

OleDbCommand oleCmd = new OleDbCommand();

oleCmd.Connection = con;

con.ConnectionString = conStr_osn + path_to_db;

dtv.Rows.Clear(); // удаляем все строки dtv (так как нам не нужны прошлые записи и число строк полученных с помощую данного запроса может не совпадать с имеющимся числом строк уже. поэтому мы и удаляем строки, а не очищаем их)

// Действия аналогичны как и в функции fill_ComboBox

try

{

con.Open();

}

catch (OleDbException oldbe1)

{

MessageBox.Show(oldbe1.Message);

}

// Действия аналогичны как и в функции fill_ComboBox

oleCmd.CommandText = query;

OleDbDataReader reader = oleCmd.ExecuteReader();

while (reader.Read())

{

WqlObjectQuery wql_query = new WqlObjectQuery("Select " + reader[1].ToString() + " from " + name_table); // создаем запрос на языке WQL для WMI

ManagementObjectSearcher finder = new ManagementObjectSearcher(wql_query); // создаем экземпляр ManagementObjectSearcher, который будет получать набор данных на основе запроса переданного ему (wql_query)

// пробуем получить данные

try

{

foreach (ManagementObject mo in finder.Get()) // построчно заполняем полученными данными

{

if (mo[reader[1].ToString()]!= null) // если первый столбец не содержит значения null, то

{

dtv.Rows.Add(); // добавляем строку в dtv

dtv.Rows[dtv.Rows.Count - 1].Cells[0].Value = reader[0].ToString(); // заносим в нулевой (первый по счету) столбец только что созданной строки dtv НАЗВАНИЕ выводимого параметра

dtv.Rows[dtv.Rows.Count - 1].Cells[1].Value = mo[reader[1].ToString()].ToString(); // заносим в первый (второй по счету) столбец только что созданной строки dtv ЗНАЧЕНИЕ параметра

}

}

}

catch (Exception) // если произошла какая-то ошибка при получении данных, то мы не будем информировать об этом пользователя и завершать выполение функции.. просто пропустим данную строку и передейдем к следующей

{ }

}

reader.Close(); // закрываем reader

con.Close(); // закрываем соединение

}

// Переменные

const String path_to_db = @"../db.accdb"; // имя базы

const String conStr_osn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=";

bool IsFormLoaded = false; // переменная информирующая о том была ли выполнена загрузка формы (произошло ли уже событие Form_Load). нужна для предотвращения ошибок при инициализации

const String Main_table_name = "[Main Table]"; // имя главной таблицы

// Происходит при загрузке формы

private void SystemManagment_form_Load(object sender, EventArgs e)

{

//

OleDbConnection con = new OleDbConnection();

OleDbCommand oleCmd = new OleDbCommand();

oleCmd.Connection = con;

con.ConnectionString = conStr_osn + path_to_db;

try

{

con.Open();

}

catch

{

MessageBox.Show("Error");

return;

}

if (con.State == System.Data.ConnectionState.Open) // если соединение открыто, то

{

// Заполняем comboBox1 списком основных (главных) наборов классов таблиц WMI (например Computer System Hardware Classes - набор классов содержащих информацию по аппаратнуой части компьютера)

fill_ComboBox("Select [Name main class] from " + Main_table_name, comboBox1, "Name main class");

// Заполняем comboBox2 списком подклассов таблицы с именем comboBox1.Text (например в Computer System Hardware Classes есть класс Win32_CDROM - предоставляющий информацию о cd-row на компьютере)

fill_ComboBox("Select [Name class] from " + "["+comboBox1.Text+"]", comboBox2, "Name class");

// Заполняем dataGridView1 значениями из таблицы с именем comboBox2.Text

fill_dtv(dataGridView1, "Select * from " + "[" + comboBox2.Text + "]", comboBox2.Text);

}

con.Close(); // закрываем соединение

IsFormLoaded = true; // ставим флаг загрузки формы в true (т.е значит, что форма уже загружена и все нужные действия выполнены)

}

// Происходит при смене значения comboBox2 (при смене класса)

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)

{

if (IsFormLoaded) // если уже прошла загрузка формы

{

// Так сменился класс т.е стала требоваться другая информация (например была отображена о Биосе, а выбрали о процессоре), то нужно перезаполнить соотвествующей инфой dataGridView1

// Вот и заполняем его с помощью функции fill_dtv

fill_dtv(dataGridView1, "Select * from " + "[" + comboBox2.Text + "]", comboBox2.Text);

}

}

// Происходит при смене значения comboBox1 (при смене набора классов) т.е при смене специфики отображаемой информации (например отображали информацию о желез компа, а теперь будем отображать инфрмацию о процессах)

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)

{

if (IsFormLoaded)

{

// Заполняем для данного набора классов comboBox2

fill_ComboBox("Select [Name class] from " + "[" + comboBox1.Text + "]", comboBox2, "Name class");

// Заполянем данными fill_dtv

fill_dtv(dataGridView1, "Select * from " + "[" + comboBox2.Text + "]", comboBox2.Text);

}

}

}

}

Приложение «Б». База данных.

Name class Name table №2

Win32_BIOS Win32_BIOS class

Win32_CDROMDrive Win32_CDROMDrive class

Win32_DesktopMonitor Win32_DesktopMonitor class

Win32_DiskDrive Win32_DiskDrive class

Win32_PhysicalMemory Win32_PhysicalMemory class

Win32_Processor Win32_Processor class

Win32_VideoConfiguration Win32_VideoConfiguration class

Win32_VideoController Win32_VideoController class


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: