Číst v angličtině

Sdílet prostřednictvím


Nastavení výchozí úrovně zabezpečení procesu pomocí C++

Když se klientská aplikace poprvé přihlásí k rozhraní WMI (Windows Management Instrumentation), musí nastavit výchozí úroveň zabezpečení procesu voláním CoInitializeSecurity. Com používá informace ve volání k určení, kolik zabezpečení musí mít jiný proces pro přístup k procesu klientské aplikace.

V tomto tématu jsou popsány následující části:

U většiny klientských aplikací jsou argumenty uvedené v následujícím příkladu nastaveny na výchozí zabezpečení pro rozhraní 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;
}

Pro správnou kompilaci kód vyžaduje následující odkazy a příkazy #include.

#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <Wbemidl.h>

#pragma comment(lib, "wbemuuid.lib")

Nastavení úrovně ověřování na RPC_C_AUTHN_LEVEL_DEFAULT umožňuje modelu DCOM vyjednat úroveň ověřování tak, aby odpovídala požadavkům na zabezpečení cílového počítače. Další informace najdete v tématu Změna výchozích přihlašovacích údajů ověřování pomocí jazyka C++ a Změna výchozího nastavení zosobnění pomocí jazyka C++.

Změna výchozích přihlašovacích údajů pro ověřování pomocí C++

Výchozí přihlašovací údaje pro ověřování fungují ve většině situací, ale v různých situacích možná budete muset použít jiné přihlašovací údaje pro ověřování. Můžete například chtít přidat šifrování do ověřovacích postupů.

Následující tabulka uvádí a popisuje různé úrovně ověřování.

Úroveň ověřování Popis
RPC_C_AUTHN_LEVEL_DEFAULT Výchozí ověřování zabezpečení
RPC_C_AUTHN_LEVEL_NONE Žádné ověřování.
RPC_C_AUTHN_LEVEL_CONNECT Ověřování pouze v případech, kdy klient vytvoří relaci se serverem.
RPC_C_AUTHN_LEVEL_CALL Ověřování pokaždé, když server obdrží RPC.
RPC_C_AUTHN_LEVEL_PKT Ověřování pokaždé, když server obdrží data od klienta.
RPC_C_AUTHN_LEVEL_PKT_INTEGRITY (úroveň autenticity paketu: integrita) Ověření, že nebyla změněna žádná data z paketu.
RPC_C_AUTHN_LEVEL_PKT_PRIVACY Zahrnuje všechny předchozí úrovně ověřování a šifruje hodnotu každého volání RPC.

 

Výchozí přihlašovací údaje pro více uživatelů můžete zadat pomocí struktury SOLE_AUTHENTICATION_LIST v pAuthList parametru CoInitializeSecurity.

Následující příklad kódu ukazuje, jak změnit přihlašovací údaje pro ověřování.

// 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);

Změna výchozích úrovní zosobnění pomocí jazyka C++

Com poskytuje výchozí úrovně zabezpečení čtení ze systémového registru. Pokud ale není výslovně upraveno, nastavení registru nastaví úroveň zosobnění příliš nízkou, aby rozhraní WMI fungovalo. Výchozí úroveň zosobnění je obvykle RPC_C_IMP_LEVEL_IDENTIFY, ale rozhraní WMI potřebuje alespoň RPC_C_IMP_LEVEL_IMPERSONATE, aby fungovalo s většinou poskytovatelů, a můžete narazit na situaci, kdy potřebujete nastavit vyšší úroveň zosobnění. Další informace naleznete v tématu Připojení k rozhraní WMI na vzdáleném počítači. Následující tabulka uvádí různé úrovně zosobnění.

Úroveň Popis
RPC_C_IMP_LEVEL_DEFAULT Operační systém zvolí úroveň zosobnění.
RPC_C_IMP_LEVEL_ANONYMOUS Server může zosobnit klienta, ale token zosobnění se nedá použít pro nic.
RPC_C_IMP_LEVEL_IDENTIFY Server může získat identitu klienta a vydávat se za klienta pro ověření seznamu řízení přístupu (ACL).
RPC_C_IMP_LEVEL_IMPERSONATE Server může předstírat identitu klienta při překročení hranice jednoho počítače.
RPC_C_IMP_LEVEL_DELEGATE Server může zosobnit klienta přes více hranic a může volat jménem klienta.