Визначення конфігурації обчислювальної системи

Розробка утиліти, що визначає конфігурацію обчислювальної системи. Розробка інтерфейсу користувача, довідкової системи та дистрибутиву програми. Отримання за допомогою утиліти інформації про конфігурацію, диски, властивості файлів, дані з реєстру.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 24.04.2013
Размер файла 966,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Одеський національний політехнічний університет

Кафедра системного програмного забезпечення

Дисципліна "Системне програмування"

КУРСОВА РОБОТА

"Визначення конфігурації обчислювальної системи"

Анотація

Дана робота присвячена розробці утиліти для визначення конфігурації обчислювальної системи з використанням знань та навичок, здобутих у ході вивчення курсу "Системне програмування" у шостому семестрі. Метою роботи є узагальнення, поглиблення а також застосування цих знань на практиці для розробки та налагодження реальної утиліти.

У ході виконання даної курсової роботи виконується розробка утиліти "specs", яка використовує технології Win32 API, Windows Management Instrumentation (WMI) та реєстр операційної системи для визначення основних параметрів конфігурації ОС, таких як тип та частота процесора, розмір оперативної пам'яті, роздільну здатність екрана, версію ОС, браузера та ін. Будуть розроблені два варіанта утиліти - один із використанням Win32 API, інший - з використанням WMI.

В якості мови програмування вибрана мова С#. Вибір мови програмування зумовлений тим, що мова С# надає потужні та гнучкі засоби швидкої розробки програм, при цьому дозволяючи використовувати засоби Win32 API та WMI, а також є найпростішою для вивчення мовою.net.

Зміст

  • Вступ
  • Частина 1. Розробка інтерфейсу користувача
  • 1.1 Розробка інтерфейсу утиліти
  • Частина 2. Розробка Win32 API додатка
  • 2.1 Імпорт функцій Win32 API
  • 2.2 Визначення назви та версії ОС
  • 2.3 Визначення кількості процесорів
  • 2.4 Визначення найстаршої адреси, доступної додаткам
  • 2.5 Визначення загального об'єму фізичної пам'яті
  • 2.6 Визначення стану клавіші NumLock
  • 2.7 Визначення висоти курсора миші та екрана
  • 2.8 Визначення системного каталогу
  • 2.10 Визначення властивостей файла
  • 2.11 Визначення параметрів дисків
  • 2.12 Визначення параметрів за допомогою реєстра
  • 2.13 Результат розробки
  • Частина 3. Розробка WMI додатка
  • 3.1 Застосування WMI для визначення параметрів системи
  • 3.2 Визначення основних параметрів системи
  • 3.3 Визначення параметрів дисків
  • 3.4 Робота з реєстром
  • Частина 4. Розробка додаткової функціональності
  • 4.1 "Пасхальне яйце"
  • 4.2 Розробка довідкової системи
  • 4.3 Розробка дистрибутиву програми
  • Висновок
  • Література
  • Додатки

Вступ

Сімейство операційних систем Windows має дуже довгу історію. Windows версії 1.0 з'явилась ще у 1985 році, працювала на основі DOS та являла собою спробу Microsoft створити багатозадачне графічне середовище для IBM-сумісних ПК. Версія 1.0 була дуже обмеженою і не користувалася попитом серед користувачів.

З виходом нових версій Windows все більше ставала схожою на повноцінну операційну систему, впроваджуючи підтримку найновішого апаратного забезпечення та технологій. Завдяки цьому, операційна система Windows захоплювала все більшу частину ринку користувацьких ОС, для неї створювалося все більше прикладного програмного забезпечення.

Для полегшення створення прикладного програмного забезпечення компанія Microsoft розробила Windows API - набір базових функцій, які забезпечують взаємодію прикладних програм з операційною системою на низькому рівні. В числі функцій є і такі, що забезпечують визначення конфігурації обчислювальної системи.

Інший спосіб визначення конфігурації обчислювальної системи - звернення до реєстру Windows, системної бази даних, яка зберігає параметри та налаштування операційної системи. Звернутися до реєстру можна за допомогою Windows Registry API.

Існує ще один спосіб визначення конфігурації обчислювальної системи - WMI, інструментарій керування операційною системою, який є розширеною та адаптованою реалізацією для Windows промислового стандарту WBEM. Для взаємодії з WMI використовується SQL-подібна мова запитів. WMI є найбільш потужним засобом визначення конфігурації обчислювальної системи.

У ході виконання курсової роботи будуть використані усі вищезазначені способи.

Частина 1. Розробка інтерфейсу користувача

1.1 Розробка інтерфейсу утиліти

Розроблювана утиліта носить інформаційний характер, не передбачає вводу інформації або складної її обробки. З цих причин доцільно зменшити до мінімуму кількість вікон.

У головному вікні буде зібрана уся інформація, яку визначає утиліта. Ця інформація буде представлена у вигляді пар міток (назва параметра - його значення). Мітки зібрані у декілька груп:

1. Інформація про конфігурацію обчислювальної системи.

2. Інформація про диски

3. Властивості файла

4. Дані з реєстру.

Для групи з інформацією про властивості вибраного файла передбачений діалог вибору файла (стандартний системний діалог), який викликається кліком по кнопці "Вибрати" і полегшує вибір файла.

Для групи з інформацією про диски передбачений випадаючий список, який дозволяє вибрати диск.

Оскільки для програми буде розроблена довідкова система, доцільно передбачити кнопку для її виклику, також при цьому закріпивши виклик довідки на функціональну кнопку F1.

Нижче поданий скріншот головного вікна програми, який дає уявлення про розроблений інтерфейс користувача:

обчислювальна система конфігурація утиліта

Рис.1.1 Користувацький інтерфейс "specs"

Частина 2. Розробка Win32 API додатка

2.1 Імпорт функцій Win32 API

Одним із способів визначення параметрів обчислювальної системи є використання Win32 API функцій.

Для використання їх у програмах, написаних мовою С#, потрібно спочатку виконати імпортування. Послідовність операторів, які імпортують API-функції, виглядає наступним чином (на прикладі функції GetVersionEx):

1. Спочатку підключаємо системну бібліотеку kernel32. dll, яка містить функцію, що підключається:

[DllImport ("kernel32. dll")]

2. Далі декларуємо функцію за стандартами мови C#:

public static extern bool GetVersionEx ([In, Out] OSVersionInfoEx osvi);

Один із параметрів імпортованої функції - структура OSVersionInfoEx, яка не є стандартною для мови С#, тому також повинна бути продекларована:

[StructLayout (LayoutKind. Sequential)]

public class OSVersionInfoEx

{

public int dwOSVersionInfoSize;

public int dwMajorVersion;

public int dwMinorVersion;

public int dwBuildNumber;

public int dwPlatformId;

[MarshalAs (UnmanagedType. ByValTStr, SizeConst = 128)]

public string szCSDVersion;

public short wServicePackMajor;

public short wServicePackMinor;

public short wSuiteMask;

public byte wProductType;

public byte wReserved;

}

Далі імпортована функція може бути використана так само, як і стандартні функції мови C#.

2.2 Визначення назви та версії ОС

Для визначення версії ОС можна скористатися функцією GetVersionEx, яка приймає на вхід параметр типу OSVersionInfoEx.

[DllImport ("kernel32. dll")]

public static extern bool GetVersionEx ([In, Out] OSVersionInfoEx osvi);

Декларуємо необхідні структури даних:

[StructLayout (LayoutKind. Sequential)]

public class OSVersionInfoEx

{

public int dwOSVersionInfoSize;

public int dwMajorVersion;

public int dwMinorVersion;

public int dwBuildNumber;

public int dwPlatformId;

[MarshalAs (UnmanagedType. ByValTStr, SizeConst = 128)]

public string szCSDVersion;

public short wServicePackMajor;

public short wServicePackMinor;

public short wSuiteMask;

public byte wProductType;

public byte wReserved;

}

