Définition du niveau de sécurité du processus par défaut à l’aide de C++

Lorsqu’une application cliente se connecte à Windows Management Instrumentation (WMI) pour la première fois, elle doit définir le niveau de sécurité du processus par défaut avec un appel à CoInitializeSecurity. COM utilise les informations de l’appel pour déterminer la sécurité d’un autre processus pour accéder au processus d’application cliente.

Les sections suivantes seront abordées dans cette rubrique :

Pour la plupart des applications clientes, les arguments présentés dans l’exemple suivant définissent la sécurité par défaut pour 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;
}

Le code nécessite la compilation correcte des références et des instructions #include suivantes.

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

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

La définition du niveau d’authentification sur RPC_C_AUTHN_LEVEL_DEFAULT permet à DCOM de négocier le niveau d’authentification en fonction des exigences de sécurité de l’ordinateur cible. Pour plus d’informations, consultez Modification des informations d’identification d’authentification par défaut à l’aide de C++ et Modification des paramètres d’emprunt d’identité par défaut à l’aide de C++.

Modification des informations d’identification d’authentification par défaut à l’aide de C++

Les informations d’identification d’authentification par défaut fonctionnent dans la plupart des situations, mais vous devrez peut-être utiliser différentes informations d’identification d’authentification dans différentes situations. Par exemple, vous souhaiterez peut-être ajouter un chiffrement aux procédures d’authentification.

Le tableau suivant répertorie et décrit les différents niveaux d’authentification.

Niveau d'authentification Description
RPC_C_AUTHN_LEVEL_DEFAULT Authentification de sécurité par défaut.
RPC_C_AUTHN_LEVEL_NONE Aucune authentification.
RPC_C_AUTHN_LEVEL_CONNECT Authentification uniquement lorsque le client crée une relation avec le serveur.
RPC_C_AUTHN_LEVEL_CALL Authentification chaque fois que le serveur reçoit un RPC.
RPC_C_AUTHN_LEVEL_PKT Authentification chaque fois que le serveur reçoit des données d’un client.
RPC_C_AUTHN_LEVEL_PKT_INTEGRITY Authentification indiquant qu’aucune donnée du paquet n’a été modifiée.
RPC_C_AUTHN_LEVEL_PKT_PRIVACY Inclut tous les niveaux d’authentification précédents et chiffre la valeur de chaque appel RPC.

 

Vous pouvez spécifier les informations d’identification d’authentification par défaut pour plusieurs utilisateurs à l’aide d’une structure de SOLE_AUTHENTICATION_LIST dans le paramètre pAuthList de CoInitializeSecurity.

L’exemple de code suivant montre comment modifier les informations d’identification d’authentification.

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

Modification des niveaux d’emprunt d’identité par défaut à l’aide de C++

COM fournit les niveaux de sécurité par défaut lus à partir du registre système. Toutefois, sauf modification spécifique, les paramètres du Registre définissent le niveau d’emprunt d’identité trop faible pour que WMI fonctionne. En règle générale, le niveau d’emprunt d’identité par défaut est RPC_C_IMP_LEVEL_IDENTIFY, mais WMI a besoin d’au moins RPC_C_IMP_LEVEL_IMPERSONATE pour fonctionner avec la plupart des fournisseurs, et vous pouvez rencontrer une situation où vous devez définir un niveau plus élevé d’emprunt d’identité. Pour plus d’informations, consultez Connexion à WMI sur un ordinateur distant. Le tableau suivant répertorie les différents niveaux d’emprunt d’identité.

Level Description
RPC_C_IMP_LEVEL_DEFAULT Le système d’exploitation choisit le niveau d’emprunt d’identité.
RPC_C_IMP_LEVEL_ANONYMOUS Le serveur peut emprunter l’identité du client, mais le jeton d’emprunt d’identité ne peut pas être utilisé pour quoi que ce soit.
RPC_C_IMP_LEVEL_IDENTIFY Le serveur peut obtenir l’identité du client et emprunter l’identité du client pour la vérification de la liste de contrôle d’accès.
RPC_C_IMP_LEVEL_IMPERSONATE Le serveur peut emprunter l’identité du client au-delà d’une limite d’ordinateur.
RPC_C_IMP_LEVEL_DELEGATE Le serveur peut emprunter l’identité du client au-delà de plusieurs limites et effectuer des appels pour le compte du client.