В результате работы получена программа, позволяющая получать информацию о системе при помощи 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