Inscription d’un fournisseur

Avant d’implémenter votre fournisseur, vous devez d’abord inscrire votre fournisseur auprès de WMI. L’inscription du fournisseur définit le type du fournisseur et les classes prises en charge par le fournisseur. WMI peut uniquement accéder à des fournisseurs inscrits.

Notes

Pour plus d’informations sur l’inscription d’un fournisseur MI, consultez Guide pratique pour inscrire un fournisseur MI.

 

Vous pouvez écrire votre code de fournisseur avant d’inscrire le fournisseur. Toutefois, il est très difficile de déboguer un fournisseur qui n’est pas inscrit auprès de WMI. La détermination des interfaces pour votre fournisseur permet également de décrire l’objectif et la structure d’un fournisseur. Par conséquent, l’inscription de votre fournisseur vous aide à concevoir votre fournisseur.

Seuls les administrateurs peuvent inscrire ou supprimer un fournisseur.

Un fournisseur doit être inscrit pour tous les différents types de fonctions de fournisseur qu’il effectue. Presque tous les fournisseurs fournissent des instances de classes qu’ils définissent, mais ils peuvent également fournir des données de propriété, des méthodes, des événements ou des classes. Le fournisseur peut également être inscrit en tant que fournisseur de consommateur d’événements ou fournisseur de compteur de performances. Il est recommandé de combiner toutes les fonctionnalités du fournisseur dans un seul fournisseur plutôt que d’avoir de nombreux fournisseurs distincts pour chaque type. Par exemple, le fournisseur Registre système, qui fournit des méthodes et des instances, et le fournisseur de quota de disque, qui fournit des instances, des méthodes et des événements.

Un fournisseur doit être inscrit pour tous les différents types de fonctions de fournisseur qu’il effectue. Presque tous les fournisseurs fournissent des instances de classes qu’ils définissent, mais ils peuvent également fournir des données de propriété, des méthodes, des événements ou des classes. Le fournisseur peut également être inscrit en tant que fournisseur de consommateur d’événements ou fournisseur de compteur de performances.

La même instance de __Win32Provider est utilisée pour chaque type d’inscription :

Exemple : Création et inscription d’une instance d’un fournisseur

L’exemple suivant montre un fichier MOF qui crée et inscrit une instance du fournisseur Registre système dans l’espace de noms root\cimv2. Il affecte l’alias $Reg au fournisseur pour éviter le long chemin d’accès requis dans les inscriptions d’instance et de méthode. Pour plus d’informations, consultez Création d’un alias.

// Place the Registry provider in the root\cimv2 namespace
#pragma namespace("\\\\.\\ROOT\\cimv2")

// Create an instance of __Win32Provider
instance of __Win32Provider as $Reg
{
Name = "RegProv";        
CLSID = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
HostingModel = "NetworkServiceHost:LocalServiceHost";
};

// Register as an instance provider by
// creating an instance
// of __InstanceProviderRegistration
instance of __InstanceProviderRegistration
{
 provider = $Reg;
 SupportsDelete = FALSE;
 SupportsEnumeration = TRUE;
 SupportsGet = TRUE;
 SupportsPut = TRUE;
};

// Register as a method provider by
// creating an instance
// of __MethodProviderRegistration
instance of __MethodProviderRegistration
{
 provider = $Reg;
};

// Define the StdRegProv class
[dynamic: ToInstance, provider("RegProv")]
class StdRegProv
{
[implemented, static] uint32 CreateKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName);
[implemented, static] uint32 DeleteKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName);
[implemented, static] uint32 EnumKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [OUT] string sNames[]);
[implemented, static] uint32 EnumValues(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [OUT] string sNames[], 
 [OUT] sint32 Types[]);
[implemented, static] uint32 DeleteValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName);
 [implemented, static] uint32 SetDWORDValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] uint32 uValue = 3);
[implemented, static] uint32 GetDWORDValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] uint32 uValue);
[implemented, static] uint32 SetStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue = "hello");
[implemented, static] uint32 GetStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [in] string sValueName, 
 [OUT] string sValue);