Далі створюємо новий екземпляр структури даних та ініціалізуємо його:

OSVersionInfoEx osvi = new OSVersionInfoEx ();

osvi. dwOSVersionInfoSize = Marshal. SizeOf (osvi);

Викликаємо функцію:

GetVersionEx (osvi);

Виводимо версію ОС:

label23. Text = osvi. dwMajorVersion +"." + osvi. dwMinorVersion +"." + osvi. dwBuildNumber;

Далі, перевіряючи велику та малу версії ОС, визначаємо назву ОС:

switch (osvi. dwMajorVersion)

{

case 6:

if (osvi. dwMinorVersion == 1 && osvi. wProductType == 1) versionString += " 7";

else if (osvi. dwMinorVersion == 1 && osvi. wProductType == 0) versionString += " Server 2008 R2";

else if (osvi. dwMinorVersion == 0 && osvi. wProductType == 1) versionString += " Vista";

else if (osvi. dwMinorVersion == 0 && osvi. wProductType == 0) versionString += " Server 2008";

break;

case 5:

if (osvi. dwMinorVersion == 2 && GetSystemMetrics (89) == 1) versionString += " Server 2003 R2";

else if (osvi. dwMinorVersion == 2 && osvi. wProductType == 0) versionString += " Server 2003";

else if (osvi. dwMinorVersion == 1) versionString += " XP";

else if (osvi. dwMinorVersion == 0) versionString += " 2000";

break;

default:

MessageBox. Show ("Invalid major version value!", "Error", MessageBoxButtons. OK, MessageBoxIcon. Error);

break;

}

Виводимо отримане значення:

label12. Text = versionString;

2.3 Визначення кількості процесорів

Для визначення версії ОС можна скористатися функцією GetSystemInfo, яка приймає на вхід параметр типу SystemInfo.

[DllImport ("kernel32. dll")]

public static extern void GetSystemInfo ([In, Out] ref SystemInfo p_si);

Декларуємо необхідні структури даних:

[StructLayout (LayoutKind. Sequential)]

public struct SystemInfo

{

public uint dwOemId;

public uint dwPageSize;

public uint lpMinimumApplicationAddress;

public uint lpMaximumApplicationAddress;

public uint dwActiveProcessorMask;

public uint dwNumberOfProcessors;

public uint dwProcessorType;

public uint dwAllocationGranularity;

public uint dwProcessorLevel;

public uint dwProcessorRevision;

}

Далі створюємо новий екземпляр структури даних:

SystemInfo si = new SystemInfo ();

Викликаємо функцію:

GetSystemInfo (ref si);

Виводимо кількість процесорів:

label14. Text = si. dwNumberOfProcessors. ToString ();

2.4 Визначення найстаршої адреси, доступної додаткам

Для визначення даного параметра можна скористатися результатом виклику функції у п.2.3., взявши інше значення зі структури:

label15. Text = si. lpMaximumApplicationAddress. ToString ();

2.5 Визначення загального об'єму фізичної пам'яті

Для визначення загального об'єму фізичної пам'яті можна скористатися функцією GlobalMemoryStatus, яка приймає на вхід параметр типу MemoryStatus.

[DllImport ("kernel32. dll")]

static extern void GlobalMemoryStatus ([In, Out] ref MemoryStatus ms);

Декларуємо необхідні структури даних:

[StructLayout (LayoutKind. Sequential)]

public struct MemoryStatus

{

public uint dwLength;

public uint dwMemoryLoad;

public uint dwTotalPhys;

public uint dwAvailPhys;

public uint dwTotalPageFile;

public uint dwAvailPageFile;

public uint dwTotalVirtual;

public uint dwAvailVirtual;

}

Далі створюємо новий екземпляр структури даних:

MemoryStatus ms = new MemoryStatus ();

ms. dwLength = (uint) Marshal. SizeOf (ms);

Викликаємо функцію:

GlobalMemoryStatus (ref ms);

Виводимо об'єм фізичної пам'яті, переводячи його у мегабайти для наглядності:

label16. Text = Math. Round ( (double) (ms. dwTotalPhys / 1024/1024), 0). ToString () + " MB";

2.6 Визначення стану клавіші NumLock

Для визначення стану клавіші NumLock можна скористатися функцією GetKeyState, яка приймає на вхід параметр типу int, який означає віртуальний код клавіші, яка перевіряється.

[DllImport ("user32. dll")]

static extern short GetKeyState ([In] int nVirtKey);

Викликаємо функцію перевіряючи повернене нею значення:

if (GetKeyState (0x90) == 1) numLockState = "Активна";

else if (GetKeyState (0x90) == 0) numLockState = "Неактивна";

else numLockState = "Помилка";

Виводимо стан клавіші NumLock:

label17. Text = numLockState;

2.7 Визначення висоти курсора миші та екрана

Для визначення висоти курсора миші та екрана можна скористатися функцією GetSystemMetrics, яка приймає на вхід параметр типу int.

[DllImport ("user32. dll")]

public static extern int GetSystemMetrics ([In] int index);

Викликаємо функцію для кожного з параметрів, виводячи отримані значення:

label18. Text = GetSystemMetrics (14). ToString ();

label19. Text = GetSystemMetrics (1). ToString ();

2.8 Визначення системного каталогу

Для визначення системного каталогу можна скористатися функцією GetSystemDir, яка приймає на вхід параметри типу StringBuilder та int.

[DllImport ("kernel32. dll")]

static extern uint GetSystemDirectory (StringBuilder lpBuffer, uint uSize);

Далі створюємо та ініціалізуємо необхідні екземпляри даних:

StringBuilder systemDir = new StringBuilder (256);

Викликаємо функцію:

GetSystemDirectory (systemDir, 256);

Виводимо отримане значення:

label20. Text = systemDir. ToString ();

2.9 Визначення імені комп'ютера

Для визначення системного каталогу можна скористатися функцією GetSystemDir, яка приймає на вхід параметри типу StringBuilder та int.

[DllImport ("Kernel32. dll")]

static extern unsafe bool GetComputerName (byte* buf, long* nSize);

Далі створюємо та ініціалізуємо необхідні екземпляри даних та викликаємо функцію:

byte [] buf = new byte [512];

unsafe

{

long size = buf. Length;

long* p_size = &size;

fixed (byte* p_buf = buf)

{

GetComputerName (p_buf, p_size);

}

}

System. Text. Encoding textEnc = new System. Text. ASCIIEncoding ();

string computerName = textEnc. GetString (buf);

Виводимо отримане значення:

label22. Text = computerName. ToString ();

2.10 Визначення властивостей файла

Для визначення властивостей файла можна скористаємося функціями CreateFile, GetFileTime та CloseHandle, зробивши це наступним чином:

1. Відкриваємо файл за допомогою CreateFile;

2. Отримуємо потрібні атрибути за допомогою GetFileTime;

3. Закриваємо файл CloseHandle;

Імпортуємо потрібні функції та структури даних:

[DllImport ("kernel32. dll", CharSet = CharSet. Auto, CallingConvention = CallingConvention. StdCall, SetLastError = true)]

private static extern IntPtr CreateFile (string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr SecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);

[DllImport ("kernel32. dll", SetLastError = true)]

private static extern bool GetFileTime (IntPtr hFile, ref FileTime lpCreationTime, ref FileTime lpLastAccessTime, ref FileTime lpLastWriteTime);

[DllImport ("kernel32. dll", SetLastError = true)]

[return: MarshalAs (UnmanagedType. Bool)]

private static extern bool CloseHandle (IntPtr hObject);

[StructLayout (LayoutKind. Sequential)]

public struct FileTime

{

public uint dwLowDateTime;

public uint dwHighDateTime;

}

