Registrazione di un provider

Prima di implementare il provider, è necessario prima registrare il provider con WMI. La registrazione del provider definisce il tipo del provider e le classi supportate dal provider. WMI può accedere solo ai provider registrati.

Nota

Per altre informazioni sulla registrazione di un provider MI, vedere Procedura: Registrare un provider MI.

 

È possibile scrivere il codice del provider prima di registrare il provider. Tuttavia, è molto difficile eseguire il debug di un provider che non è registrato con WMI. Determinare le interfacce per il provider consente anche di definire lo scopo e la struttura di un provider. Pertanto, la registrazione del provider consente di progettare il provider.

Solo gli amministratori possono registrare o eliminare un provider.

Un provider deve essere registrato per tutti i diversi tipi di funzioni del provider eseguite. Quasi tutti i provider forniscono istanze di classi definite, ma possono anche fornire dati di proprietà, metodi, eventi o classi. Il provider può anche essere registrato come provider consumer di eventi o un provider di contatori delle prestazioni. È consigliabile combinare tutte le funzionalità del provider in un provider anziché avere molti provider separati per ogni tipo. Un esempio è il provider del Registro di sistema, che fornisce metodi e istanze e il provider Quota disco, che fornisce istanze, metodi ed eventi.

Un provider deve essere registrato per tutti i diversi tipi di funzioni del provider eseguite. Quasi tutti i provider forniscono istanze di classi definite, ma possono anche fornire dati di proprietà, metodi, eventi o classi. Il provider può anche essere registrato come provider consumer di eventi o un provider di contatori delle prestazioni.

La stessa istanza di __Win32Provider viene usata per ogni tipo di registrazione:

Esempio: Creazione e registrazione di un'istanza di un provider

Nell'esempio seguente viene illustrato un file MOF che crea e registra un'istanza del provider del Registro di sistema nello spazio dei nomi root\cimv2. Assegna l'alias $Reg al provider per evitare il nome percorso lungo richiesto nelle registrazioni di istanza e metodo. Per altre informazioni, vedere Creazione di 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);
};

Esempio: Registrazione di un provider

La procedura seguente descrive come registrare un provider.

Per registrare un provider

  1. Registrare il provider come server COM.

    Se necessario, potrebbe essere necessario creare voci del Registro di sistema. Questo processo si applica a tutti i server COM e non è correlato a WMI. Per altre informazioni, vedere la sezione COM nella documentazione di Microsoft Windows Software Development Kit (SDK).

  2. Creare un file MOF che contiene istanze di __Win32Provider e un'istanza di una classe derivata direttamente o indirettamente da __ProviderRegistration, ad esempio __InstanceProviderRegistration. Solo gli amministratori possono registrare o eliminare un provider creando istanze di classi derivate da __Win32Provider o __ProviderRegistration.

  3. Impostare HostingModel nell'istanza di __Win32Provider in base ai valori nei modelli di hosting.

    Nota

    A meno che il provider non richieda privilegi elevati dell'account LocalSystem, la proprietà __Win32Provider.HostingModel deve essere impostata su "NetworkServiceHost". Per altre informazioni, vedere Hosting e sicurezza del provider.

     

    L'esempio MOF seguente dell'esempio completo mostra il codice che crea un'istanza di __Win32Provider.

    instance of __Win32Provider as $Reg
    {
    Name = "RegProv";        
    CLSID = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
    HostingModel = "NetworkServiceHost:LocalServiceHost";
    };
    
  4. Istanza di una classe derivata direttamente o indirettamente da __ProviderRegistration, per descrivere l'implementazione logica del provider. Un provider può essere registrato per diversi tipi di funzionalità. L'esempio precedente registra RegProv come provider di istanza e metodo. Tuttavia, se RegProv supporta la funzionalità, può essere registrata anche come proprietà o provider di eventi. Nella tabella seguente sono elencate le classi che registrano la funzionalità del provider.

    Classi di registrazione del provider Descrizione
    __InstanceProviderRegistration Registra un provider di istanze.
    __EventProviderRegistration Registra un provider di eventi.
    __EventConsumerProviderRegistration Registra un provider consumer di eventi.
    __MethodProviderRegistration Registra un provider di metodi.
    __PropertyProviderRegistration Registra un provider di proprietà.

     

  5. Inserire il file MOF in una directory permanente.

    In genere, è necessario inserire il file nella directory di installazione del provider.

  6. Compilare il file MOF usando mofcomp o l'interfaccia IMofCompiler .

    Per altre informazioni, vedere Compilazione di file MOF.

    Windows 8 e Windows Server 2012: quando si installano provider, sia mofcomp che l'interfaccia IMofCompiler considera i qualificatori [Key] e [Static] come true se sono presenti, indipendentemente dai valori effettivi. Altri qualificatori vengono considerati false se sono presenti ma non impostati in modo esplicito su true.

Sviluppo di un provider WMI

Impostazione dei descrittori di sicurezza Namepace

Protezione del provider