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:
- modifica delle credenziali di autenticazione predefinite con C++
- Modifica dei livelli di impersonificazione predefiniti tramite C++
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. |