Далі створюємо та ініціалізуємо необхідні екземпляри:

DateTime CreationTime = DateTime. MinValue;

DateTime LastAccessTime = DateTime. MinValue;

DateTime LastWriteTime = DateTime. MinValue;

IntPtr ptr = IntPtr. Zero;

FileTime ftCreationTime = new FileTime ();

FileTime ftLastAccessTime = new FileTime ();

FileTime ftLastWriteTime = new FileTime ();

Відкриваємо файл, перевіряючи успішність спроби відкриття:

ptr = CreateFile (openFileDialog1. FileName, GENERIC_READ, FILE_SHARE_READ, IntPtr. Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr. Zero);

if (ptr. ToInt32 () == INVALID_HANDLE_VALUE) Marshal. ThrowExceptionForHR (Marshal. GetHRForLastWin32Error ());

Зчитуємо, перетворюємо у стандартний формат та виводимо отримані дані:

if (GetFileTime (ptr, ref ftCreationTime, ref ftLastAccessTime, ref ftLastWriteTime)! = true) Marshal. ThrowExceptionForHR (Marshal. GetHRForLastWin32Error ());

CreationTime = DateTime. FromFileTimeUtc ( ( ( (long) ftCreationTime. dwHighDateTime) << 32) | ( (uint) ftCreationTime. dwLowDateTime));

LastAccessTime = DateTime. FromFileTimeUtc ( ( ( (long) ftLastAccessTime. dwHighDateTime) << 32) | ( (uint) ftLastAccessTime. dwLowDateTime));

LastWriteTime = DateTime. FromFileTimeUtc ( ( ( (long) ftLastWriteTime. dwHighDateTime) << 32) | ( (uint) ftLastWriteTime. dwLowDateTime));

Закриваємо файл:

CloseHandle (ptr);

2.11 Визначення параметрів дисків

Визначення параметрів дисків можна розбити на наступні задачі: визначення списку дисків, наявних у системі, а також власне визначення параметрів одного з дисків.

Для визначення списку логічних дисків можна використати функцію GetLogicalDriveStrings. Імпортуємо її:

[DllImport ("kernel32. dll")]

static extern uint GetLogicalDriveStrings (uint nBufferLength, [Out] char [] lpBuffer);

Далі при ініціалізації форми викликаємо її, додаючи список дисків до елементу керування ComboBox:

StringCollection drvlist = this. getLogicalDrives ();

if (drvlist! = null)

{

foreach (string s in drvlist)

{

comboBox1. Items. Add (s);

}

}

else

{

MessageBox. Show ("Виклик GetLogicalDriveStrings не вдався!", "Помилка", MessageBoxButtons. OK, MessageBoxIcon. Error);

}

comboBox1. SelectedIndex = 0;

Для визначення параметрів одного з дисків можна використати функції GetVolumeInformation, GetDiskFreeSpaceEx, GetDriveType. Імпортуємо їх, декларуючи необхідні структури даних:

[DllImport ("Kernel32. dll", CharSet = CharSet. Auto, SetLastError = true)]

extern static bool GetVolumeInformation (string RootPathName, StringBuilder VolumeNameBuffer, int VolumeNameSize, out uint VolumeSerialNumber, out uint MaximumComponentLength, out uint FileSystemFlags, StringBuilder FileSystemNameBuffer, int nFileSystemNameSize);

[DllImport ("kernel32. dll", SetLastError = true, CharSet = CharSet. Auto)]

[return: MarshalAs (UnmanagedType. Bool)]

static extern bool GetDiskFreeSpaceEx (string lpDirectoryName, out ulong lpFreeBytesAvailable, out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes);

[DllImport ("kernel32. dll")]

public static extern DriveType GetDriveType ([MarshalAs (UnmanagedType. LPStr)] string lpRootPathName);

public enum DriveType: uint

{

Unknown = 0, // DRIVE_UNKNOWN

Error = 1, // DRIVE_NO_ROOT_DIR

Removable = 2, // DRIVE_REMOVABLE

Fixed = 3, // DRIVE_FIXED

Remote = 4, // DRIVE_REMOTE

CDROM = 5, // DRIVE_CDROM

RAMDisk = 6 // DRIVE_RAMDISK

}

Далі викликаємо ці функції, записуючи отримані значення:

ulong FreeBytesAvailable;

ulong TotalNumberOfBytes;

ulong TotalNumberOfFreeBytes;

string drive = comboBox1. SelectedItem. ToString ();

StringBuilder volname = new StringBuilder (261);

StringBuilder fsname = new StringBuilder (261);

uint sernum, maxlen;

uint flags;

if (! GetVolumeInformation (drive, volname, volname. Capacity, out sernum, out maxlen, out flags, fsname, fsname. Capacity))

Marshal. ThrowExceptionForHR (Marshal. GetHRForLastWin32Error ());

label34. Text = volname. ToString ();

label11. Text = fsname. ToString ();

byte [] data = BitConverter. GetBytes (sernum);

Array. Reverse (data);

label35. Text = BitConverter. ToString (data). Replace ("-","");

DriveType drt = GetDriveType (drive);

label21. Text = drt. ToString ();

GetDiskFreeSpaceEx (drive, out FreeBytesAvailable, out TotalNumberOfBytes, out TotalNumberOfFreeBytes);

label29. Text = Math. Round ( ( (double) TotalNumberOfBytes / 1024/1024/1024),

2). ToString () + " ГБ";

label8. Text = Math. Round ( ( (double) TotalNumberOfFreeBytes / 1024/1024/1024),

2). ToString () + " ГБ";

2.12 Визначення параметрів за допомогою реєстра

Реєстр Windows - деревовидна ієрархічна база даних, яка містить усі налаштування операційної системи та прикладних програм. Уперше з'явився ще у версії 3.1 ОС Windows та з того часу є основним сховищем конфігурації ОС.

Для визначення параметрів обчислювальної системи за допомогою реєстра можна скористатися стандартними засобами бібліотеки.net Framework, які є обгортками для API-функцій. Для їх використання потрібно підключити простір імен Microsoft. Win32, який містить класи Registry та RegistryKey.

Далі робота з даними реєстра складається з таких етапів:

1. Відкриття необхідного ключа:

key = Registry. CurrentUser. OpenSubKey ("Control Panel"). OpenSubKey ("Keyboard");

if (key == null)

{

MessageBox. Show ("Не вдалося відкрити ключ реєстра з параметрами клавіатури.", "Помилка", MessageBoxButtons. OK, MessageBoxIcon. Error);

return;

}

2. Зчитування імен значень ключа:

subkeys = key. GetValueNames ();

if (subkeys. Length == 0) {

MessageBox. Show ("Ключ рестра з параметрами клавіатури не містить значень", "Увага", MessageBoxButtons. OK, MessageBoxIcon. Information);

return; }

3. Зчитування власне значень:

foreach (string valueName in subkeys)

{

label49. Text += (valueName + "\n");

label48. Text += (key. GetValue (valueName) + "\n");

}

4. Закриття ключа:

key. Close ();

2.13 Результат розробки

Розроблений додаток виглядає наступним чином:

Рис.2.13.1 Додаток "specs API"

Частина 3. Розробка WMI додатка

3.1 Застосування WMI для визначення параметрів системи

WMI (Windows Management Instrumentation) - інструментарій керування Windows, набір класів та методів, які дозволяють підвищити ефективність та зручність адміністрування операційних систем сімейства Windows.

WMI являє собою репозиторій, який містить набір класів. Для отримання інформації з репозиторію формуються запити мовою WQL, яка фактично є підмножиною мови ANSI SQL з незначними семантичними змінами, тому запити до репозиторію дуже нагадують запити до бази даних.

Класи WMI надають вичерпну інформацію про апаратне забезпечення, налаштування операційної системи та програм користувача.

