МИНОБРНАУКИ РОССИИ Федеральное государственное бюджетное образовательное
учреждение высшего профессионального образования
«Тульский государственный университет» Кафедра электронных вычислительных машин
Сборник методических указаний к лабораторным работам
по дисциплине
БЕЗОПАСНОСТЬ ОПЕРАЦИОННЫХ СИСТЕМ
Направление подготовки (cпециальность): 090303 «Информационная безопасность автоматизированных систем»
Квалификация (степень) выпускника: «Специалист»
Форма обучения: очная
Тула 2011 г.
Методические указания к лабораторным работам составлены к.т.н., доц. А.С. Новиковым и обсуждены на заседании кафедры электронных вычислительных машин факультета кибернетики,
протокол №__17___ от "__27__"___июня______ 2011 г.
Зав. кафедрой________________В.С. Карпов
Методические указания к лабораторным работам пересмотрены и утверждены на заседании кафедры электронных вычислительных машин факультета кибернетики,
протокол №___ от "___"____________ 20___ г.
Зав. кафедрой________________В.С. Карпов
Методические указания к лабораторным работам пересмотрены и утверждены на заседании кафедры электронных вычислительных машин факультета кибернетики,
протокол №___ от "___"____________ 20___ г.
Зав. кафедрой________________В.С. Карпов
Методические указания к лабораторным работам пересмотрены и утверждены на заседании кафедры электронных вычислительных машин факультета кибернетики,
протокол №___ от "___"____________ 20___ г.
Зав. кафедрой________________В.С. Карпов СОДЕРЖАНИЕ
Лабораторная работа № 1. Получение информации о конфигурации компьютера 5
Лабораторная работа № 2. Командные интерпретаторы POSIX-совместимых операционных систем 19
Лабораторная работа № 3. Работа с файлами и каталогами в ОС Unix 26
Лабораторная работа № 4. Структура системы управления вводом-выводом в ОС Unix 31
Лабораторная работа № 5. Работа с процессами в ОС Unix. Сигналы и каналы в Unix 38
Лабораторная работа № 6. Базовые технологии безопасности операционных систем 43
Лабораторная работа № 7. Парольная политика безопасности операционных систем 49
Лабораторная работа № 8. Оценка защищенности NT-системы: безопасность файловой системы, права доступа, квоты, связи и их настройка 53
Лабораторная работа № 9. Оценка защищенности NT-системы: защита реестра 59
Параметр 62
Ключ: [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] 62
REG_DWORD 62
REG_DWORD 62
REG_DWORD 62
REG_DWORD 62
REG_DWORD 62
REG_DWORD 62
REG_DWORD 62
REG_DWORD 62
REG_DWORD 62
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 63
REG_DWORD 64
REG_DWORD 64
REG_DWORD 64
REG_DWORD 64
REG_DWORD 64
REG_DWORD 64
REG_DWORD 64
REG_DWORD 64
REG_DWORD 64
REG_DWORD 64
REG_DWORD 64
REG_DWORD 64
REG_DWORD 64
Лабораторная работа № 10. Методы и средства несанкционированного доступа к ресурсам ОС 67
Лабораторная работа № 11. Оценка защищенности NT-системы: политика безопасности в области паролей и аудита 72
Лабораторная работа № 12. Администрирование ОС Windows с помощью средства автоматизации Microsoft PowerShell 78
Лабораторная работа № 13. Windows PowerShell: управление компьютером 88
Лабораторная работа № 14. Windows PowerShell: работа с файлами, папками и реестром 98
Лабораторная работа № 15. Windows PowerShell: работа с системными журналами 105
Лабораторная работа № 1. Получение информации о конфигурации компьютера
1. Цели работы
Ознакомление с программными методами получения конфигурации компьютера с использованием функций WindowsAPI, реестра операционной системы Windows, посредством WMI-интерфейса. 2. Теоретические сведения
Если программное обеспечение взаимодействует с устройствами компьютера на низком уровне, использует какие-либо аппаратные особенности периферии, оно должно иметь возможность автоматически определять конфигурацию аппаратных средств ЭВМ. В настоящее время выпускается много различных моделей персональных компьютеров и серверных платформ с процессорами Intel и AMD, совместимых или не очень с оригинальным компьютером IBM PC/AT. В компьютере могут быть установлены процессоры различных моделей и различные версии BIOS. Что же касается номенклатуры периферийных устройств, таких как сетевые контроллеры, видеоадаптеры, сетевые и звуковые адаптеры, то она практически безгранична.
В операционной системе MSWindows существуют три основных способа для получения информации о комплектующих компьютера: чтение конфигурации из реестра, вызов специальных функций WindowsAPI, использование специального 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 отсутствует).
Вся информация об установленных компонентах и приложениях заносится в реестр при установке операционной системы и обновляется при каждом запуске компьютера, а потому является одним из источников получения данных о конфигурации.
Ниже приведен список ключей реестра, которые нам интересны с точки зрения чтения информации о конфигурации ЭВМ:
– Информация о BIOS
Дата системного BIOS – HKEY_LOCAL_MACHINE \ HARDWARE \ DESCRIPTION \ System \ SystemBiosDate.
Дата видео BIOS – HKEY_LOCAL_MACHINE \ HARDWARE \ DESCRIPTION \ System \ VideoBiosDate.
– Информация о центральном процессоре
Модель – HKEY_LOCAL_MACHINE \ HARDWARE \ DESCRIPTION \ System \ CentralProcessor \ 0 \ Identifier.
Название – HKEY_LOCAL_MACHINE \ HARDWARE \ DESCRIPTION \ System \ CentralProcessor \ 0 \ ProcessorNameString.
Фирма-изготовитель – HKEY_LOCAL_MACHINE \ HARDWARE \ DESCRIPTION \ System \ CentralProcessor \ 0 \ VendorIdentifier.
– информация о сопроцессоре
Модель – HKEY_LOCAL_MACHINE \ HARDWARE \ DESCRIPTION \ System \ CentralProcessor \ 0 \ Identifier.
– информация об установленных в системе CD-ROM
Название – HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ Scsi \ Scsi Port 0 \ Scsi Bus 0 \ Target Id 0 \ Logical Unit Id 0 \ DeviceName.
Модель – HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ Scsi \ Scsi Port 0 \ Scsi Bus 0 \ Target Id 0 \ Logical Unit Id 0 \ Identifier.
Тип – HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ Scsi \ Scsi Port 0 \ Scsi Bus 0 \ Target Id 0 \ Logical Unit Id 0 \ Type.
– информация об установленных в системе жестких дисках
Модель – HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ Scsi \ Scsi Port 1 \ Scsi Bus 0 \ Target Id 0 \ Logical Unit Id 0 \ Identifier.
Тип – HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ Scsi \ Scsi Port 1 \ Scsi Bus 0 \ Target Id 0 \ Logical Unit Id 0 \ Type.
– Информация об IDE, USB, PCI и аудио устройствах, профили оборудования, тип клавиатуры
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\.
– Информация обо всех логических дисках в системе
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\.
– Установленные в системе принтеры
HKEY_CURRENT_CONFIG\System\CurrentControlSet\Control\Print.
– Настройки видео
HKEY_CURRENT_CONFIG\System\CurrentControlSet\Control\Video.
– Настройки клавиатуры и мыши
HKEY_USERS\.DEFAULT\Control Panel.
Механизм программной работы с реестром следующий:
1. Открыть ключ (вызвать функцию OpenKey()).
2. Прочитать или записать данные.
3. Закрыть ключ (CloseKey()).
Для работы с реестром существуют стандартные функции WindowsAPI, мы же рассмотрим программную работу с реестром на примере класса C++ BuilderTRegistry.
Tregistry имеет четыре свойства:
CurentKey: содержит текущее значение ключа. Значение ключа – это целое число, которое идентифицирует ключ. RootKey: содержит строку- имя текущего корневого ключа ( по умолчанию \HKEY_CURENT_USER). CurrentPath: содержит строку- имя и путь текущего ключа ,без корневого.
LazyWrite: определяет – предавать управление приложению во время записи данных в ключ (true), или не передавать до тех пор пока запись не завершится (false).
Класс Tregistry содержит несколько методов для работы с реестром. Вот некоторые из них:
CloseKey: закрывает ключ и записывает в него данные. CreateKey: создает ключ, но не открывает его. DeleteKey: удаляет любой ключ, для удаления текущего можно просто передать пустую строку. GetKeyNames: возвращает потомку TStrings все подключи. GetValueNames: возвращает имена всех элементов ключа. KeyExists: true – если указанный ключ существует, false – если нет. OpenKey: открывает указанный ключ, имеет два параметра. Второй параметр отвечает за то, создавать ключ, если он не существует или нет (true, false). ValueExists: true – если указанный элемент данных существует. LoadKey, SaveKey: эти два метода загружают и сохраняют ключ на диске. ReadBool: этот и следующие методы читают из указанного элемента ключа данные соответствующего типа. ReadDateTime ReadFloat ReadInteger ReadString WriteBinaryData: этот и следующие методы записывают в указанный элемент ключа данные соответствующего типа. WriteBool WriteDateTime WriteFloat WriteInteger WriteString
Примеры использования класса TRegistry:
– Открытие ключа (используются функции OpenKey() или OpenKeyReadOnly()):
TRegistry& regKey1 = *new TRegistry();
regKey1.OpenKeyReadOnly("HARDWARE\\DESCRIPTION\\System");
– Чтение поля ключа (используется функция ReadString()):
Memo1->Lines->Add(regKey1.ReadString("SystemBiosDate"));
– Удаление ссылки на объект реестра (используется оператор delete):
delete ®Key1; 2. Использование функций WindowsAPI
Windows API (application programming interfaces) — общее наименование для целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Windows и Windows NT корпорации Майкрософт. Является самым прямым способом взаимодействия приложений с Windows. Для создания программ, использующих Windows API, Майкрософт выпускает SDK, который называется Platform SDK и содержит документацию, набор библиотек, утилит и других инструментальных средств.
Windows API был изначально спроектирован для использования в программах, написанных на языке C (или C++). Работа через Windows API — это наиболее близкий к системе способ взаимодействия с ней из прикладных программ. Более низкий уровень доступа, необходимый только для драйверов устройств, в текущих версиях Windows предоставляется через Windows Driver Model.
Для получения данных о конфигурации устройств компьютера можно использовать следующие функции Win32 API: DWORD GetLogicalDriveStrings(DWORD nBufferLength,LPTSTR lpBuffer)
Параметры: nBufferLength – длина буфера-приемника, lpBuffer – буфер.
Записывает в буфер строку с именами всех логических дисков в формате “A:\ NULLC:\ NULL…NULL”. UINTGetDriveType(LPCTSTRlpRootPathName)
Параметры: 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 – длина строки для типа файловой системы.
Функция служит для получения расширенных данных о логическом диске. BOOLGetVersionEx(LPOSVERSIONINFOlpVersionInformation)
Определяет данные об операционной системе, возвращает информацию в структуру lpVersionInformation типа LPOSVERSIONINFO. Структура содержит следующие поля:
DWORD dwOSVersionInfoSize – размер структуры;
DWORD dwMajorVersion – старшая часть версии Windows;
DWORD dwMinorVersion – младшая часть версии Windows;
DWORDdwBuildNumber – версия сборки;
DWORDdwPlatformId – тип платформы. intGetKeyboardType(intnTypeFlag)
Параметры: nTypeFlag – тип возвращаемых данных:
0 – тип клавиатуры;
1- подтип клавиатуры;
2 – число функциональных кнопок;
Возвращает целое число, смысл которого зависит от параметра. intGetSystemMetrics(intnIndex)
Возвращает один из системных параметров в зависимости от параметра. Используется здесь для получения данных о мыши со следующими параметрами:
SM_CMOUSEBUTTONS – возвращает число кнопок мыши;
SM_MOUSEWHEELPRESENT – определяет наличие или отсутствие колесика на мыши (возвращает true или false). VOIDGlobalMemoryStatus(LPMEMORYSTATUSlpBuffer)
Заполняет структуру типа LPMEMORYSTATUS, включающую следующие поля:
DWORD dwLength – размер структуры;
DWORDdwMemoryLoad – загруженность памяти в %;
DWORDdwTotalPhys – полный объем физической памяти;
DWORDdwAvailPhys – свободная физическая память;
DWORDdwTotalPageFile – объем файла подкачки;
DWORDdwAvailPageFile – доступная память файла подкачки;
DWORDdwTotalVirtual – объем виртуальной памяти;
DWORD dwAvailVirtual – доступная виртуальная память. VOID GetSystemInfo(LPSYSTEM_INFO lpSystemInfo)
Заполняет структуру типа LPSYSTEM_INFO следующими данными:
dwNumberOfProcessors – число процессоров в системе;
wProcessorArchitecture – тип архитектуры процессора:
PROCESSOR_ARCHITECTURE_INTEL
PROCESSOR_ARCHITECTURE_MIPS
PROCESSOR_ARCHITECTURE_ALPHA
PROCESSOR_ARCHITECTURE_PPC
PROCESSOR_ARCHITECTURE_UNKNOWN
wProcessorLevel – семейство (класс) процессора; BOOL IsProcessorFeaturePresent(DWORD ProcessorFeature)
Определяет особенности процессора:
PF_FLOATING_POINT_PRECISION_ERRATA – возможны ошибки операций с плавающей точкой;
PF_FLOATING_POINT_EMULATED – эмуляция операций с плавающей точкой;
PF_COMPARE_EXCHANGE_DOUBLE – улучшенное сравнение вещественных данных;
PF_MMX_INSTRUCTIONS_AVAILABLE – поддержка MMX. UINTwaveOutGetNumDevs(VOID)
Определяет число звуковых устройств. BOOL EnumDisplaySettings(LPCTSTR lpszDeviceName,
DWORD iModeNum,
LPDEVMODElpDevMode)
Определяет установки дисплея. Возвращает данные в структуру типа LPDEVMODE, которая содержит следующие полезные поля:
dmBitsPerPel – число бит на один пиксель (цветовой режим);
dmPelsWidth – ширина экрана в пикселях;
dmPelsHeight – высота экрана в пикселях;
dmDisplayFrequency - частота обновления экрана в Герцах.
Параметры: lpszDeviceName – системное имя устройства; iModeNum – номер видео-режима (0 – основной); lpDevMode – целевая структура. BOOL EnumDisplayDevices(LPCTSTR lpDevice,
DWORD iDevNum,
PDISPLAY_DEVICE lpDisplayDevice,
DWORD dwFlags)
Определяет параметры видео-адаптеров.
Параметры: 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 (Windowsmanagementinstrumentationinterface) – открытая унифицированная библиотека (репозиторий) однотипных интерфейсов доступа к параметрам, настройкам и свойствам различных систем Windows и их компонент.
WMI предоставляет расширенный набор инструментальных средств выполнения практически любой задачи управления для большинства мощных приложений (например, Microsoft Exchange, Microsoft SQL Server и информационных служб в Microsoft Internet (IIS)). Администратор выполняет следующие задачи.
Контроль работоспособности приложений. Обнаружение узких мест и сбоев. Управление и настройка приложений. Запрашивание данных приложения (использование обхода и запрашивания связей объектов). Выполнение цельных локальных или удаленных операций управления. Получение конфигурации установленного на ЭВМ оборудования.
Архитектура WMI состоит из следующих трех ярусов. Компоненты программного обеспечения, выполняющие операции с помощью WMI (например, чтение подробных сведений об управлении, настройка систем и подписка на события). Посредник между поставщиками и клиентами, предоставляющий некоторые ключевые службы, такие как стандартная публикация событий или подписка, фильтрация событий, механизм запросов и т. д. Компоненты программного обеспечения, захватывающие и возвращающие реальные данные для клиентских приложений, обрабатывающие вызовы методов из клиентов и связывающие клиента с управляемой инфраструктурой.
Доступ к WMI может осуществляться через интерфейсы COM+ и .NET Framework. Это означает, что любой язык программирования, который поддерживает взаимодействие с Microsoft Windows COM+ и .NET Framework, может использоваться для работы с WMI. К перечню таких языков, в частности, относятся: VBScript, Visual Basic и Visual Basic .NET, Java Script, Python, Perl, PHP, C#, C++, Pascal, TCL и другие.
Обращение к объектам и методам 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 на локальном или удаленном компьютере. После подключения можно получить информацию с помощью запросов и перечислений, методов и свойств объектов, представляемых провайдерами WMI.
Ниже приводится листинг небольшой программы на С++, иллюстрирующей получение данных с помощью WMI. Хотя эта программа получает всего лишь тип и версию операционной системы, она наглядно демонстрирует, как с помощью технологии COM получить доступ к пространствам имен WMI и запросить необходимые данные. #define _WIN32_DCOM
#include
using namespace std;
#include
#include # pragma comment(lib, "wbemuuid.lib") int main(int argc, char **argv)
{
HRESULT hres; // Step 1: --------------------------------------------------
// Initialize COM. ------------------------------------------ hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
cout << "Failed to initialize COM library. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
} // Step 2: --------------------------------------------------
// Set general COM security levels --------------------------
// Note: If you are using Windows 2000, you need to specify -
// the default authentication credentials for a user by using
// a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
// parameter of CoInitializeSecurity ------------------------ hres = CoInitializeSecurity(
NULL,
-1, // COM authentication
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
NULL, // Authentication info
EOAC_NONE, // Additional capabilities
NULL // Reserved
);
if (FAILED(hres))
{
cout << "Failed to initialize security. Error code = 0x"
<< hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
}
// Step 3: ---------------------------------------------------
// Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = NULL; hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(hres))
{
cout << "Failed to create IWbemLocator object."
<< " Err code = 0x"
<< hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
} // Step 4: -----------------------------------------------------
// Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = NULL;
// Connect to the root\cimv2 namespace with
// the current user and obtain pointer pSvc
// to make IWbemServices calls.
hres = pLoc->ConnectServer(
_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 шагов:
Инициализация COM с помощью вызова CoInitializeEx(). Установка уровня безопасности для СОМ вызовом функции CoInitializeSecurity. Создание указателя для WMI с помощью CoCreateInstance. Получение указателя на интерфейс IWbemServices для пространства имен root\cimv2 на локальном компьютере путем вызова IWbemLocator::ConnectServer. Установка безопасности прокси для IWbemServices. Использование указателя на IWbemServices для формирования запросов WMI. В данном примере формируется запрос имени операционной системы путем вызова IWbemServices::ExecQuery и передачи в качестве одного из параметров строки WQL-запроса:
SELECT * FROMWin32_OperatingSystem
Результат запроса получают с помощью интерфейса IEnumWbemClassObject.
Получение и отображение информации из запроса. Для этого используется интерфейс IWbemClassObject и его метод Get.
Получение информации о конфигурации компьютера упрощается благодаря использованию языка C# и классам из пространства имен System.Management. Потребитель WMI может следить за состоянием приложения, ходом его работы и конфигурацией. Эти возможности поддерживаются набором многофункциональных инструментов WMI, встроенных в среду разработки Microsoft Visual Studio .NET.
Пространство имен System.Management предоставляет различные типы для поддержки операций WMI:
ManagementObject или ManagementClass. Отдельный объект или класс управления соответственно. ManagementObjectSearcher. Используется для получения набора ManagementObjects или ManagementClasses на основе определенного запроса или перечислимого. ManagementEventWatcher. Используется для подписки на уведомления о событиях от WMI. ManagementQuery. Используется как основа для всех классов запросов.
Для доступа к информации о компьютерах или приложениях .NET-разработчики могут использовать имеющиеся знания, поскольку WMI везде, где это возможно, опирается на стандартную базовую инфраструктуру. Принципы кодирования на основе классов System.Management являются естественными для среды .NET.
Потребление управляющей информации необходимо не только для управления приложениями. При помощи System.Management любое приложение может получить информацию о своей рабочей среде. Например, если приложению требуется знать, какой объем дискового пространства свободен и запущена ли нужная ему служба, оно может получить эту информацию через System.Management.
Чтобы выполнить запрос к WMI, можно использовать следующие строки кода:
ManagementObjectSearcher query1 = new ManagementObjectSearcher(query);
ManagementObjectCollection queryCollection1 = query1.Get();
Запросы создаются на специальном языке WQL, например:
Select * from Win32_VideoController
В результате получим информацию о видеокарте, установленной в системе:
Приложения получают доступ к системной информации при помощи 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, которые можно использовать в прикладных программах, приведено в утилите WMItutor, находящейся в подкаталоге WMI каталога с методическими указаниями к данной лабораторной работе.
3. Оборудование
Персональный компьютер с установленной операционной системой MSWindows 2000 SP4, XPSP2, Vista или 7 и средами разработки ПО BorlandC++ Builder или MSVisualStudio 2005/2008/2010. 4. Задание на работу
Разработать программное обеспечение для определения конфигурации тестового компьютера.
1. Для получения конфигурации использовать возможности, предоставляемые WMI-интерфейсом.
2. Для получения конфигурации использовать соответствующие функции WindowsAPI.
3. Информацию о конфигурации прочитать из реестра MSWindows. 5. Оформление отчета
Отчет должен содержать:
название и цель работы; вариант задания; результаты тестирования компьютеров, указанных преподавателем;
листинг программы, реализующей задание. 6 Контрольные вопросы
6.1. Что представляет собой реестр Windows? Какая информация в нем хранится?
6.2. По каким ключам реестра содержатся сведения о конфигурации компьютера?
6.3. Каким образом можно программно получить доступ к ключам реестра?
6.4. Что такое WindowsAPI? Для какой цели его можно использовать?
6.5. Перечислите функции WindowsAPI, которые служат для получения информации об устройствах компьютера.
6.6. Опишите структуру и назначение WMI интерфейса.
6.7. Каким образом осуществляется программный доступ к объектам WMI?
6.8. Что такое Moniker string?
6.9. Для чего используется язык WQL? В чем заключаются его особенности по сравнению с языком SQL?
6.10. Дайте сравнительную характеристику трем изученным методам получения информации о конфигурации компьютера. 7. Библиографический список
1. Троелсен Э. C# и платформа .Net. Библиотека программиста. – СПб.: Питер, 2002. – 800 с.
2. Уоткинз Д., Хаммонд М., Эйбрамз Б. Программирование на платформе .Net. - М.: Издательский дом "Вильямс", 2003. – 368 с.
3. MSDN 2005. Электронная документация Microsoft для разработчиков программного обеспечения. – 200000 с.
4. Хонейкатт Дж. Реестр Windows XP: справочник профессионала. – М.: Изд-во «ЭКОМ», 2003. – 655 с.
5. Внутри Windows Management Interface.//Windows 2000 Magazine, №3, 2000.
6. Сценарии WMI для начинающих.//Windows IT Pro, №5, 2001.
|