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 :
- Modification des informations d’identification d’authentification par défaut à l’aide de C++
- Modification des niveaux d’emprunt d’identité par défaut à l’aide de C++
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. |