Для використання WMI у C#-додатках необхідно підключити простори імен System. Management та System. Security. Permissions:

using System. Management;

using System. Security. Permissions;

3.2 Визначення основних параметрів системи

Для визначення основних параметрів системи можна застосувати наступні класи WMI (див. таблиці 3.2.1-3.2.3):

Таблиця 3.2.1 Використані параметри класу Win32_OperatingSystem

Параметр

Тип

Опис

CSName

string

Ім'я комп'ютера.

Name

string

Назва операційної системи.

SystemDirectory

string

Шлях до системної папки

Version

string

Версія операційної системи.

Таблиця 3.2.2 Використані параметри класу Win32_ComputerSystem

Параметр

Тип

Опис

NumberOfLogicalProcessors

uint32

Кількість процесорів.

TotalPhysicalMemory

uint64

Загальна кількість оперативної пам'яті.

Таблиця 3.2.3 Використані параметри класу Win32_DisplayConfiguration

Параметр

Тип

Опис

PelsHeight

uint32

Висота екрана у пікселях

За допомогою об'єктів ManagementObjectSearcher робимо запит до репозиторію WMI:

ManagementObjectSearcher mosOSInfo = new ManagementObjectSearcher ("SELECT * From Win32_OperatingSystem");

ManagementObjectSearcher mosCSInfo = new ManagementObjectSearcher ("SELECT * From Win32_ComputerSystem");

ManagementObjectSearcher mosv = new ManagementObjectSearcher ("SELECT * From Win32_DisplayConfiguration");

Оброблюємо результат зробленого запиту, разом із цим виводячи інформацію:

foreach (ManagementObject mObj in mosOSInfo. Get ())

{

label12. Text = mObj ["Name"]. ToString ();

label23. Text = mObj ["Version"]. ToString ();

label22. Text = mObj ["CSName"]. ToString ();

label20. Text = mObj ["SystemDirectory"]. ToString ();

}

foreach (ManagementObject mObj in mosCSInfo. Get ())

{

label14. Text = mObj ["NumberOfLogicalProcessors"]. ToString ();

label16. Text = Math. Round ( (double. Parse (mObj ["TotalPhysicalMemory"]. ToString ()) /1024/1024),2). ToString () + " МБ";

}

foreach (ManagementObject mObj in mosv. Get ())

{

label19. Text = mObj ["PelsHeight"]. ToString ();

}

3.3 Визначення параметрів дисків

Інформацію про логічні диски (томи) надає клас Win32_LogicalDisk. Зокрема, доступні такі параметри (див. таблицю 3.3.1):

Таблиця 3.3.1 Використані параметри класу Win32_LogicalDisk

Параметр

Тип

Опис

Description

string

Опис об'єкта логічного диска.

DriveType

uint32

Ціле число, яке відповідає типу пристрою, у якому встановлений логічний диск.0 - Unknown, 1 - No root directory, 2 - Removable disk, 3 - Local disk, 4 - Network drive, 5 - Compact disc, 6 - RAM Disk.

FileSystem

string

Тип файлової системи.

FreeSpace

uint64

Місце, доступне для запису на логічному диску.

Size

uint64

Загальний об'єм логічного диска.

VolumeName

string

Мітка логічного диска (не більше 32 символів).

VolumeSerialNumber

string

Серійний номер логічного диска (не більше 11 символів).

VolumeDirty

boolean

Якщо true, диск потребує перевірки на помилки утилітою CheckDisk.

Крім приведених вище параметрів доступні ще багато інших (приводити тут повний список недоцільно).

За допомогою об'єкту ManagementObjectSearcher робимо запит до репозиторію WMI:

ManagementObjectSearcher mosDisks = new ManagementObjectSearcher ("SELECT * From Win32_LogicalDisk WHERE Caption='" + comboBox1. SelectedItem. ToString () + "'");

Оброблюємо результат зробленого запиту, разом із цим виводячи інформацію:

foreach (ManagementObject moDisk in mosDisks. Get ())

{

label21. Text = moDisk ["Description"]. ToString ();

switch (moDisk ["DriveType"]. ToString ())

{

case "0": label24. Text = "Unknown"; break;

case "1": label24. Text = "No root directory"; break;

case "2": label24. Text = "Removable disk"; break;

case "3": label24. Text = "Local disk"; break;

case "4": label24. Text = "Network drive"; break;

case "5": label24. Text = "Compact disk"; break;

case "6": label24. Text = "RAM disk"; break;

default: label24. Text = "error!"; break;

}

label11. Text = moDisk ["FileSystem"]. ToString ();

label8. Text = Math. Round ( ( (double) Convert. ToDouble (moDisk ["FreeSpace"]) / 1024/1024/1024),

2). ToString () + " ГБ";

label29. Text = Math. Round ( ( (double) Convert. ToDouble (moDisk ["Size"]) / 1024/1024/1024),

2). ToString () + " ГБ";

label33. Text = moDisk ["VolumeDirty"]. ToString ();

label34. Text = moDisk ["VolumeName"]. ToString ();

label35. Text = moDisk ["VolumeSerialNumber"]. ToString (); }

3.4 Робота з реєстром

Для роботи з реєстром WMI надає клас StdRegProv. Цей клас містить наступні методи:

Назва методу

Опис

EnumValues

Повертає список імен та типів значень ключа

GetBinaryValue

Зчитує двійкове значення

GetStringValue

Зчитує рядкове значення

GetMultistringValue

Зчитує багаторядкове значення

GetDWORDValue

Зчитує DWORD значення

Робота з цим класом включає наступні етапи:

1. Підключення до репозиторію:

ConnectionOptions options = new ConnectionOptions ();

options. EnablePrivileges = true;

options. Impersonation = ImpersonationLevel. Impersonate;

ManagementScope scope = new ManagementScope ("\\\\. \\root\\default", options);

scope. Connect ();

ManagementClass mc = new ManagementClass ("StdRegProv");

2. Підготовка вхідних параметрів та виклик функції:

ManagementBaseObject inParams = mc. GetMethodParameters ("EnumValues");

inParams ["hDefKey"] = (UInt32) 2147483649;

inParams ["sSubKeyName"] = "Software\\Microsoft\\Visual Basic\\6.0\\AddInToolbar\\VB Class Builder Utility";

ManagementBaseObject outParams = mc. InvokeMethod ("EnumValues", inParams, null);

3. Обробка вихідних параметрів:

string [] names = (string []) outParams ["sNames"];

int [] types = (int []) outParams ["Types"];

Частина 4. Розробка додаткової функціональності

4.1 "Пасхальне яйце"

"Пасхальне яйце" - різновид секрету, який залишає у програмі її розробником. Для "отримання" цього секрету потрібно виконати складну або нестандартну послідовність дій, що виключає (або щонайменше робить малоймовірною) можливість його випадкового знаходження.

Один із варіантів "пасхального яйця" - виведення імені автора програми при натисненні складної клавіатурної комбінації. Саме цей варіант і був реалізований у розроблюваній програмі - при натисканні комбінації Ctrl+Alt+Shift+A буле виведене наступне повідомлення:

Рис.4.1.1 Пасхальне яйце

4.2 Розробка довідкової системи

Довідкова система програми - сукупність матеріалів (як окремих документів довідки, так і спливаючих підказок елементів керування), яка містить додаткову інформацію щодо програми - її елементів, вмісту, способів використання тощо.

Найпростіший спосіб реалізації довідкової служби - у форматі Microsoft HTML Help (Compressed HTML *. chm файла, який прикріплюється до програми). Для отримання *. chm файла його потрібно зкомпілювати з окремих HTML-документів за допомогою відповідного програмного забезпечення - Microsoft HTML Help Workshop, htm2chm, CHM Editor або подібного). Отриманий файл може бути викликаний за допомогою класу з бібліотеки.net Framework - HelpProvider. У якості параметра Namespace цього класу потрібно вказати ім'я файла, що містить довідку. Далі довідкова система може бути викликана наступним чином:

