Создание подключения к пространству имен 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.

 

Установка уровней безопасности для 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.

 

Реализация функциональности приложения

 

Здесь осуществляется доступ к WMI объектам и работа с ними, например, при помощи WQL запросов. После того, как завершено использование WMI, необходимо завершить приложение.

 

Очистка и корректное завершение WMI приложения

 

После завершения работы с WMI объектами, необходимо удалить все COM указатели и корректно завершить приложение.

Для очистки и корректного завершения WMI приложения необходимо обеспечить:

1. Закрытие всех открытых COM интерфейсов. Обязательно необходимо закрывать интерфейсы IWbemServices и IWbemLocator.

2. Вызов функции CoUninitialize. Как и в любом COM приложении, необходимо в конце программы вызвать функцию CoUninitialize.

3. Выйти из приложения.

Следующий пример (листинг 13) показывает, как корректно выйти из приложения - клиента WMI.

 

Листинг 13. Пример корректного выхода из приложения - клиента WMI:

// pSvc was declared as IWbemServices *pSvc;

// pLoc was declared as IWbemLocator *pLoc;

 

pSvc->Release();

pLoc->Release();    

CoUninitialize();

return 0; // Program successfully completed.


Дата добавления: 2018-05-12; просмотров: 231; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!