Impostazione della sicurezza in IWbemServices e altri proxy

Mentre in C++ è possibile impostare la sicurezza per l'intero processo chiamando CoInitializeSecurity prima di connettersi a WMI tramite IWbemLocator::ConnectServer. È anche possibile modificare il livello di autenticazione, il livello di rappresentazione o il servizio di autenticazione in una chiamata che ottiene un puntatore a un proxy WMI, ad esempio IWbemServices o IWbemCallResult. La chiamata a CoSetProxyBlanket consente anche di modificare il servizio di autenticazione (Kerberos, NTLM o negotiate).

Gli script e le applicazioni Visual Basic impostano la sicurezza solo sui proxy indirettamente tramite chiamate a SWbemServices e ad altri oggetti di automazione. Per altre informazioni sull'impostazione e la modifica dell'autenticazione e della rappresentazione nello script, vedere Impostazione del livello di sicurezza del processo predefinito tramite VBScript.

La modifica dei livelli di sicurezza o dei servizi è principalmente un problema per la connessione a WMI in un computer remoto che esegue un sistema operativo diverso. Per altre informazioni, vedere Connessione tra sistemi operativi diversi.

Un'applicazione client si connette a un proxy WMI usando un'identità. Un'identità è un oggetto dati costituito da un nome utente, una password e impostazioni di autorità. Per un'applicazione client WMI, la chiamata all'interfaccia IWbemLocator::ConnectServer crea l'identità iniziale. Il metodo ConnectServer accetta l'identità in un set di tre parametri, che è possibile impostare su NULL per indicare l'utente corrente. È anche possibile specificare un parametro non NULL per indicare un utente e un dominio specifici. Se la chiamata ha esito positivo, ConnectServer restituisce un puntatore tramite il quale è possibile accedere a un'ampia gamma di processi remoti, ad esempio un servizio WMI o il sistema operativo Windows direttamente.

Come molte interfacce COM, ConnectServer restituisce un puntatore a un proxy. Un proxy è un oggetto dati che rappresenta un processo remoto, ad esempio WMI o un provider remoto. COM usa un proxy per consentire agli sviluppatori di accedere ai dati remoti come se i dati fossero locali.

Le interfacce WMI seguenti usano proxy:

Dopo aver ricevuto un puntatore a un processo remoto, è possibile eseguire una delle due operazioni. Se si conosce il funzionamento del processo, è possibile scegliere di impostare la sicurezza sul puntatore e accedere normalmente al processo. Questo è il caso della maggior parte dei puntatori a un servizio WMI. Per altre informazioni, vedere Impostazione dei livelli di sicurezza in una connessione WMI. In alternativa, è necessario accedere a un'interfaccia COM diversa nel proxy, ad esempio IUnknown::Release, tramite una chiamata all'interfaccia IUnknown nel proxy.

Impostazioni predefinite e raccomandazioni

La versione distribuita di Component Object Model (DCOM) negozia il servizio di autenticazione predefinito (Kerberos, NTLM o Negotiate) e non è possibile specificare il servizio di autenticazione predefinito usando CoInitializeSecurity. Specificare RPC_C_AUTHN_DEFAULT nel parametro del servizio di autenticazione di CoSetProxyBlanket consente a DCOM di selezionare il servizio appropriato. Per le connessioni remote il servizio predefinito è Negotiate, ovvero il servizio consigliato per le applicazioni che funzionano sia nei domini Kerberos che non Kerberos. Per le connessioni locali, il servizio di autenticazione predefinito è NT LAN Manager (NTLM).

L'esempio di codice seguente mostra il servizio di autenticazione predefinito in uso.

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

L'esempio di codice in questo argomento richiede il riferimento e le istruzioni #include seguenti.

#define _WIN32_DCOM
#include <wbemidl.h>
#include <comdef.h>

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

Per la creazione di script, è consigliabile usare le impostazioni predefinite selezionate da DCOM per le chiamate remote. Nel computer locale non è possibile specificare un servizio di autenticazione per le chiamate a WMI. Per altre informazioni, vedere Impostazione del servizio di autenticazione tramite VBScript e Costruzione di una stringa di moniker.