Help. ShowHelp (this, helpProvider1. HelpNamespace);

Після виклику користувач бачить наступне вікно:

Рис.4.2.1 Вікно довідкової служби

4.3 Розробка дистрибутиву програми

Дистрибутив програми - спеціальне ПЗ, яке призначене для розгортання програми у цільовій системі. Це ПЗ копіює файли програми у місце, визначене користувачем, налаштовує операційну систему, перевіряє наявність бібліотек, необхідних для роботи тощо.

Для створення дистрибутивів існує велика кількість програмного забезпечення: Nullsoft Install System, Smart Install Maker, InstallShield. Це програмне забезпечення є платним, потребує витрат часу на встановлення та освоєння, хоча і надає при цьому велику кількість засобів та налаштувань.

Існує альтернатива - ПЗ, що поставляється разом із Microsoft Visual Studio. Це ПЗ надає тільки найважливішу функціональність (якої більш ніж достатньо для створення простих дистрибутивів), але є безкоштовною та простою у використанні.

Для використання цього ПЗ потрібно створити у Visual Studio новий проект Setup Project. Після створення необхідно додати усі файли, які мають бути розгорнуті при встановлені, задати назву, шлях встановлення та деякі інші параметри. Після цього потрібно побудувати проект. Результатом побудови будуть програма-інсталятор (*. exe) та пакет, що містить встановлювані файли (*. msi).

Вигляд програми-інсталятора:

Рис.4.3.1 Вигляд програми-інсталятора

Висновок

В ході виконання даної курсової роботи була розроблена утиліта для визначення конфігурації обчислювальної системи. При цьому були використані знання та навички, здобуті у ході вивчення курсу "Системне програмування" у шостому семестрі. При цьому отримані знання були узагальнені, поглиблені а також застосовані на практиці для розробки та налагодження реальної утиліти.

Результатом курсової роботи стали наступні утиліти:

"specs", яка використовує технології Win32 API;

"specs WMI", яка опирається на інструментарій Windows Management Instrumentation (WMI).

Обидві утиліти здатні визначати тип та кількість процесорів, розмір оперативної пам'яті, параметри дисків, ім'я операційної системи та її версію, роздільну здатність екрана, параметри браузера та інших додатків, тобто наділені практично однаковою функціональністю (деякі відмінності зумовлені певними обмеженнями того чи іншого засобу).

Іншим результатом курсової роботи стало поглиблення знань про платформу.net Framework та одну з її мов - C#.

Література

1. Давыдов В.И. Системное программирование и операционные системы (конспект лекций: информационно-справочные материалы). Издание четвертое, переработанное и дополненное. - Одесса, 2008. - 114 с.

2. Давыдов В.И., Кунгурцев А.Б. Системное программирование и операционные системы: Управление реестром Windows. Учебное пособие для вузов. - Одесса, Автограф, 2005. - 108 с.

3. Давыдов В.И. Определение параметров, мониторинг и администрирование вычислительной системы. - Одесса, Автограф, 2005. - 160 с.

4. Попов А.В. Администрирование Windows с помощью WMI и WMIC. - СПб.: БХВ-Петербург, 2004. - 752 с.

5. Петрусос Е. C#. Руководство разработчика: Пер. с англ. - К.: Издательская группа BHV, 2000. - 1072 c., ил.

6. Петрусос Е., Кэвин Х. С# для профессионалов. - СПб: Издательство "Питер", 2006. - 432 c., ил.

7. Роман С. Программирование в Win32 API на C#. /Пер. с англ. - М.: ДМК Пресс, 2010. - 480с., ил.

8. Реселман Б., Писли Р. Использование C#. /Пер. с англ. - К.; М.; СПб.: Издательский дом "Вильямс", 2010. - 608с.

9. Крейг Дж., Уэбб Дж. Microsoft.net Framework. Мастерская разработчика. /Пер. с англ. - М.: Издательский отдел "Русская Редакция" ТОО "Channel Trading Ltd.", 2008. - 648с.

10. MSDN (Microsoft Developer Network).

Додатки

Додаток 1. Лістинг додатка "specs API"

1. Program. cs - точка входу, стартова процедура:

using System;

using System. Collections. Generic;

using System. Linq;

using System. Windows. Forms;

namespace WindowsFormsApplication1

{

static class Program

{

[STAThread]

static void Main ()

{

Application. EnableVisualStyles ();

Application. SetCompatibleTextRenderingDefault (false);

Application.run (new MainWindow ());

}

}

}

2. MainWindow. cs - основна форма програми, реалізує ключову функціональність:

using System;

using System. Collections. Generic;

using System.componentModel;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

using System. Windows. Forms;

using System.runtime. InteropServices;

using System. Management;

using System. Security. Permissions;

using Microsoft. Win32;

using System. Collections. Specialized;

namespace WindowsFormsApplication1

