Настройка безопасности для IWbemServices и других прокси-серверов
В C++ вы можете задать безопасность для всего процесса, вызвав CoInitializeSecurity перед подключением к WMI через IWbemLocator::ConnectServer. Вы также можете изменить уровень проверки подлинности, уровень олицетворения или службу проверки подлинности в вызове, который получает указатель на прокси-сервер WMI, например IWbemServices или IWbemCallResult. Вызов CoSetProxyBlanket также позволяет изменить службу проверки подлинности (Kerberos, NTLM или negotiate).
Скрипты и приложения Visual Basic устанавливают безопасность только для прокси-серверов косвенно с помощью вызовов SWbemServices и других объектов автоматизации. Дополнительные сведения о настройке и изменении проверки подлинности и олицетворения в скрипте см. в статье Настройка уровня безопасности процесса по умолчанию с помощью VBScript.
Изменение уровней безопасности или служб в первую очередь связано с подключением к WMI на удаленном компьютере под управлением другой операционной системы. Дополнительные сведения см. в разделе Подключение между разными операционными системами.
Клиентское приложение подключается к прокси-серверу WMI с помощью удостоверения. Удостоверение — это объект данных, состоящий из имени пользователя, пароля и параметров центра. Для клиентского приложения WMI вызов интерфейса IWbemLocator::ConnectServer создает начальное удостоверение. Метод ConnectServer принимает удостоверение в наборе из трех параметров, для которых можно задать значение NULL , чтобы указать текущего пользователя. Можно также указать параметр, отличный от NULL , чтобы указать конкретного пользователя и домен. Если вызов выполнен успешно, ConnectServer возвращает указатель, с помощью которого можно получить доступ к различным удаленным процессам, таким как служба WMI или операционная система Windows напрямую.
Как и многие другие COM-интерфейсы, ConnectServer возвращает указатель на прокси-сервер. Прокси-сервер — это объект данных, представляющий удаленный процесс, например WMI или удаленный поставщик. COM использует прокси-сервер, чтобы предоставить разработчикам доступ к удаленным данным, как если бы данные были локальными.
Следующие интерфейсы WMI используют прокси-серверы:
IWbemServices (объект скрипта SWbemServices )
IWbemRefresher (объект скрипта SWbemRefresher )
WMI Refresher — это особый случай, так как ему передается указатель IWbemServices , параметры безопасности которого должны быть правильно заданы. Дополнительные сведения об использовании объектов средства обновления см. в статье Доступ к данным о производительности в C++.
Получив указатель на удаленный процесс, можно выполнить одно из двух действий. Если вы знаете, что делает процесс, вы можете задать безопасность для указателя и получить доступ к процессу в обычном режиме. Это относится к большинству указателей на службу WMI. Дополнительные сведения см. в разделе Настройка уровней безопасности для подключения WMI. Кроме того, необходимо получить доступ к другому COM-интерфейсу на прокси-сервере, например IUnknown::Release, через вызов интерфейса IUnknown на прокси-сервере.
Значения по умолчанию и рекомендации
Распределенная версия компонентной объектной модели (DCOM) согласовывает службу проверки подлинности по умолчанию (Kerberos, NTLM или Negotiate), и вы не можете указать службу проверки подлинности по умолчанию с помощью CoInitializeSecurity. Указание RPC_C_AUTHN_DEFAULT в параметре службы проверки подлинности CoSetProxyBlanket позволяет DCOM выбрать соответствующую службу. Для удаленных подключений по умолчанию используется служба Negotiate. Это рекомендуемая служба для приложений, функционируют как в доменах Kerberos, так и в доменах, отличных от Kerberos. Для локальных подключений по умолчанию используется служба проверки подлинности NT LAN Manager (NTLM).
В следующем примере кода показана используемая по умолчанию служба проверки подлинности.
// The pWbemServices variable is of type IWbemServices*
HRESULT hr = CoSetProxyBlanket(
pWbemServices, //Proxy
RPC_C_AUTHN_DEFAULT, //Authentication service
RPC_C_AUTHZ_DEFAULT, //Authorization service
COLE_DEFAULT_PRINCIPAL, //Server principal name used
// by authentication service
RPC_C_AUTHN_LEVEL_DEFAULT, //Authentication level
RPC_C_IMP_LEVEL_IMPERSONATE, //Impersonation level
COLE_DEFAULT_AUTHINFO, //Client identity
EOAC_DEFAULT //Capability flags
);
В примере кода в этом разделе требуются следующие инструкции ссылки и #include.
#define _WIN32_DCOM
#include <wbemidl.h>
#include <comdef.h>
#pragma comment(lib, "wbemuuid.lib")
Для создания сценариев рекомендуется использовать значения по умолчанию, которые DCOM выбирает для удаленных вызовов. На локальном компьютере нельзя указать службу проверки подлинности для вызовов WMI. Дополнительные сведения см. в разделах Настройка службы проверки подлинности с помощью VBScript и Создание строки моникера.