Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая работа СПО.doc
Скачиваний:
9
Добавлен:
21.12.2018
Размер:
333.31 Кб
Скачать

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.