{

public partial class MainWindow: Form

{

private const uint GENERIC_READ = 0x80000000;

private const uint FILE_SHARE_READ = 0x1;

private const uint FILE_ATTRIBUTE_NORMAL = 0x80;

private const int INVALID_HANDLE_VALUE = - 1;

private const uint OPEN_EXISTING = 3;

[DllImport ("kernel32. dll")]

public static extern bool GetVersionEx ([In, Out] OSVersionInfoEx osvi);

[DllImport ("user32. dll")]

public static extern int GetSystemMetrics ([In] int index);

[DllImport ("kernel32. dll")]

public static extern void GetSystemInfo ([In, Out] ref SystemInfo p_si);

[return: MarshalAs (UnmanagedType. Bool)]

[DllImport ("kernel32. dll", CharSet = CharSet. Auto, SetLastError = true)]

static extern bool GlobalMemoryStatusEx ([In, Out] MemoryStatusEx lpBuffer);

[DllImport ("user32. dll")]

static extern short GetKeyState ([In] int nVirtKey);

[DllImport ("Kernel32. dll")]

static extern unsafe bool GetComputerName (byte* buf, long* nSize);

[DllImport ("kernel32. dll")]

static extern uint GetSystemDirectory ([Out] StringBuilder lpBuffer, uint uSize);

[DllImport ("kernel32. dll", CharSet = CharSet. Auto, CallingConvention = CallingConvention. StdCall, SetLastError = true)]

private static extern IntPtr CreateFile (string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr SecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);

[DllImport ("kernel32. dll", SetLastError = true)]

private static extern bool GetFileTime (IntPtr hFile, ref FileTime lpCreationTime, ref FileTime lpLastAccessTime, ref FileTime lpLastWriteTime);

[DllImport ("kernel32. dll", SetLastError = true)]

[return: MarshalAs (UnmanagedType. Bool)]

private static extern bool CloseHandle (IntPtr hObject);

[DllImport ("kernel32. dll")]

static extern uint GetLogicalDriveStrings (uint nBufferLength, [Out] char [] lpBuffer);

[DllImport ("Kernel32. dll", CharSet = CharSet. Auto, SetLastError = true)]

extern static bool GetVolumeInformation (string RootPathName, StringBuilder VolumeNameBuffer, int VolumeNameSize, out uint VolumeSerialNumber, out uint MaximumComponentLength, out uint FileSystemFlags, StringBuilder FileSystemNameBuffer, int nFileSystemNameSize);

[DllImport ("kernel32. dll", SetLastError = true, CharSet = CharSet. Auto)]

[return: MarshalAs (UnmanagedType. Bool)]

static extern bool GetDiskFreeSpaceEx (string lpDirectoryName, out ulong lpFreeBytesAvailable, out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes);

[DllImport ("kernel32. dll")]

public static extern DriveType GetDriveType ([MarshalAs (UnmanagedType. LPStr)] string lpRootPathName);

public MainWindow ()

{

InitializeComponent ();

this. refresh ();

this. refreshRegData ();

StringCollection drvlist = this. getLogicalDrives ();

if (drvlist! = null)

{

foreach (string s in drvlist)

{

comboBox1. Items. Add (s);

}

}

else

{

MessageBox. Show ("Виклик GetLogicalDriveStrings не вдався!", "Помилка", MessageBoxButtons. OK, MessageBoxIcon. Error);

}

comboBox1. SelectedIndex = 0;

}

private void button3_Click (object sender, EventArgs e)

{

}

private StringCollection getLogicalDrives ()

{

const int size = 512;

char [] buffer = new char [size];

uint code = GetLogicalDriveStrings (size, buffer);

if (code == 0)

{

MessageBox. Show ("Виклик GetLogicalDriveStrings не вдався!", "Помилка", MessageBoxButtons. OK, MessageBoxIcon. Error);

return null;

}

StringCollection list = new StringCollection ();

int start = 0;

for (int i = 0; i < code; ++i)

{

if (buffer [i] == 0)

{

string s = new string (buffer, start, i - start);

list. Add (s);

start = i + 1;

}

}

return list;

}

private void refresh ()

{

string versionString = "Windows";

string numLockState;

byte [] buf = new byte [512];

unsafe

{

long size = buf. Length;

long* p_size = &size;

fixed (byte* p_buf = buf)

{

GetComputerName (p_buf, p_size);

}

}

System. Text. Encoding textEnc = new System. Text. ASCIIEncoding ();

string computerName = textEnc. GetString (buf);

OSVersionInfoEx osvi = new OSVersionInfoEx ();

SystemInfo si = new SystemInfo ();

MemoryStatusEx ms = new MemoryStatusEx ();

StringBuilder systemDir = new StringBuilder (256);

ms. dwLength = (uint) Marshal. SizeOf (ms);

osvi. dwOSVersionInfoSize = Marshal. SizeOf (osvi);

GetVersionEx (osvi);

switch (osvi. dwMajorVersion)

{

case 6:

if (osvi. dwMinorVersion == 1 && osvi. wProductType == 1) versionString += " 7";

else if (osvi. dwMinorVersion == 1 && osvi. wProductType == 0) versionString += " Server 2008 R2";

else if (osvi. dwMinorVersion == 0 && osvi. wProductType == 1) versionString += " Vista";

else if (osvi. dwMinorVersion == 0 && osvi. wProductType == 0) versionString += " Server 2008";

break;

case 5:

if (osvi. dwMinorVersion == 2 && GetSystemMetrics (89) == 1) versionString += " Server 2003 R2";

else if (osvi. dwMinorVersion == 2 && osvi. wProductType == 0) versionString += " Server 2003";

else if (osvi. dwMinorVersion == 1) versionString += " XP";

else if (osvi. dwMinorVersion == 0) versionString += " 2000";

break;

default:

MessageBox. Show ("Invalid major version value!", "Error", MessageBoxButtons. OK, MessageBoxIcon. Error);

break;

}

versionString += " " + osvi. szCSDVersion;

label12. Text = "Microsoft "+ versionString;

label23. Text = osvi. dwMajorVersion +"." + osvi. dwMinorVersion +"." + osvi. dwBuildNumber;

GetSystemInfo (ref si);

label14. Text = si. dwNumberOfProcessors. ToString ();

label15. Text = si. lpMaximumApplicationAddress. ToString ();

GlobalMemoryStatusEx (ms);

label16. Text = Math. Round ( (double) (ms. ullTotalPhys / 1024/1024),

2). ToString () + " MБ";

if (GetKeyState (0x90) == 1) numLockState = "Активна";

else if (GetKeyState (0x90) == 0) numLockState = "Неактивна";

else numLockState = "Помилка";

label17. Text = numLockState;

label18. Text = GetSystemMetrics (14). ToString ();

label19. Text = GetSystemMetrics (1). ToString ();

GetSystemDirectory (systemDir, 256);

label20. Text = systemDir. ToString ();

label22. Text = computerName. ToString (). Trim ();

}

private void button4_Click (object sender, EventArgs e)

{

}

private void comboBox1_SelectedIndexChanged (object sender, EventArgs e)

{

ulong FreeBytesAvailable;

ulong TotalNumberOfBytes;

ulong TotalNumberOfFreeBytes;

string drive = comboBox1. SelectedItem. ToString ();

StringBuilder volname = new StringBuilder (261);

StringBuilder fsname = new StringBuilder (261);

uint sernum, maxlen;

uint flags;

if (! GetVolumeInformation (drive, volname, volname. Capacity, out sernum, out maxlen, out flags, fsname, fsname. Capacity))

Marshal. ThrowExceptionForHR (Marshal. GetHRForLastWin32Error ());

label34. Text = volname. ToString ();

label11. Text = fsname. ToString ();

byte [] data = BitConverter. GetBytes (sernum);

Array. Reverse (data);

label35. Text = BitConverter. ToString (data). Replace ("-","");

DriveType drt = GetDriveType (drive);

label21. Text = drt. ToString ();

GetDiskFreeSpaceEx (drive, out FreeBytesAvailable, out TotalNumberOfBytes, out TotalNumberOfFreeBytes);

label29. Text = Math. Round ( ( (double) TotalNumberOfBytes / 1024/1024/1024),

2). ToString () + " ГБ";

label8. Text = Math. Round ( ( (double) TotalNumberOfFreeBytes / 1024/1024/1024),

2). ToString () + " ГБ";

}

private void button1_Click (object sender, EventArgs e)

{

DialogResult dr = openFileDialog1. ShowDialog ();

if (dr == DialogResult. Cancel) return;

label28. Text = openFileDialog1. FileName;

DateTime CreationTime = DateTime. MinValue;

DateTime LastAccessTime = DateTime. MinValue;

DateTime LastWriteTime = DateTime. MinValue;

IntPtr ptr = IntPtr. Zero;

FileTime ftCreationTime = new FileTime ();

FileTime ftLastAccessTime = new FileTime ();

FileTime ftLastWriteTime = new FileTime ();

try

{

ptr = CreateFile (openFileDialog1. FileName, GENERIC_READ, FILE_SHARE_READ, IntPtr. Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr. Zero);

if (ptr. ToInt32 () == INVALID_HANDLE_VALUE) Marshal. ThrowExceptionForHR (Marshal. GetHRForLastWin32Error ());

if (GetFileTime (ptr, ref ftCreationTime, ref ftLastAccessTime, ref ftLastWriteTime)! = true) Marshal. ThrowExceptionForHR (Marshal. GetHRForLastWin32Error ());

CreationTime = DateTime. FromFileTimeUtc ( ( ( (long) ftCreationTime. dwHighDateTime) << 32) | ( (uint) ftCreationTime. dwLowDateTime));

LastAccessTime = DateTime. FromFileTimeUtc ( ( ( (long) ftLastAccessTime. dwHighDateTime) << 32) | ( (uint) ftLastAccessTime. dwLowDateTime));

LastWriteTime = DateTime. FromFileTimeUtc ( ( ( (long) ftLastWriteTime. dwHighDateTime) << 32) | ( (uint) ftLastWriteTime. dwLowDateTime));

}

catch (Exception ex)

{

throw (ex);

}

finally

{

if (ptr! = IntPtr. Zero && ptr. ToInt32 ()! = INVALID_HANDLE_VALUE) CloseHandle (ptr);

}

label25. Text = CreationTime. ToString ();

label45. Text = LastAccessTime. ToString ();

label44. Text = LastWriteTime. ToString ();

}

private void button2_Click (object sender, EventArgs e)

{

}

private void refreshRegData ()

{

label46. Text = "";

label47. Text = "";

label48. Text = "";

label49. Text = "";

label50. Text = "";

label51. Text = "";

RegistryKey key = Registry. CurrentUser. OpenSubKey ("Software"). OpenSubKey ("Microsoft"). OpenSubKey ("Visual Basic"). OpenSubKey ("6.0"). OpenSubKey ("AddInToolbar"). OpenSubKey ("VB Class Builder Utility");

if (key == null)

{

MessageBox. Show ("Не вдалося відкрити ключ реєстра VB 6 Class Builder", "Помилка", MessageBoxButtons. OK, MessageBoxIcon. Error);

return;

}

string [] subkeys = key. GetValueNames ();

if (subkeys. Length == 0)

{

MessageBox. Show ("Ключ рестра VB 6 Class Builder не містить значень", "Увага", MessageBoxButtons. OK, MessageBoxIcon. Information);

return;

}

else

{

foreach (string valueName in subkeys)

{

label46. Text += (valueName + "\n");

label47. Text += (key. GetValue (valueName) + "\n");

}

}

key. Close ();

key = Registry. CurrentUser. OpenSubKey ("Control Panel"). OpenSubKey ("Keyboard");

if (key == null)

{

MessageBox. Show ("Не вдалося відкрити ключ реєстра з параметрами клавіатури.", "Помилка", MessageBoxButtons. OK, MessageBoxIcon. Error);

return;

}

subkeys = key. GetValueNames ();

if (subkeys. Length == 0)

{

MessageBox. Show ("Ключ рестра з параметрами клавіатури не містить значень", "Увага", MessageBoxButtons. OK, MessageBoxIcon. Information);

return;

}

else

{

foreach (string valueName in subkeys)

{

label49. Text += (valueName + "\n");

label48. Text += (key. GetValue (valueName) + "\n");

}

}

key. Close ();

key = Registry. LocalMachine. OpenSubKey ("SOFTWARE"). OpenSubKey ("Microsoft"). OpenSubKey ("Internet Explorer");

if (key == null)

{

MessageBox. Show ("Не вдалося відкрити ключ реєстра з параметрами Internet Explorer.", "Помилка", MessageBoxButtons. OK, MessageBoxIcon. Error);

return;

}

subkeys = key. GetValueNames ();

if (subkeys. Length == 0)

{

MessageBox. Show ("Ключ рестра з параметрами Internet Explorer не містить значень", "Увага", MessageBoxButtons. OK, MessageBoxIcon. Information);

return;

}

else

{

foreach (string valueName in subkeys)

{

label51. Text += (valueName + "\n");

label50. Text += (key. GetValue (valueName) + "\n");

}

}

key. Close ();

}

private void MainWindow_KeyDown (object sender, KeyEventArgs e)

{

if (e. KeyCode == Keys. F1)

{

Help. ShowHelp (this, helpProvider1. HelpNamespace);

}

else if (e. Shift == true && e. Control == true && e. Alt == true && e. KeyCode == Keys. A)

{

MessageBox. Show ("Автор програми - Черненко Андрій Юрійович\nстудент групи АС-082. \nУсі права захищені (с)", "Автор", MessageBoxButtons. OK, MessageBoxIcon. Information);

}

}

private void button2_Click_1 (object sender, EventArgs e)

{

Help. ShowHelp (this, helpProvider1. HelpNamespace);

}

}

[StructLayout (LayoutKind. Sequential)]

public class OSVersionInfoEx

{

public int dwOSVersionInfoSize;

public int dwMajorVersion;

public int dwMinorVersion;

public int dwBuildNumber;

public int dwPlatformId;

[MarshalAs (UnmanagedType. ByValTStr, SizeConst = 128)]

public string szCSDVersion;

public short wServicePackMajor;

public short wServicePackMinor;

public short wSuiteMask;

public byte wProductType;

public byte wReserved;

}

[StructLayout (LayoutKind. Sequential)]

public struct SystemInfo

{

public uint dwOemId;

public uint dwPageSize;

public uint lpMinimumApplicationAddress;

public uint lpMaximumApplicationAddress;

public uint dwActiveProcessorMask;

public uint dwNumberOfProcessors;

public uint dwProcessorType;

public uint dwAllocationGranularity;

public uint dwProcessorLevel;

public uint dwProcessorRevision;

}

[StructLayout (LayoutKind. Sequential, CharSet = CharSet. Auto)]

public class MemoryStatusEx

{

public uint dwLength;

public uint dwMemoryLoad;

public ulong ullTotalPhys;

public ulong ullAvailPhys;

public ulong ullTotalPageFile;

public ulong ullAvailPageFile;

public ulong ullTotalVirtual;

public ulong ullAvailVirtual;

public ulong ullAvailExtendedVirtual;

public MemoryStatusEx ()

{

this. dwLength = (uint) Marshal. SizeOf (typeof (MemoryStatusEx));

}

}

[StructLayout (LayoutKind. Sequential)]

public struct FileTime

{

public uint dwLowDateTime;

public uint dwHighDateTime;

}

public enum DriveType: uint

{

Unknown = 0, // DRIVE_UNKNOWN

Error = 1, // DRIVE_NO_ROOT_DIR

Removable = 2, // DRIVE_REMOVABLE

Fixed = 3, // DRIVE_FIXED

Remote = 4, // DRIVE_REMOTE

CDROM = 5, // DRIVE_CDROM

RAMDisk = 6 // DRIVE_RAMDISK

}

}

