Создание подключения к пространству имен 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!