Установка уровня безопасности процесса по умолчанию с помощью C++

Когда клиентское приложение впервые входит в инструментарий управления Windows (WMI), оно должно задать уровень безопасности процесса по умолчанию с помощью вызова CoInitializeSecurity. COM использует сведения в вызове, чтобы определить, какой уровень безопасности должен иметь другой процесс для доступа к процессу клиентского приложения.

В этой статье рассматриваются следующие разделы:

Для большинства клиентских приложений аргументы, показанные в следующем примере, задают безопасность по умолчанию для 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 Сервер может олицетворять клиента через несколько границ и выполнять вызовы от имени клиента.