Додаток 2. Лістинг додатка "specs WMI"

1. Program. cs - точка входу, початкова процедура програми:

using System;

using System. Collections. Generic;

using System. Linq;

using System. Windows. Forms;

namespace specs_wmi

{

static class Program

{

// / <summary>

// / The main entry point for the application.

// / </summary>

[STAThread]

static void Main ()

{

Application. EnableVisualStyles ();

Application. SetCompatibleTextRenderingDefault (false);

Application.run (new Form1 ());

}

}

}

2. Form1. cs - головна форма програми, реалізує основну функціональність:

using System;

using System. Collections. Generic;

using System.componentModel;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

using System. Windows. Forms;

using System. Management;

namespace specs_wmi

{

public partial class Form1: Form

{

public Form1 ()

{

InitializeComponent ();

getSystemData ();

getRegistryData ();

ManagementObjectSearcher mosDisks = new ManagementObjectSearcher ("SELECT * From Win32_LogicalDisk");

foreach (ManagementObject moDisk in mosDisks. Get ())

{

comboBox1. Items. Add (moDisk ["Caption"]. ToString ());

}

comboBox1. SelectedIndex = 0;

}

private void getRegistryData ()

{

label46. Text = "";

label47. Text = "";

label48. Text = "";

label49. Text = "";

label50. Text = "";

label51. Text = "";

ConnectionOptions options = new ConnectionOptions ();

options. EnablePrivileges = true;

options. Impersonation = ImpersonationLevel. Default;

ManagementScope scope = new ManagementScope ("\\\\. \\root\\default");

scope. Connect ();

System. Management. ManagementClass mc;

try

{

mc = new System. Management. ManagementClass ("StdRegProv");

ManagementBaseObject inParams = mc. GetMethodParameters ("EnumValues");

inParams ["hDefKey"] = (UInt32) 2147483649;

inParams ["sSubKeyName"] = "Software\\Microsoft\\Visual Basic\\6.0\\AddInToolbar\\VB Class Builder Utility";

ManagementBaseObject outParams;

try

{

outParams = mc. InvokeMethod ("EnumValues", inParams, null);

string [] names = (string []) outParams ["sNames"];

int [] types = (int []) outParams ["Types"];

for (int i = 0; i < names. Length; i++)

{

label46. Text += names [i] + "\n";

switch (types [i])

{

case 1:

inParams = mc. GetMethodParameters ("GetStringValue");

inParams ["hDefKey"] = (UInt32) 2147483649;

inParams ["sSubKeyName"] = "Software\\Microsoft\\Visual Basic\\6.0\\AddInToolbar\\VB Class Builder Utility";

inParams ["sValueName"] = names [i];

outParams = mc. InvokeMethod ("GetStringValue", inParams, null);

label47. Text += outParams ["sValue"]. ToString () + "\n";

break;

case 2:

inParams = mc. GetMethodParameters ("GetExpandedStringValue");

inParams ["hDefKey"] = (UInt32) 2147483649;

inParams ["sSubKeyName"] = "Software\\Microsoft\\Visual Basic\\6.0\\AddInToolbar\\VB Class Builder Utility";

inParams ["sValueName"] = names [i];

outParams = mc. InvokeMethod ("GetExpandedStringValue", inParams, null);

label47. Text += outParams ["sValue"]. ToString () + "\n";

break;

case 3:

inParams = mc. GetMethodParameters ("GetBinaryValue");

inParams ["hDefKey"] = (UInt32) 2147483649;

inParams ["sSubKeyName"] = "Software\\Microsoft\\Visual Basic\\6.0\\AddInToolbar\\VB Class Builder Utility";

inParams ["sValueName"] = names [i];

outParams = mc. InvokeMethod ("GetBinaryValue", inParams, null);

byte [] val = (byte []) outParams ["uValue"];

foreach (byte b in val) label47. Text += b. ToString () + "\n";

break;...


Подобные документы

  • Утиліти як сервісні програми, що розширюють можливості ОС, допомагають діагностувати й усувати проблеми, забезпечувати роботу системи. Очистка та дефрагментація жорстких дисків. Архівування файлів на жорстких дисках серверів і клієнтських комп'ютерів.

    аттестационная работа [2,7 M], добавлен 28.11.2013

  • Теорія обчислювальних систем. Режим обробки, що визначає порядок функціонування системи. Клас оброблюваних задач і порядок їхнього надходження в систему. Порядок ідентифікації обчислювальної системи. Математично задача синтезу обчислювальної системи.

    реферат [33,7 K], добавлен 08.09.2011

  • Злом комп'ютерної системи. Злом через налагодження перемикачів операційних систем. Отримання несанкціонованого доступу до чужої інформації. Аналіз безпеки обчислювальної системи, розробка необхідних вимог і умов підвищення рівня її захищеності.

    реферат [19,3 K], добавлен 05.11.2016

  • Опис команди, яка входить до складу операційної системи і є основою дослідження. Елементи мови С++, які застосовуються при написанні утиліт. Блок-схема, програма та інструкція по використанню утиліти, яка дозволяє швидко підключати мережеві диски.

    курсовая работа [310,5 K], добавлен 26.03.2015

  • Розробка інформаційної системи, що містить дані про товари, їх поставку і доставку за допомогою моделі "Сутність-зв'язок". Вибір засобів її реалізації Структурна схема реляційної бази даних та таблиці БД. Інструкція для користувача програмним продуктом.

    курсовая работа [2,4 M], добавлен 19.06.2013

  • Розробка програми для збору, збереження та обробки інформації про хід технологічного процесу і передачі її в локальну обчислювальну мережу. Структура та функції системи: алгоритми функціонування і програмне забезпечення КОМ, сервера і робочих станцій.

    курсовая работа [225,2 K], добавлен 28.08.2012

  • Розроблення та створення автоматизованої інформаційно-довідкової системи обліку проданих квитків на авіарейси. Обробка баз даних СКБД Access. Розробка зручного діалогового інтерфейсу у вигляді меню користувача, яке реалізоване через керуючу форму.

    курсовая работа [56,9 K], добавлен 16.04.2011

  • Обробка масивів формалізованих записів, їх застосування у базах даних підприємств для пошуку інформації про об’єкт. Вимоги до програмного продукту і документації; його структура і функціональна схема. Посібник користувача, умови виконання програми.

    курсовая работа [391,0 K], добавлен 13.10.2012

  • Створення програми для виконання найпростіших функцій календаря за допомогою Borland DELPHI 2007. Аналіз процесу обробки інформації і побудова функціональних діаграм. Розробка інтерфейсу користувача, форм вводу-виводу інформації, основних алгоритмів.

    курсовая работа [1,3 M], добавлен 01.06.2013

  • Розробка інтерфейсу користувача системи. Розробка підсистеми планування ремонтно-профілактичних робіт для відділу головного інженера на ВАТ "Макаронна фабрика". Розробка логічної і фізичної моделей бази даних. Опис реалізованих функцій системи.

    дипломная работа [103,0 K], добавлен 14.02.2014

  • Мета і призначення комплексної системи захисту інформації. Загальна характеристика автоматизованої системи установи та умов її функціонування. Формування моделей загроз інформації та порушника об'єкта інформаційної діяльності. Розробка політики безпеки.

    курсовая работа [166,9 K], добавлен 21.03.2013

  • Критерії (вимоги) до створення автоматичного робочого місця оператора реєстратури. Обґрунтування вибору середовища програмування та засобів збереження даних. Алгоритм програми. Опис інтерфейсу проекту системи. Програмні модулі та керівництво користувача.

    дипломная работа [1017,0 K], добавлен 31.10.2014

  • Проектування інтерфейсу програми. Вимоги до продукту. Вхідні дані на розробку автоматизованої системи. Вибір середовища програмування. Розробка структури бази даних. Функціональна та логічна структура програми. Розробка структури таблиць бази даних.

    курсовая работа [43,1 K], добавлен 30.06.2015

  • Cтворення системи для впорядковування інформації про файли, що зберігаються на компакт-дисках або інших знімних носіях. Загальні вимоги до розробки. Технології розробки Windows-додатків. Опис функціональних можливостей і програмної реалізації системи.

    дипломная работа [891,7 K], добавлен 25.10.2012

  • Розробка інформаційної системи для виконання перегляду відомостей про вулиці м. Києва, їх розташування, параметри та історію. Концептуальна і даталогічна модель бази даних. Зв’язки між сутностями. Oпис реалізації клієнтських застосувань та інтерфейсу.

    курсовая работа [498,6 K], добавлен 26.07.2013

  • Методи отримання довідки щодо використання команди операційної системи. Варіанти перенесення операційної системи на новий диск. Методи зміни атрибутів файлу за допомогою команд операційної системи. Сутність фрагментації файлів і способів їх усуннення.

    контрольная работа [17,3 K], добавлен 19.07.2010

  • Загальні відомості про обчислювальний кластер. Розробка імітаційної схеми кластера, моделі обчислювальної системи, керуючої системи, обчислювального завантаження потоком задач. Схема роботи алгоритмів планування. Результати експериментального дослідження.

    курсовая работа [2,0 M], добавлен 06.09.2011

  • Методи, засоби та алгоритми розв'язування задачі. Розробка інтерфейсу програми для забезпечення діалогу: ком'ютер - користувач при роботі з базою даних довідкової системи навчальних закладів. Програма та її опис, призначення. Логічна структура програми.

    курсовая работа [234,8 K], добавлен 14.03.2010

  • Методи первинної обробки даних - згладжування та характеристика сплайнів. Загальна характеристика об'єктно-орієнтованої мови Java. Принципи побудови графічного інтерфейсу. Розробка алгоритму програми та інтерфейсу користувача програмного продукту.

    дипломная работа [3,3 M], добавлен 10.10.2013

  • Вибір первинних вимірювальних перетворювачів та виконавчих механізмів, мікропроцесорних засобів автоматизації. Розробка блок-схеми системи автоматичного керування, програми функціонування вибраних засобів, принципових електричних схем зовнішніх з’єднань.

    курсовая работа [176,5 K], добавлен 08.03.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.