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:
IWbemServices (oggetto scripting SWbemServices )
IWbemRefresher (oggetto scripting SWbemRefresher )
L'aggiornamento WMI è un caso speciale perché viene passato un puntatore IWbemServices , le cui impostazioni di sicurezza devono essere impostate correttamente. Per altre informazioni sull'uso di oggetti di aggiornamento, vedere Accesso ai dati sulle prestazioni in C++.
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.