[implemented, static] uint32 SetMultiStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue[] = {"hello", "there"});
[implemented, static] uint32 GetMultiStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] string sValue[]);
[implemented, static] uint32 SetExpandedStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue = "%path%");
[implemented, static] uint32 GetExpandedStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] string sValue);
[implemented, static] uint32 SetBinaryValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [in] string sValueName, 
 [in] uint8 uValue[] = {1, 2});
[implemented, static] uint32 GetBinaryValue(
 {IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] uint8 uValue[]);
[implemented, static] uint32 CheckAccess(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] uint32 uRequired = 3, 
 [OUT] boolean bGranted);
};

Exemple : Inscription d’un fournisseur

La procédure suivante décrit comment inscrire un fournisseur.

Pour inscrire un fournisseur

  1. Inscrivez le fournisseur en tant que serveur COM.

    Si nécessaire, vous devrez peut-être créer des entrées de registre. Ce processus s’applique à tous les serveurs COM et n’est pas lié à WMI. Pour plus d’informations, consultez la section COM dans la documentation du kit SDK Microsoft Windows.

  2. Créez un fichier MOF qui contient des instances de __Win32Provider et une instance d’une classe dérivée directement ou indirectement de __ProviderRegistration, comme __InstanceProviderRegistration. Seuls les administrateurs peuvent inscrire ou supprimer un fournisseur en créant des instances de classes dérivées de __Win32Provider ou de __ProviderRegistration.

  3. Définissez HostingModel dans l’instance de __Win32Provider en fonction des valeurs figurant dans Modèles d’hébergement.

    Notes

    À moins que le fournisseur n’ait besoin des privilèges élevés du compte LocalSystem, la propriété __Win32Provider.HostingModel doit être définie sur « NetworkServiceHost ». Pour plus d’informations, consultez Hébergement et sécurité du fournisseur.

     

    L’exemple MOF suivant de l’exemple complet montre le code qui crée une instance de __Win32Provider.

    instance of __Win32Provider as $Reg
    {
    Name = "RegProv";        
    CLSID = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
    HostingModel = "NetworkServiceHost:LocalServiceHost";
    };
    
  4. Une instance d’une classe dérivée directement ou indirectement de __ProviderRegistration, pour décrire l’implémentation logique du fournisseur. Un fournisseur peut être inscrit pour plusieurs types de fonctionnalités différents. L’exemple ci-dessus inscrit RegProv en tant que fournisseur d’instances et de méthodes. Toutefois, si RegProv prend en charge les fonctionnalités, il peut également être inscrit en tant que fournisseur de propriétés ou d’événements. Le tableau suivant répertorie les classes qui inscrivent les fonctionnalités de fournisseur.

    Classes d’inscription de fournisseur Description
    __InstanceProviderRegistration Inscrit un fournisseur d’instances.
    __EventProviderRegistration Inscrit un fournisseur d’événements.
    __EventConsumerProviderRegistration inscrit un fournisseur de consommateurs d’événements.
    __MethodProviderRegistration Inscrit un fournisseur de méthodes.
    __PropertyProviderRegistration Inscrit un fournisseur de propriétés.

     

  5. Placez le fichier MOF dans un répertoire permanent.

    En règle générale, vous devez placer le fichier dans le répertoire d’installation du fournisseur.

  6. Compilez le fichier MOF à l’aide de mofcomp ou de l’interface IMofCompiler.

    Pour plus d’informations, consultez Compilation de fichiers MOF.

    Windows 8 et Windows Server 2012 : lors de l’installation des fournisseurs, mofcomp et l’interface IMofCompiler traitent les qualificateurs [Key] et [Static] comme true s’ils sont présents, quelles que soient leurs valeurs réelles. Les autres qualificateurs sont traités comme false s’ils sont présents, mais ne sont pas explicitement définis sur true.

Développement d’un fournisseur WMI

Définition des descripteurs de sécurité d’espace de noms

Sécurisation de votre fournisseur