Compartilhar via


Criando uma classe base WMI

A maneira recomendada de criar uma nova classe base WMI para um provedor WMI é em um arquivo MOF (Managed Object Format). Você também pode criar uma classe base usando a API COM para WMI. Embora você possa criar uma classe base ou derivada no script, sem que um provedor forneça dados para a classe e suas subclasses, a classe não é útil.

As seguintes seções serão abordadas neste tópico:

Criando uma classe base usando MOF

As classes WMI geralmente dependem de herança. Antes de criar uma classe base, verifique as classes CIM (Common Information Model) disponíveis na DMTF (Distributed Management Task Force).

Se muitas classes derivadas usarem as mesmas propriedades, coloque essas propriedades e métodos em sua classe base. O número máximo de propriedades que você pode definir em uma classe WMI é 1024.

Ao criar uma classe base, observe a seguinte lista de diretrizes para nomes de classe:

  • Use letras maiúsculas e minúsculas.

  • Comece o nome de uma classe com uma letra.

  • Não use um sublinhado à esquerda ou à direita.

  • Defina todos os caracteres restantes como letras, dígitos ou sublinhados.

  • Usar uma convenção de nomenclatura consistente.

    Embora não seja necessário, uma boa convenção de nomenclatura para uma classe é dois componentes unidos por um sublinhado. Quando possível, um nome de fornecedor deve compor a primeira metade do nome e um nome de classe descritivo deve ser a segunda parte.

Observação

As classes não podem ser alteradas durante a execução de provedores. Você deve interromper a atividade, alterar a classe e reiniciar o serviço de Gerenciamento do Windows. No momento, não é possível detectar uma alteração de classe.

 

No MOF, crie uma classe base nomeando-a com a palavra-chave class, mas não indicando uma classe pai.

Para criar uma classe base usando o código MOF

  1. Use a palavra-chave class com o nome da nova classe, seguida por um par de chaves e um ponto-e-vírgula. Adicione propriedades e métodos para a classe entre as chaves. O exemplo de código a seguir é fornecido.

    O exemplo de código a seguir mostra como uma classe base deve ser definida.

    class MyClass_BaseDisk
    {
    };
    

    O exemplo de código a seguir mostra uma definição incorreta de uma classe base.

    class MyClass_BaseDisk : CIM_LogicalDisk
    {
    };
    
  2. Adicione quaisquer qualificadores de classe antes da palavra-chave class para modificar a maneira como a classe é usada. Coloque os qualificadores entre colchetes. Para obter mais informações sobre qualificadores para modificar classes, consulte Qualificadores WMI. Use o qualificador Abstract para indicar que você não pode criar uma instância dessa classe diretamente. As classes abstratas são frequentemente usadas para definir propriedades ou métodos que serão usados por várias classes derivadas. Para obter mais informações, consulte Criando uma classe derivada.

    O exemplo de código a seguir define a classe como abstrata e define o provedor que fornecerá os dados. A variação do qualificador ToSubClass indica que as informações no qualificador Provider são herdadas por classes derivadas.

    [Abstract, Provider("MyProvider") : ToSubClass]
    class MyClass_BaseDisk
    {
    };
    
  3. Adicione as propriedades e os métodos da classe entre colchetes antes do nome da propriedade ou do método. Para obter mais informações, consulte Adicionando uma propriedade e Criando um método. Você pode modificar essas propriedades e métodos usando qualificadores MOF. Para obter mais informações, confira Adicionando um qualificador.

    O exemplo de código a seguir mostra como modificar propriedades e métodos com qualificadores MOF.

    [read : ToSubClass, key : ToSubClass ] string DeviceID;
      [read : ToSubClass] uint32 State;
      [read : ToSubclass, write : ToSubClass] uint64 LimitUsers;
    
  4. Salve o arquivo MOF com uma extensão .mof.

  5. Registre a classe com o WMI executando Mofcomp.exe no arquivo.

    mofcomp.exe newmof.mof

    Se você não usar a opção -N ou o namespace do comando #pragma do pré-processador para especificar um namespace, as classes MOF compiladas serão armazenadas no namespace root\default no repositório. Para mais informações, consulte mofcomp.

O exemplo de código a seguir combina os exemplos de código MOF discutidos no procedimento anterior e mostra como criar uma classe base no namespace root\cimv2 usando o MOF.

#pragma namespace("\\\\.\\Root\\cimv2")

[Abstract, Provider("MyProvider") : ToSubClass]
class MyClass_BaseDisk
{
  [read : ToSubClass, key : ToSubClass ] string DeviceID;
  [read : ToSubClass] uint32 State;
  [read : ToSubClass, write : ToSubClass] uint64 LimitUsers;
};

Para obter mais informações, consulte Criando uma classe derivada para obter um exemplo de uma classe dinâmica derivada dessa classe base.

Criando uma classe base com C++

A criação de uma classe base usando a API WMI é principalmente uma série de comandos Put que definem a classe e registram a classe com o WMI. O principal objetivo dessa API é permitir que aplicativos cliente criem classes base. No entanto, você também pode fazer com que um provedor use essa API para criar uma classe base. Por exemplo, se você acredita que o código MOF do provedor não será instalado corretamente, você pode instruir seu provedor a criar automaticamente as classes corretas no repositório WMI. Para obter mais informações sobre provedores, consulte Escrevendo um provedor de classe.

Observação

As classes não podem ser alteradas durante a execução de provedores. Você deve interromper a atividade, alterar a classe e reiniciar o serviço de Gerenciamento do Windows. No momento, não é possível detectar uma alteração de classe.

 

O código requer a seguinte referência para ser compilado corretamente.

#include <wbemidl.h>

Você pode criar uma nova classe base programaticamente usando a API COM para WMI.

