Condividi tramite


Impostazione del livello di sicurezza del processo predefinito con C++

Quando un'applicazione client accede a Strumentazione gestione Windows (WMI) per la prima volta, deve impostare il livello di sicurezza del processo predefinito con una chiamata a CoInitializeSecurity. COM utilizza le informazioni della chiamata per determinare il livello di sicurezza richiesto affinché un altro processo possa accedere al processo dell'applicazione client.

Le sezioni seguenti sono descritte in questo argomento:

Per la maggior parte delle applicazioni client, gli argomenti illustrati nell'esempio seguente impostano la sicurezza predefinita per 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;
}

Il codice richiede che i riferimenti e le istruzioni #include seguenti vengano compilati correttamente.

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

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

L'impostazione del livello di autenticazione su RPC_C_AUTHN_LEVEL_DEFAULT consente a DCOM di negoziare il livello di autenticazione in modo che corrisponda alle richieste di sicurezza del computer di destinazione. Per ulteriori informazioni, vedere Modifica delle credenziali di autenticazione predefinite tramite C++ e Modifica delle impostazioni di rappresentazione predefinite tramite C++.

Modifica delle credenziali di autenticazione predefinite con C++

Le credenziali di autenticazione predefinite funzionano per la maggior parte delle situazioni, ma potrebbe essere necessario usare credenziali di autenticazione diverse in situazioni diverse. Ad esempio, è possibile aggiungere la crittografia alle procedure di autenticazione.

La tabella seguente elenca e descrive i diversi livelli di autenticazione.

Livello di autenticazione Descrizione
RPC_C_AUTHN_LEVEL_DEFAULT Autenticazione di sicurezza predefinita.
RPC_C_AUTHN_LEVEL_NONE Nessuna autenticazione.
RPC_C_AUTHN_LEVEL_CONNECT Autenticazione solo quando il client crea una relazione con il server.
RPC_C_AUTHN_LEVEL_CALL Autenticazione ogni volta che il server riceve un RPC.
RPC_C_AUTHN_LEVEL_PKT Autenticazione ogni volta che il server riceve i dati da un client.
RPC_C_AUTHN_LEVEL_PKT_INTEGRITY Autenticazione che verifica che nessun dato del pacchetto sia stato modificato.
RPC_C_AUTHN_LEVEL_PKT_PRIVACY Include tutti i livelli di autenticazione precedenti e crittografa il valore di ogni chiamata RPC.

 

È possibile specificare le credenziali di autenticazione predefinite per più utenti usando una struttura di SOLE_AUTHENTICATION_LIST nel parametro pAuthList di CoInitializeSecurity.

Nell'esempio di codice seguente viene illustrato come modificare le credenziali di autenticazione.

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

Modifica dei livelli di rappresentazione predefiniti con C++

COM fornisce i livelli di sicurezza predefiniti letti dal Registro di sistema. Tuttavia, a meno che non siano state modificate in modo specifico, le impostazioni del Registro di sistema configurano il livello di impersonificazione troppo basso perché WMI possa funzionare correttamente. In genere, il livello di rappresentazione predefinito è RPC_C_IMP_LEVEL_IDENTIFY, ma WMI richiede almeno RPC_C_IMP_LEVEL_IMPERSONATE per funzionare con la maggior parte dei provider e potrebbe verificarsi una situazione in cui è necessario impostare un livello di rappresentazione superiore. Per ulteriori informazioni, vedere Collegarsi a WMI su un computer remoto. La seguente tabella elenca i diversi livelli di impersonificazione.

Livello Descrizione
RPC_C_IMP_LEVEL_DEFAULT Il sistema operativo sceglie il livello di impersonazione.
RPC_C_IMP_LEVEL_ANONYMOUS Il server può rappresentare il client, ma il token di rappresentazione non può essere usato per nulla.
RPC_C_IMP_LEVEL_IDENTIFY Il server può ottenere l'identità del client e rappresentare il client per il controllo ACL.
RPC_C_IMP_LEVEL_IMPERSONATE Il server può impersonare il client attraverso il confine di un computer.
RPC_C_IMP_LEVEL_DELEGATE Il server può rappresentare il client attraverso più limiti e può effettuare chiamate per conto del client.