








Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
Community
Ask the community for help and clear up your study doubts
Discover the best universities in your country according to Docsity users
Free resources
Download our free guides on studying techniques, anxiety management strategies, and thesis advice from Docsity tutors
Изучить теоретические положения по данной лабораторной работе. 2. Установить в системе эмулятор виртуальных COM-портов (Virtual Serial Port Driver). 3. Создать два виртуальных COM-порта и эмулировать связь между ними. 4. Разработать программное обеспечение для передачи данных через последовательный интерфейс. Вариантами заданий могут быть следующие: – реализовать чат, функционирующий через COM-порт; – организовать пересылку файлов с одного компьютера на другой через COM-порт; – прочитать и изменить параметры заданного COM-порта.
Typology: Lab Reports
1 / 14
This page cannot be seen from the preview
Don't miss anything!
Ознакомление с программными методами получения конфигурации компьютера с использованием функций Windows API , реестра операционной системы Windows , посредством WMI - интерфейса.
Если программное обеспечение взаимодействует с устройствами компьютера на
низком уровне, использует какие-либо аппаратные особенности периферии, оно должно
иметь возможность автоматически определять конфигурацию аппаратных средств ЭВМ. В настоящее время выпускается много различных моделей персональных компьютеров и
серверных платформ с процессорами Intel и AMD , совместимых или не очень с
оригинальным компьютером IBM PC/AT. В компьютере могут быть установлены процессоры
различных моделей и различные версии BIOS. Что же касается номенклатуры периферийных
устройств, таких как сетевые контроллеры, видеоадаптеры, сетевые и звуковые адаптеры, то
она практически безгранична.
В операционной системе MS Windows существуют три основных способа для получения информации о комплектующих компьютера: чтение конфигурации из реестра,
вызов специальных функций Windows API , использование специального WMI - интерфейса.
Рассмотрим эти методы более детально.
1. Реестр Windows Системный реестр Windows - это большая база данных, в которой записаны настройки
как самой операционной системы, так и приложений, в ней установленных. Параметры устройств, сканеров, принтеров, плат, находящихся в компьютере, соединений удаленного
доступа и учетных записей почты, информация о связях файлов с программами, об открытых
окнах, установленных шрифтах, расположение значков на Рабочем столе, цветовые схемы
Windows , настройки программ, локальной сети и Internet и др.- все это хранят в себе глубины
реестра. Без него операционная система неработоспособна. Многие компоненты реестра
изменяются самостоятельно по приказам операционной системы или программ, некоторые
можно настроить с помощью диалоговых окон (скажем, назначение цветовой или звуковой схемы), но большая часть их недоступна для изменения из стандартных средств Windows.
Системный реестр имеет иерархическую структуру, которая подобна структуре
каталогов на жестком диске. Каждая главная ветвь (обозначенная значком папки в редакторе
системного реестра Regedit ) называется Корневой и содержит ключи. Каждый ключ может
содержать другие ключи (иногда называемые подключами), а также параметры.
Параметры содержат фактическую информацию, сохраненную в системном реестре. Имеется три типа параметров: строковые, двоичные, и DWORD. Реестр имеет шесть главных
ветвей, каждая из которых содержит определенную часть информации. Это следующие
ветви:
· HKEY_CLASSES_ROOT : содержит все типы ассоциаций к файлам, информацию об
OLE и данные по ярлыкам.
· HKEY_CURRENT_USER : связана с ветвью HKEY_USERS , и соответствует
пользователю, работающему в настоящее время на компьютере.
· HKEY_LOCAL_MACHINE : содержит определенную информацию о типах аппаратных средств, программного обеспечения, и других настройках на данном компьютере, эта
информация используется для всех пользователей, которые работают на этом компьютере.
· HKEY_USERS : содержит индивидуальные настройки каждого пользователя
компьютера, каждый пользователь представлен под ключом SID, расположенном под
главной ветвью.
· HKEY_CURRENT_CONFIG : связана с ветвью HKEY_LOCAL_MACHINE , и
соответствует текущей аппаратной конфигурации. · HKEY_DYN_DATA : связана с частью HKEY_LOCAL_MACHINE , и служит для
использования особенностей Plug-&-Play в Windows , этот раздел динамически изменяется,
когда устройства добавляются и удаляются из системы (в современных версиях Windows
отсутствует).
Вся информация об установленных компонентах и приложениях заносится в реестр при
установке операционной системы и обновляется при каждом запуске компьютера, а потому
является одним из источников получения данных о конфигурации. Ниже приведен список ключей реестра, которые нам интересны с точки зрения чтения
информации о конфигурации ЭВМ:
DWORD GetLogicalDriveStrings(DWORD nBufferLength,LPTSTR lpBuffer) Параметры: nBufferLength – длина буфера-приемника, lpBuffer – буфер. Записывает в буфер строку с именами всех логических дисков в формате “ A:\ NULL C:
NULL…NULL ”.
UINT GetDriveType(LPCTSTR lpRootPathName) Параметры: lpRootPathName – имя диска, например “C:\”
Возвращает тип диска: 0 – диск не может быть определен; 1 – нет диска с таким именем; DRIVE_REMOVABLE – съемный диск или дискета; DRIVE_FIXED – жесткий диск; DRIVE_REMOTE – сетевой диск; DRIVE_CDROM – CD-ROM ; DRIVE_RAMDISK – RAM - диск.
BOOL GetDiskFreeSpaceEx(LPCTSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailableToCaller, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes) Параметры: lpDirectoryName – имя диска, lpFreeBytesAvailableToCaller – количество байт, доступных пользователю на диске, lpTotalNumberOfBytes – общее число байт на диске, lpTotalNumberOfFreeBytes – полный объем диска в байтах. Возвращает в параметрах необходимые данные об объеме диска.
BOOL GetVolumeInformation(LPCTSTR lpRootPathName,LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize,LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize) Параметры: lpRootPathName – имя диска; lpVolumeNameBuffer – строка, в которую записывается метка диска; nVolumeNameSize – длина строки-приемника для метки диска; lpVolumeSerialNumber – серийный номер диска; lpMaximumComponentLength – максимально возможная длина элемента в имени файла или каталога на диске; lpFileSystemFlags – флаги файловой системы; lpFileSystemNameBuffer – строка-приемник для типа файловой системы; nFileSystemNameSize – длина строки для типа файловой системы. Функция служит для получения расширенных данных о логическом диске.
BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInformation) Определяет данные об операционной системе, возвращает информацию в структуру lpVersionInformation типа LPOSVERSIONINFO. Структура содержит следующие поля: DWORD dwOSVersionInfoSize – размер структуры; DWORD dwMajorVersion – старшая часть версии Windows; DWORD dwMinorVersion – младшая часть версии Windows; DWORD dwBuildNumber – версия сборки; DWORD dwPlatformId – тип платформы.
int GetKeyboardType(int nTypeFlag) Параметры: nTypeFlag – тип возвращаемых данных: 0 – тип клавиатуры; 1- подтип клавиатуры; 2 – число функциональных кнопок; Возвращает целое число, смысл которого зависит от параметра.
int GetSystemMetrics(int nIndex) Возвращает один из системных параметров в зависимости от параметра. Используется здесь для получения данных о мыши со следующими параметрами: SM_CMOUSEBUTTONS – возвращает число кнопок мыши;
Определяет параметры видео-адаптеров. Параметры: lpDevice – имя устройства (если NULL , то видео-адаптер по умолчанию); lpDisplayDevice – целевая структура для параметров; dwFlags – набор флагов. Структура типа PDISPLAY_DEVICE содержит следующие поля: DWORD cb – размер структуры; WCHAR DeviceName[32] – системное имя устройства; WCHAR DeviceString[128] – описание устройства; DWORD StateFlags – флаги состояния; WCHAR DeviceID[128] – идентификатор устройства; WCHAR DeviceKey[128] – ключ описания устройства в реестре.
int gethostname(char FAR * name,int namelen) Определяет имя хоста компьютера в сети. Параметры: name – строка для возвращаемого имени; namelen – длина строки- приемника.
3. Использование WMI-интерфейса WMI ( Windows management instrumentation interface ) – открытая унифицированная библиотека (репозиторий) однотипных интерфейсов доступа к параметрам, настройкам и свойствам различных систем Windows и их компонент. WMI предоставляет расширенный набор инструментальных средств выполнения практически любой задачи управления для большинства мощных приложений (например, Microsoft Exchange , Microsoft SQL Server и информационных служб в Microsoft Internet (IIS) ). Администратор выполняет следующие задачи.
Обращение к объектам и методам WMI в разных языках может немного отличаться из- за специфики синтаксиса работы с объектами и типами для каждого конкретного языка, но в целом все приемы очень сходны. Moniker string: дословный перевод этого словосочетания мог бы звучать примерно так: строка-прозвище или строка-кличка. По смыслу же это некое специальное имя (ссылка) для обращения к объектам или классам объектов WMI. Формат этой строки фактически представляет собой разновидность URL ( Universal Resource Locator ). Все moniker string начинаются с отличительного идентификатора Winmgmts :. Эта часть moniker string является обязательной. Далее формат зависит от того, как мы хотим обращаться к объекту. Например, вот так: Winmgmts://server01/root/cimv2:Win32_OperatingSystem В приведенном примере server01 – это сетевое имя компьютера, на котором мы хотим получить доступ к объекту WMI. Если указать вместо сетевого имени символ «.» (точка), то подключение будет происходить к локальному компьютеру. Root/CIMv2 – это пространство имен репозитория WMI (по аналогии очень похоже на виртуальный каталог веб-сервера). После двоеточия идет наименование класса WMI , к объектам которого мы хотим обратиться. В данном примере это класс Win32_OperatingSystem. Следует заметить, что в moniker string можно использовать не только прямую наклонную черту, но и обратную, так что строки « winmgmts://server01/root/cimv2 » и «winmgmts: \server01\root\cimv2 » одинаковы. При подключении к репозиторию WMI необязательно указывать имя локального сервера точкой. Строка может выглядеть и так: « WinMgmts:root/CIMv2 ». Если в строке moniker-string имя сервера не указано, то подключение произойдет к локальному репозиторию WMI. Точно так же, как и в случае использования строки « WinMgmts://./root/CIMv2 ». Технология WMI может использоваться для получения данных об аппаратном и программном обеспечении компьютера с помощью клиентских скриптов и приложений, а также для предоставления информации самой WMI путем создания провайдеров. Чтобы получить информацию из WMI с помощью скриптов или приложений, необходимо выполнить следующие действия:
большое количество языков и технологий для использования WMI.
Ниже приводится листинг небольшой программы на С++ , иллюстрирующей получение данных с помощью WMI. Хотя эта программа получает всего лишь тип и версию операционной системы, она наглядно демонстрирует, как с помощью технологии COM получить доступ к пространствам имен WMI и запросить необходимые данные.
_#define WIN32_DCOM #include
# pragma comment(lib, "wbemuuid.lib")
int main(int argc, char **argv) { HRESULT hres;
// Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
_bstr_t(L"ROOT\CIMV2"), // Object path of WMI namespace NULL, // User name. NULL = current user NULL, // User password. NULL = current 0, // Locale. NULL indicates current NULL, // Security flags. 0, // Authority (e.g. Kerberos) 0, // Context object &pSvc // pointer to IWbemServices proxy );
if (FAILED(hres)) { cout << "Could not connect. Error code = 0x" << hex << hres << endl; pLoc->Release(); CoUninitialize(); return 1; // Program has failed. }
cout << "Connected to ROOT\CIMV2 WMI namespace" << endl;
// Step 5: -------------------------------------------------- // Set security levels on the proxy -------------------------
hres = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities );
if (FAILED(hres)) { cout << "Could not set proxy blanket. Error code = 0x" << hex << hres << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. }
// Step 6: -------------------------------------------------- // Use the IWbemServices pointer to make requests of WMI ----
// For example, get the name of the operating system IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
if (FAILED(hres)) { cout << "Query for operating system name failed." << " Error code = 0x" << hex << hres << endl;
pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. }
// Step 7: ------------------------------------------------- // Get the data from the query in step 6 -------------------
IWbemClassObject *pclsObj; ULONG uReturn = 0;
while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if(0 == uReturn) { break; }
VARIANT vtProp; VariantInit(&vtProp);
// Get the value of the Name property hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); wcout << " OS Name : " << vtProp.bstrVal << endl; VariantClear(&vtProp); }
// Cleanup // ========
pSvc->Release(); pLoc->Release(); pEnumerator->Release(); pclsObj->Release(); CoUninitialize();
return 0; // Program successfully completed.
} Как видно из листинга, программа условно разбита на 7 шагов:
данном примере формируется запрос имени операционной системы путем вызова
IWbemServices::ExecQuery и передачи в качестве одного из параметров строки WQL - запроса:
SELECT * FROM Win32_OperatingSystem Результат запроса получают с помощью интерфейса IEnumWbemClassObject.
интерфейс IWbemClassObject и его метод Get.
Приложения получают доступ к системной информации при помощи WMI Query Language ( WQL ). WQL – это упрощенное подмножество языка SQL с некоторыми специфичными для WMI дополнениями. При использовании WQL приложение извлекает данные из специфичного экземпляра SQL Server, БД или объекта БД. WMI провайдер для серверных событий транслирует запрос в уведомления о событиях, которые созданы на целевой БД. В отличие от SQL запросов в WQL запросах есть ограничения на количество ключевых слов And и OR. Большое количество ключевых слов WQL , используемых в сложном запросе, может привести к ошибке WBEM_E_QUOTA_VIOLATION. WQL не поддерживает запросы, при которых идет обращение сразу к нескольким пространствам имен. WQL не поддерживает запросы к таким типам данных как массивы. Ниже приведен полный код на С# для получения информации о материнской плате, установленной на компьютере:
using System; using System.Management; using System.Windows.Forms;
namespace WMISample { public class MyWMIQuery { public static void Main() { try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_BaseBoard");
foreach (ManagementObject queryObj in searcher.Get()) { Console.WriteLine("-----------------------------------"); Console.WriteLine("Производитель платы: " + queryObj["Manufacturer"]); Console.WriteLine("Модель: " + queryObj["Product"]); Console.WriteLine("Серийный номер: " + queryObj["SerialNumber"]); Console.WriteLine("-----------------------------------"); Console.WriteLine("Вся информация, доступная о материнской плате:"); Console.WriteLine(queryObj.GetText(TextFormat.Mof)); } } catch (ManagementException e) { MessageBox.Show("Во время выполнения WMI запроса возникла ошибка: " + e.Message); } Console.WriteLine("Press any key"); Console.ReadKey(); } } }
Полное описание классов WMI , которые можно использовать в прикладных программах, приведено в утилите WMI tutor , находящейся в подкаталоге WMI каталога с методическими указаниями к данной лабораторной работе.
Персональный компьютер с установленной операционной системой MS Windows 2000 SP4 , XP SP2, Vista или 7 и средами разработки ПО Borland C++ Builder или MS Visual Studio 2005/2008/.
Разработать программное обеспечение для определения конфигурации тестового компьютера.
Отчет должен содержать:
6.1. Что представляет собой реестр Windows? Какая информация в нем хранится? 6.2. По каким ключам реестра содержатся сведения о конфигурации компьютера? 6.3. Каким образом можно программно получить доступ к ключам реестра? 6.4. Что такое Windows API? Для какой цели его можно использовать? 6.5. Перечислите функции Windows API , которые служат для получения информации об устройствах компьютера. 6.6. Опишите структуру и назначение WMI интерфейса. 6.7. Каким образом осуществляется программный доступ к объектам WMI? 6.8. Что такое Moniker string? 6.9. Для чего используется язык WQL? В чем заключаются его особенности по сравнению с языком SQL? 6.10. Дайте сравнительную характеристику трем изученным методам получения информации о конфигурации компьютера.