Compartilhar via


Criar 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 são abordadas neste tópico:

Criar uma classe base usando MOF

As classes WMI geralmente dependem da herança. Antes de criar uma classe base, verifique as classes do modelo CIM 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.

  • Inicie um nome de classe com uma letra.

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

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

  • Use uma convenção de nomenclatura consistente.

    Embora não seja necessário, uma boa convenção de nomenclatura para uma classe consiste em 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. Interrompa a atividade, altere a classe e reinicie 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, seguido por um par de chaves e um ponto e vírgula. Adicione propriedades e métodos para a classe entre as chaves. O exemplo 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. Classes Abstract geralmente são usadas para definir propriedades ou métodos que serão usados por várias classes derivadas. Para obter mais informações, consulte Criar uma classe derivada.

    O exemplo de código a seguir define a classe como abstract e define o provedor que fornecerá os dados. O qualificador ToSubClassflavor indica que as informações no Provider são herdadas pelas classes derivadas.

    [Abstract, Provider("MyProvider") : ToSubClass]
    class MyClass_BaseDisk
    {
    };
    
  3. Coloque 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 Adicionar uma propriedade e Criar um método. Você pode modificar essas propriedades e métodos usando qualificadores MOF. Para obter mais informações, consulte Adicionar 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 de .mof.

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

    mofcomp.exenewmof.mof

    Se você não usar a opção -N ou o comando do pré-processador #pragma namespace para especificar um namespace, as classes MOF compiladas serão armazenadas no namespace root\default no repositório. Para obter mais informações, confira 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 Criar uma classe derivada para obter um exemplo de uma classe dinâmica derivada dessa classe base.

Criar uma classe base usando C++

Criar 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. A finalidade principal dessa API é permitir que os 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 seu provedor não será instalado da forma adequada, instrua seu provedor a criar automaticamente as classes corretas no repositório WMI. Para obter mais informações sobre provedores, consulte Gravar um provedor de classe.

Observação

As classes não podem ser alteradas durante a execução de provedores. Interrompa a atividade, altere a classe e reinicie o serviço de Gerenciamento do Windows. No momento, não é possível detectar uma alteração de classe.

 

O código requer que a referência a seguir seja compilada 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 null.

    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. Para estabelecer um nome para a classe, defina a propriedade do sistema __CLASS com uma chamada para o método IWbemClassObject::Put.

    O exemplo de código a seguir mostra como nomear a classe definindo a propriedade do 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(s) propriedade(s) da 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 de chave chamando primeiro o método IWbemClassObject::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 de chave.

      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::Put.

    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, verifique se definiu 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();
}

Criar uma classe