Registrar um provedor

Antes de implementar seu provedor, primeiro você deve registrá-lo no WMI. Registrar o provedor define o tipo de provedor e as classes que o provedor oferece suporte. O WMI só pode acessar provedores registrados.

Observação

Para obter mais informações sobre como registrar um provedor de MI, consulte Como registrar um provedor de MI.

 

Você pode escrever o código do provedor antes de registrá-lo. No entanto, é muito difícil depurar um provedor que não está registrado no WMI. Determinar as interfaces para o seu provedor também ajuda a descrever a finalidade e a estrutura de um provedor. Portanto, registrar seu provedor ajuda você a projetar seu provedor.

Somente administradores podem registrar ou excluir um provedor.

Um provedor deve ser registrado para todos os diferentes tipos de funções de provedor que ele executa. Quase todos os provedores fornecem instâncias de classes que definem, mas também podem fornecer dados de propriedade, métodos, eventos ou classes. O provedor também pode ser registrado como um provedor de consumidor de eventos ou um provedor de contador de desempenho. É recomendável combinar todas as funcionalidades do provedor em um provedor, em vez de ter muitos provedores separados para cada tipo. Um exemplo é o provedor do Registro do Sistema, que fornece métodos e instâncias, e o provedor de Cota de Disco, que fornece instâncias, métodos e eventos.

Um provedor deve ser registrado para todos os diferentes tipos de funções de provedor que ele executa. Quase todos os provedores fornecem instâncias de classes que definem, mas também podem fornecer dados de propriedade, métodos, eventos ou classes. O provedor também pode ser registrado como um provedor de consumidor de eventos ou um provedor de contador de desempenho.

A mesma instância de __Win32Provider é usada para cada tipo de registro:

Exemplo: criar e registrar uma instância de um provedor

O exemplo a seguir mostra um arquivo MOF que cria e registra uma instância do provedor de Registro do Sistema no namespace root\cimv2. Ele atribui o alias $Reg ao provedor para evitar o nome de caminho longo necessário nos registros de instância e método. Para obter mais informações, consulte Criar um 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);
};

Exemplo: registrar um provedor

O procedimento a seguir descreve como registrar um provedor.

Para registrar um provedor

  1. Registre o provedor como servidor COM.

    Se necessário, talvez você precise criar entradas do registro. Esse processo se aplica a todos os servidores COM e não está relacionado ao WMI. Para obter mais informações, consulte a seção COM na documentação do SDK (Kit de Desenvolvimento de Software) do Microsoft Windows.

  2. Crie um arquivo MOF que contenha instâncias de __Win32Provider e uma instância de uma classe derivada direta ou indiretamente de __ProviderRegistration, como __InstanceProviderRegistration. Somente os administradores podem registrar ou excluir um provedor criando instâncias de classes derivadas de __Win32Provider ou __ProviderRegistration.

  3. Defina o HostingModel na instância de __Win32Provider de acordo com os valores em Modelos de hospedagem.

    Observação

    A menos que o provedor exija os altos privilégios da conta LocalSystem, a propriedade __Win32Provider.HostingModel deve ser definida como "NetworkServiceHost". Para obter mais informações, consulte Hospedagem e segurança do provedor.

     

    O seguinte exemplo de MOF do exemplo completo mostra o código que cria uma instância de __Win32Provider.

    instance of __Win32Provider as $Reg
    {
    Name = "RegProv";        
    CLSID = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
    HostingModel = "NetworkServiceHost:LocalServiceHost";
    };
    
  4. Uma instância de uma classe derivada direta ou indiretamente de __ProviderRegistration, para descrever a implementação lógica do provedor. Um provedor pode ser registrado para vários tipos diferentes de funcionalidade. O exemplo acima registra RegProv como uma instância e um provedor de método. Mas se o RegProv der suporte à funcionalidade, ele também poderá ser registrado como uma propriedade ou provedor de eventos. A tabela a seguir lista as classes que registram a funcionalidade do provedor.

    Classes de registro do provedor Descrição
    __InstanceProviderRegistration Registra um provedor de instância.
    __EventProviderRegistration Registra um provedor de evento.
    __EventConsumerProviderRegistration Registra um provedor de consumidor de eventos.
    __MethodProviderRegistration Registra um provedor de método.
    __PropertyProviderRegistration Registra um provedor de propriedade.

     

  5. Coloque o arquivo MOF em um diretório permanente.

    Normalmente, você deve colocar o arquivo no diretório de instalação do provedor.

  6. Compile o arquivo MOF usando mofcomp ou a interface IMofCompiler.

    Para obter mais informações, consulte Compilar arquivos MOF.

    Windows 8 e Windows Server 2012: ao instalar provedores, o mofcomp e a interface IMofCompiler tratam os qualificadores [Key] e [Static] como true se estiverem presentes, sem importar seus valores reais. Outros qualificadores são tratados como false se estiverem presentes, mas não definidos explicitamente como true.

Desenvolver um provedor do WMI

Definir descritores de segurança de namespace

Como proteger seu provedor