Установка уровня безопасности процесса по умолчанию с помощью C++
Когда клиентское приложение впервые входит в инструментарий управления Windows (WMI), оно должно задать уровень безопасности процесса по умолчанию с помощью вызова CoInitializeSecurity. COM использует сведения в вызове, чтобы определить, какой уровень безопасности должен иметь другой процесс для доступа к процессу клиентского приложения.
В этой статье рассматриваются следующие разделы:
- Изменение учетных данных проверки подлинности по умолчанию с помощью C++
- Изменение уровней олицетворения по умолчанию с помощью C++
Для большинства клиентских приложений аргументы, показанные в следующем примере, задают безопасность по умолчанию для WMI.
HRESULT hr = NULL;
hr = CoInitializeSecurity(
NULL, // security descriptor
-1, // use this simple setting
NULL, // use this simple setting
NULL, // reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // authentication level
RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation level
NULL, // use this simple setting
EOAC_NONE, // no special capabilities
NULL); // reserved
if (FAILED(hr))
{
CoUninitialize();
cout << "Failed to initialize security. Error code = 0x"
<< hex << hr << endl;
return;
}
Для правильной компиляции кода требуются следующие ссылки и инструкции #include.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
Установка уровня проверки подлинности RPC_C_AUTHN_LEVEL_DEFAULT позволяет DCOM согласовывать уровень проверки подлинности в соответствии с требованиями безопасности целевого компьютера. Дополнительные сведения см. в разделах Изменение учетных данных проверки подлинности по умолчанию с помощью C++ и Изменение параметров олицетворения по умолчанию с помощью C++.
Изменение учетных данных проверки подлинности по умолчанию с помощью C++
Учетные данные проверки подлинности по умолчанию работают в большинстве ситуаций, но в разных ситуациях может потребоваться использовать разные учетные данные проверки подлинности. Например, может потребоваться добавить шифрование в процедуры проверки подлинности.
В следующей таблице перечислены и описаны различные уровни проверки подлинности.
Уровень проверки подлинности | Описание |
---|---|
RPC_C_AUTHN_LEVEL_DEFAULT | Проверка подлинности безопасности по умолчанию. |
RPC_C_AUTHN_LEVEL_NONE | Без проверки подлинности. |
RPC_C_AUTHN_LEVEL_CONNECT | Проверка подлинности только в том случае, если клиент создает связь с сервером. |
RPC_C_AUTHN_LEVEL_CALL | Проверка подлинности каждый раз, когда сервер получает RPC. |
RPC_C_AUTHN_LEVEL_PKT | Проверка подлинности каждый раз, когда сервер получает данные от клиента. |
RPC_C_AUTHN_LEVEL_PKT_INTEGRITY | Проверка подлинности, что данные из пакета не были изменены. |
RPC_C_AUTHN_LEVEL_PKT_PRIVACY | Включает все предыдущие уровни проверки подлинности и шифрует значение каждого вызова RPC. |
Вы можете указать учетные данные проверки подлинности по умолчанию для нескольких пользователей, используя структуру SOLE_AUTHENTICATION_LIST в параметре pAuthListобъекта CoInitializeSecurity.
В следующем примере кода показано, как изменить учетные данные проверки подлинности.
// Auth Identity structure
SEC_WINNT_AUTH_IDENTITY_W authidentity;
SecureZeroMemory( &authidentity, sizeof(authidentity) );
authidentity.User = L"MyUser";
authidentity.UserLength = wcslen( authidentity.User );
authidentity.Domain = L"MyDomain ";
authidentity.DomainLength = wcslen( authidentity.Domain );
authidentity.Password = L"";
authidentity.PasswordLength = wcslen( authidentity.Password );
authidentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
SecureZeroMemory( authninfo, sizeof(SOLE_AUTHENTICATION_INFO)*2 );
// NTLM Settings
authninfo[0].dwAuthnSvc = RPC_C_AUTHN_WINNT;
authninfo[0].dwAuthzSvc = RPC_C_AUTHZ_NONE;
authninfo[0].pAuthInfo = &authidentity;
// Kerberos Settings
authninfo[1].dwAuthnSvc = RPC_C_AUTHN_GSS_KERBEROS ;
authninfo[1].dwAuthzSvc = RPC_C_AUTHZ_NONE;
authninfo[1].pAuthInfo = &authidentity;
SOLE_AUTHENTICATION_LIST authentlist;
authentlist.cAuthInfo = 2;
authentlist.aAuthInfo = authninfo;
CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
&authentlist,
EOAC_NONE,
NULL);
Изменение уровней олицетворения по умолчанию с помощью C++
COM предоставляет уровни безопасности по умолчанию, считываются из системного реестра. Однако, если они не были специально изменены, параметры реестра устанавливают слишком низкий уровень олицетворения для работы инструментария WMI. Как правило, уровень олицетворения по умолчанию RPC_C_IMP_LEVEL_IDENTIFY, но WMI требует по крайней мере RPC_C_IMP_LEVEL_IMPERSONATE для работы с большинством поставщиков, и вы можете столкнуться с ситуацией, когда необходимо задать более высокий уровень олицетворения. Дополнительные сведения см. в разделе Подключение к WMI на удаленном компьютере. В следующей таблице перечислены различные уровни олицетворения.
Level | Описание |
---|---|
RPC_C_IMP_LEVEL_DEFAULT | Операционная система выбирает уровень олицетворения. |
RPC_C_IMP_LEVEL_ANONYMOUS | Сервер может олицетворять клиента, но маркер олицетворения нельзя использовать для чего-либо. |
RPC_C_IMP_LEVEL_IDENTIFY | Сервер может получить удостоверение клиента и олицетворить клиента для проверки ACL. |
RPC_C_IMP_LEVEL_IMPERSONATE | Сервер может олицетворять клиент через границу одного компьютера. |
RPC_C_IMP_LEVEL_DELEGATE | Сервер может олицетворять клиента через несколько границ и выполнять вызовы от имени клиента. |