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

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

Скачать работу Скачать уникальную работу

Чтобы скачать работу, Вы должны пройти проверку:


Аннотация к работе
Розробка інтерфейсу користувача 1.1 Розробка інтерфейсу утиліти Розробка Win32 API додатка 2.4 Визначення найстаршої адреси, доступної додаткам 2.11 Визначення параметрів дисків

Список литературы
Додатки

Вступ

Сімейство операційних систем 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.

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

IMG_ca88f499-d5b0-4eb6-8b8d-d2a79419a6e4

Рис.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 "

");

label48. Text = (key. GETVALUE (VALUENAME) "

");

}

4. Закриття ключа: key. Close ();

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

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

IMG_8dcf6fe2-7040-4807-a6db-2b20003e9d3e Рис.2.13.1 Додаток "specs API"

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

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

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

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

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

Для використання WMI у С#-додатках необхідно підключити простори імен 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

ПараметрТипОпис

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

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

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

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



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

ПараметрТипОпис

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

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



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

ПараметрТипОпис

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



За допомогою обєктів 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

ПараметрТипОпис

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

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

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

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

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

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

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

VOLUMEDIRTYbooleanЯкщо 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 ("\\\\. \

oot\\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 буле виведене наступне повідомлення:

IMG_4561e65c-4134-41c0-9f2b-ae48e008815e

Рис.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);

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

IMG_73a28027-4830-4808-8756-f32a83e87ed3

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

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

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

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

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

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

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

IMG_4a58f6d5-de9c-4f78-98fb-20a74029af5c

IMG_81b3918e-ca07-4bc5-abaa-edb451dc6972

IMG_2cee2871-3f35-44c4-8d15-a7628e6f8bcd

IMG_21f405f8-ab02-497b-bd4b-9e045d61e581

Рис.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 () " МБ";

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 "

");

label47. Text = (key. GETVALUE (VALUENAME) "

");

}

} 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 "

");

label48. Text = (key. GETVALUE (VALUENAME) "

");

}

} 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 "

");

label50. Text = (key. GETVALUE (VALUENAME) "

");

}

} 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 ("Автор програми - Черненко Андрій Юрійович

студент групи АС-082. \NYCI права захищені (с)", "Автор", 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

{

// /

// / The main entry point for the application.

// /

[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 ("\\\\. \

oot\\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] "

";

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 () "

";

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 () "

";

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 () "

";

break;

case 4: INPARAMS = mc. GETMETHODPARAMETERS ("GETDWORDVALUE");

INPARAMS ["HDEFKEY"] = (UINT32) 2147483649;

INPARAMS ["SSUBKEYNAME"] = "Software\\Microsoft\\Visual Basic\\6.0\\ADDINTOOLBAR\\VB Class Builder Utility";

INPARAMS ["SVALUENAME"] = names [i];

OUTPARAMS = mc. INVOKEMETHOD ("GETDWORDVALUE", INPARAMS, null);

label47. Text = OUTPARAMS ["UVALUE"]. TOSTRING () "

";

break;

case 7: INPARAMS = mc. GETMETHODPARAMETERS ("GETMULTISTRINGVALUE");

INPARAMS ["HDEFKEY"] = (UINT32) 2147483649;

INPARAMS ["SSUBKEYNAME"] = "Software\\Microsoft\\Visual Basic\\6.0\\ADDINTOOLBAR\\VB Class Builder Utility";

INPARAMS ["SVALUENAME"] = names [i];

OUTPARAMS = mc. INVOKEMETHOD ("GETMULTISTRINGVALUE", INPARAMS, null);

string [] sval = (string []) OUTPARAMS ["UVALUE"];

bool multistr = sval. Length > 1;

foreach (string b in sval)

{ label47. Text = b;

if (multistr)

Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность
своей работы


Новые загруженные работы

Дисциплины научных работ





Хотите, перезвоним вам?