Para criar uma nova classe base com a API WMI

  1. Recupere uma definição para a nova classe chamando o método IWbemServices::GetObject com o parâmetro strObjectPath definido como um valor nulo.

    O exemplo de código a seguir mostra como recuperar uma definição para uma nova classe.

    IWbemServices* pSvc = 0;
    IWbemContext* pCtx = 0;
    IWbemClassObject* pNewClass = 0;
    IWbemCallResult* pResult = 0;
    HRESULT hRes = pSvc->GetObject(0, 0, pCtx, &pNewClass, &pResult);
    
  2. Estabeleça um nome para a classe definindo a propriedade __CLASS system com uma chamada para o método IWbemClassObject::Put .

    O exemplo de código a seguir mostra como nomear a classe definindo a propriedade de sistema __CLASS.

    VARIANT v;
    VariantInit(&v);
    V_VT(&v) = VT_BSTR;
    
    V_BSTR(&v) = SysAllocString(L"Example");
    BSTR Class = SysAllocString(L"__CLASS");
    pNewClass->Put(Class, 0, &v, 0);
    SysFreeString(Class);
    VariantClear(&v);
    
  3. Crie a propriedade ou propriedades de chave chamando IWbemClassObject::Put.

    O exemplo de código a seguir descreve como criar a propriedade Index que é rotulada como uma propriedade de chave na Etapa 4.

      BSTR KeyProp = SysAllocString(L"Index");
      pNewClass->Put(KeyProp, 0, NULL, CIM_STRING);
    
  4. Anexe o qualificador padrão Key à propriedade key chamando primeiro o métodoIWbemClassObject::GetPropertyQualifierSet e, em seguida, o método IWbemQualifierSet::Put.

    O exemplo de código a seguir mostra como anexar o qualificador padrão Key à propriedade key.

      IWbemQualifierSet *pQual = 0;
      pNewClass->GetPropertyQualifierSet(KeyProp, &pQual);
      SysFreeString(KeyProp);
    
      V_VT(&v) = VT_BOOL;
      V_BOOL(&v) = VARIANT_TRUE;
      BSTR Key = SysAllocString(L"Key");
    
      pQual->Put(Key, &v, 0);   // Flavors not required for Key 
      SysFreeString(Key);
    
      // No longer need the qualifier set for "Index"
      pQual->Release();   
      VariantClear(&v);
    
  5. Crie outras propriedades da classe com IWbemClassObject::P ut.

    O exemplo de código a seguir descreve como criar propriedades adicionais.

      V_VT(&v) = VT_BSTR;
      V_BSTR(&v) = SysAllocString(L"<default>");
      BSTR OtherProp = SysAllocString(L"OtherInfo");
      pNewClass->Put(OtherProp, 0, &v, CIM_STRING);
      SysFreeString(OtherProp);
      VariantClear(&v);
    
      OtherProp = SysAllocString(L"IntVal");
      pNewClass->Put(OtherProp, 0, NULL, CIM_SINT32); // NULL is default
      SysFreeString(OtherProp);
    
  6. Registre a nova classe chamando IWbemServices::PutClass.

    Como você não pode definir chaves e índices depois de registrar uma nova classe, certifique-se de ter definido todas as suas propriedades antes de chamar PutClass.

    O exemplo de código a seguir descreve como registrar uma nova classe.

      hRes = pSvc->PutClass(pNewClass, 0, pCtx, &pResult);
      pNewClass->Release();
    

O exemplo de código a seguir combina os exemplos de código discutidos no procedimento anterior e mostra como criar uma classe base usando a API WMI.

void CreateClass(IWbemServices *pSvc)
{
  IWbemClassObject *pNewClass = 0;
  IWbemContext *pCtx = 0;
  IWbemCallResult *pResult = 0;

  // Get a class definition. 
  // ============================
  HRESULT hRes = pSvc->GetObject(0, 0, pCtx, &pNewClass, &pResult);
  VARIANT v;
  VariantInit(&v);

  // Create the class name.
  // ============================
  V_VT(&v) = VT_BSTR;
  V_BSTR(&v) = SysAllocString(L"Example");
  BSTR Class = SysAllocString(L"__CLASS");
  pNewClass->Put(Class, 0, &v, 0);
  SysFreeString(Class);
  VariantClear(&v);

  // Create the key property. 
  // ============================
  BSTR KeyProp = SysAllocString(L"Index");
  pNewClass->Put(KeyProp, 0, NULL, CIM_STRING);

  // Attach Key qualifier to mark the "Index" property as the key.
  // ============================
  IWbemQualifierSet *pQual = 0;
  pNewClass->GetPropertyQualifierSet(KeyProp, &pQual);
  SysFreeString(KeyProp);

  V_VT(&v) = VT_BOOL;
  V_BOOL(&v) = VARIANT_TRUE;
  BSTR Key = SysAllocString(L"Key");

  pQual->Put(Key, &v, 0);   // Flavors not required for Key 
  SysFreeString(Key);

  // No longer need the qualifier set for "Index"
  pQual->Release();     
  VariantClear(&v);

  // Create other properties.
  // ============================
  V_VT(&v) = VT_BSTR;
  V_BSTR(&v) = SysAllocString(L"<default>");
  BSTR OtherProp = SysAllocString(L"OtherInfo");
  pNewClass->Put(OtherProp, 0, &v, CIM_STRING);
  SysFreeString(OtherProp);
  VariantClear(&v);

  OtherProp = SysAllocString(L"IntVal");
  pNewClass->Put(OtherProp, 0, NULL, CIM_SINT32); // NULL is default
  SysFreeString(OtherProp);
  
  // Register the class with WMI
  // ============================
  hRes = pSvc->PutClass(pNewClass, 0, pCtx, &pResult);
  pNewClass->Release();
}

Criando uma classe