- •Введение
- •1. Требования к курсовой работе
- •2. Основные этапы выполнения курсовой работы
- •3. Требования к оформлению курсовой работы
- •4. Теоретические сведения
- •4.1 Основы технологии Windows Management Instrumentation
- •4.1.1 Введение
- •4.1.2 Работа с процессами и потоками в wmi
- •4.1.3 Обработка событий в wmi
- •4.1.4 Сбор информации о памяти
- •4.1.5 Планирование заданий
- •4.1.6 Работа с файловой системой
- •4.2.1 Введение
- •4.2.2 Инициализация com
- •4.2.3 Создание подключения к пространству имен wmi
- •4.2.4 Установка уровней безопасности для wmi подключения
- •4.2.5 Реализация функциональности приложения
- •4.2.6 Очистка и корректное завершение wmi приложения
- •4.3 Основные понятия технологии ole-автоматизации
- •4.4 Примеры сценариев wsh использующих ole-автоматизацию
- •5. Задания на курсовую работу по дисциплине «Системное программное обеспечение»
- •Литература
- •Приложение а
- •Оценка ________________ Дата защиты ________________ донецк - ДонНту – 200_ Приложение б
4.2.3 Создание подключения к пространству имен wmi
Так как WMI выполняется в отдельном процессе, а не в том же, что и создаваемое приложение, необходимо установить соединение между приложением и WMI.
Подключение к пространству имен WMI означает, что после инициализации WMI посредством стандартных вызовов COM, устанавливается соединение с WMI с помощью вызова метода IWbemLocator::ConnectServer. Метод ConnectServer возвращает интерфейсный заместитель (proxy) интерфейса IWbemServices, через который можно получить доступ к различным средствам WMI. Рассмотрим подробнее эту процедуру.
Для подключения к пространству имен WMI необходимо:
1. Инициализировать интерфейс IWbemLocator с помощью вызова функции CoCreateInstance. Следующий пример (листинг 10) показывает инициализацию интерфейса IWbemLocator.
Листинг 10. Пример инициализации интерфейса IWbemLocator:
IWbemLocator *pLoc = 0;
HRESULT hr;
hr = CoCreateInstance(CLSID_WbemLocator, 0,
CLSCTX_INPROC_SERVER, IID_IWbemLocator,
(LPVOID *) &pLoc);
if (FAILED(hr))
{
cout << "Failed to create IWbemLocator object."
<< "Err code = 0x"
<< hex << hr << endl;
CoUninitialize();
return hr; // Program has failed.
}
2. Подключиться к WMI с помощью вызова метода IWbemLocator::ConnectServer. Следующий пример (листинг 11) показывает, как необходимо осуществить вызов ConnectServer:
Листинг 11. Пример вызова функции ConnectServer:
IWbemServices *pSvc = 0;
// Connect to the root\default namespace with
// the current user.
hr = pLoc->ConnectServer(
BSTR(L"ROOT\\DEFAULT"),
NULL, NULL, 0, NULL, 0, 0, &pSvc);
if (FAILED(hr))
{
cout << "Could not connect. Error code = 0x"
<< hex << hr << endl;
pLoc->Release();
CoUninitialize();
return hr; // Program has failed.
}
cout << "Connected to WMI" << endl;
После получения указателя на интерфейсный заместитель IWbemServices, необходимо сконфигурировать защиту интерфейсного заместителя для доступа к WMI.
4.2.4 Установка уровней безопасности для wmi подключения
Для того чтобы использовать созданное соединение с WMI, необходимо установить уровень олицетворения (Impersonation Level) и уровень проверки подлинности (Authentication Level) для приложения. Настройка уровней безопасности необходима потому, что интерфейсный заместитель IWbemServices обеспечивает доступ к объекту вне процесса (out-of process object). Обычно защита COM не позволяет получать доступ к процессу из другого процесса без настроек соответствующих свойств безопасности. Установка уровней безопасности для WMI соединения осуществляется с помощью функции CoSetProxyBlanket. Следующий пример (листинг 12) показывает стандартный способ вызова CoSetProxyBlanket.
Листинг 12. Пример вызова функции CoSetProxyBlanket:
HRESULT hres;
IWbemServices *pSvc = 0;
IWbemLocator *pLoc = 0;
// Set the proxy so that impersonation of the
// client occurs.
hres = CoSetProxyBlanket(pSvc,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE
);
if (FAILED(hres))
{
cout << "Could not set proxy blanket."
<< "Error code = 0x"
<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return hres; // Program has failed.
}
После того, как установлены уровни безопасности для WMI соединения, можно обращаться к различным средствам WMI.