Définition de la sécurité sur IWbemServices et autres proxys

Dans C++, vous pouvez définir la sécurité sur l’ensemble du processus en appelant CoInitializeSecurity avant de vous connecter à WMI via IWbemLocator::ConnectServer. Vous pouvez également modifier le niveau d’authentification, le niveau d’emprunt d’identité ou le service d’authentification dans un appel qui obtient un pointeur vers un proxy WMI, tel que IWbemServices ou IWbemCallResult. L’appel de CoSetProxyBlanket vous permet également de modifier le service d’authentification (Kerberos, NTLM ou négocier).

Les scripts et les applications Visual Basic définissent la sécurité sur les proxys uniquement indirectement par le biais d’appels à SWbemServices et à d’autres objets Automation. Pour plus d’informations sur la définition et la modification de l’authentification et de l’emprunt d’identité dans un script, consultez Définition du niveau de sécurité du processus par défaut à l’aide de VBScript.

La modification des niveaux de sécurité ou des services est principalement une préoccupation lors de la connexion à WMI sur un ordinateur distant qui exécute un autre système d’exploitation. Pour plus d’informations, consultez Connexion entre différents systèmes d’exploitation.

Une application cliente se connecte à un proxy WMI à l’aide d’une identité. Une identité est un objet de données qui se compose d’un nom d’utilisateur, d’un mot de passe et de paramètres d’autorité. Pour une application cliente WMI, l’appel à l’interface IWbemLocator::ConnectServer crée l’identité initiale. La méthode ConnectServer prend l’identité dans un ensemble de trois paramètres, que vous pouvez définir sur NULL pour indiquer l’utilisateur actuel. Vous pouvez également spécifier un paramètre non NULL pour indiquer un utilisateur et un domaine spécifiques. Si l’appel réussit, ConnectServer retourne un pointeur par le biais duquel vous pouvez accéder directement à divers processus distants, tels qu’un service WMI ou le système d’exploitation Windows.

Comme de nombreuses interfaces COM, ConnectServer retourne un pointeur vers un proxy. Un proxy est un objet de données qui représente un processus distant, tel que WMI ou un fournisseur distant. COM utilise un proxy pour permettre aux développeurs d’accéder aux données distantes comme si les données étaient locales.

Les interfaces WMI suivantes utilisent des proxys :

Une fois que vous avez reçu un pointeur vers un processus distant, vous pouvez effectuer l’une des deux opérations suivantes. Si vous savez ce que fait le processus, vous pouvez choisir de définir la sécurité sur le pointeur et d’accéder au processus normalement. C’est le cas de la plupart des pointeurs vers un service WMI. Pour plus d’informations, consultez Définition des niveaux de sécurité sur une connexion WMI. Vous devez également accéder à une autre interface COM sur le proxy, telle que IUnknown::Release, par le biais d’un appel à l’interface IUnknown sur le proxy.

Valeurs par défaut et recommandations

La version distribuée du modèle objet de composant (DCOM) négocie le service d’authentification par défaut (Kerberos, NTLM ou Negotiate) et vous ne pouvez pas spécifier le service d’authentification par défaut à l’aide de CoInitializeSecurity. La spécification de RPC_C_AUTHN_DEFAULT dans le paramètre de service d’authentification de CoSetProxyBlanket permet à DCOM de sélectionner le service approprié. Pour les connexions distantes, le service par défaut est Negotiate, qui est le service recommandé pour les applications qui fonctionnent à la fois dans des domaines Kerberos et non Kerberos. Pour les connexions locales, le service d’authentification par défaut est NT LAN Manager (NTLM).

L’exemple de code suivant montre le service d’authentification par défaut utilisé.

// 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’exemple de code de cette rubrique nécessite les instructions de référence et #include suivantes.

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

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

Pour les scripts, il est recommandé d’utiliser les valeurs par défaut que DCOM sélectionne pour les appels distants. Sur l’ordinateur local, vous ne pouvez pas spécifier de service d’authentification pour les appels à WMI. Pour plus d’informations, consultez Définition du service d’authentification à l’aide de VBScript et Construction d’une chaîne Moniker.