Compartir a través de


Creación de una clase base WMI

La forma recomendada de crear una nueva clase base WMI para un proveedor WMI es en un archivo MOF (Managed Object Format). También puede crear una clase base utilizando la función COM API para WMI. Aunque se puede crear una clase base o derivada en script, sin un proveedor que suministre datos a la clase y sus subclases, la clase no es útil.

En este tema se describen las secciones siguientes:

Creación de una clase usando MOF

Las clases WMI suelen basarse en la herencia. Antes de crear una clase base, consulte las clases del Modelo común de información (CIM) disponibles en el Grupo de trabajo sobre gestión distribuida (DMTF).

Si muchas clases derivadas van a utilizar las mismas propiedades, ponga estas propiedades y métodos en su clase base. El número máximo de propiedades que se pueden definir en una clase WMI es 1024.

Al crear una clase base, tenga en cuenta la siguiente lista de directrices para los nombres de clase:

  • Utiliza tanto mayúsculas como minúsculas.

  • Empieza el nombre de una clase con una letra.

  • No utilice ni guion bajo inicial ni final.

  • Defina todos los caracteres restantes como letras, dígitos o guiones bajos.

  • Utilice una convención de nomenclatura coherente.

    Aunque no es necesario, una buena convención para nombrar una clase son dos componentes unidos por un guion bajo. Siempre que sea posible, la primera mitad del nombre debe ser un nombre de proveedor, y la segunda, un nombre de clase descriptivo.

Nota:

Las clases no pueden modificarse durante la ejecución de los proveedores. Debe detener la actividad, cambiar la clase y, a continuación, reiniciar el servicio de administración de Windows. Actualmente no es posible detectar un cambio de clase.

 

En MOF, cree una clase base nombrándola con el atributo clase teclado, pero sin indicar una clase padre.

Para crear una clase base utilizando código MOF

  1. Use el clase teclado con el nombre de la nueva clase, seguido de un par de llaves y un punto y coma. Añade propiedades y métodos para la clase entre las llaves. Se proporciona el siguiente código de ejemplo.

    El siguiente ejemplo de código muestra cómo una clase de base debería definirse.

    class MyClass_BaseDisk
    {
    };
    

    El siguiente ejemplo de código muestra una definición incorrecta de una clase de base.

    class MyClass_BaseDisk : CIM_LogicalDisk
    {
    };
    
  2. Añada cualquier clase calificadores antes de la palabra clave class para modificar la forma en que se utiliza la clase. Coloque los calificadores entre corchetes. Para más información sobre calificadores para modificar, consulte WMI calificadores. Use el Abstracto para indicar que no se puede crear una instancia de esta clase directamente. Las clases abstractas se utilizan a menudo para definir propiedades o métodos que serán utilizados por varias clases derivadas. Para obtener más información, consulte Creación de una clase derivada.

    El siguiente ejemplo de código define la clase como abstracta y define el proveedor que suministrará los datos. El ToSubClass calificador sabor indica la información en el Proveedor calificador es heredado por clases derivadas.

    [Abstract, Provider("MyProvider") : ToSubClass]
    class MyClass_BaseDisk
    {
    };
    
  3. Añada las propiedades y métodos de la clase entre corchetes antes del nombre de la propiedad o método. Para más información, consulte Añadir una propiedad y Crear un método. Puede modificar estas propiedades y métodos utilizando calificadores MOF. Para obtener más información, consulte Añadir un calificador.

    El siguiente ejemplo de código muestra cómo modificar propiedades y métodos con calificadores MOF.

    [read : ToSubClass, key : ToSubClass ] string DeviceID;
      [read : ToSubClass] uint32 State;
      [read : ToSubclass, write : ToSubClass] uint64 LimitUsers;
    
  4. Guarde el archivo MOF con la extensión .mof.

  5. Registre la clase con WMI ejecutando Mofcomp.exe en el archivo.

    mofcomp.exe newmof.mof

    No use el -N encienda el preprocesador comando #espacio de nombre pragma para especificar un espacio de nombres, las clases MOF compiladas se almacenarán en el espacio de nombres root\default del repositorio. Para más información, véase mofcomp.

El siguiente ejemplo de código combina los ejemplos de código MOF discutidos en el procedimiento anterior y muestra cómo crear una clase base en el espacio de nombres root\cimv2 utilizando 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 más información, consulte Crear una clase derivada para ver un ejemplo de una clase dinámica derivada de esta clase base.

Creación de una clase con C++

La creación de una clase base utilizando la API WMI es principalmente una serie de comandos Put que definen la clase y registrar la clase con WMI. El objetivo principal de esta API es permitir que las aplicaciones cliente creen clases base. Sin embargo, también puede hacer que un proveedor utilice esta API para crear una clase base. Por ejemplo, si cree que el código MOF de su proveedor no se instalará correctamente, puede indicar a su proveedor que cree automáticamente las clases correctas en el repositorio WMI. Para más información sobre proveedores, véase Escribiendo un proveedor una clase.

Nota:

Las clases no pueden modificarse durante la ejecución de los proveedores. Debe detener la actividad, cambiar la clase y, a continuación, reiniciar el servicio de administración de Windows. Actualmente no es posible detectar un cambio de clase.

 

El código requiere la siguiente referencia para compilar correctamente.

#include <wbemidl.h>

Puede crear una nueva clase base mediante programación utilizando la COM API para WMI.

Para crear nueva clase base con la API WMI

  1. Recupera una definición para la nueva clase llamando a la IWbemServices::GetObject método con el strObjectPath parámetro establecer nulo valor.

    El siguiente ejemplo de código muestra cómo recuperar una definición para una nueva clase.

    IWbemServices* pSvc = 0;
    IWbemContext* pCtx = 0;
    IWbemClassObject* pNewClass = 0;
    IWbemCallResult* pResult = 0;
    HRESULT hRes = pSvc->GetObject(0, 0, pCtx, &pNewClass, &pResult);
    
  2. Establezca un nombre para la clase estableciendo el parámetro __CLASS sistema propiedad con una llamada al IWbemClassObject::Put método.

    El siguiente ejemplo de código muestra cómo nombrar la clase estableciendo el parámetro __CLASS sistema de propiedad.

    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. Cree la propiedad o propiedades clave llamando a IWbemClassObject::Put.

    El siguiente ejemplo de código describe cómo crear el Índice propiedad, que se etiqueta como propiedad clave en el paso 4.

      BSTR KeyProp = SysAllocString(L"Index");
      pNewClass->Put(KeyProp, 0, NULL, CIM_STRING);
    
  4. Adjunte la clave a la propiedad key llamando primero a la propiedad IWbemClassObject::GetPropertyQualifierSet método y después el IWbemQualifierSet::Put método.

    El siguiente ejemplo de código muestra cómo adjuntar el clave a la propiedad clave.

      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. Cree otras propiedades de la clase con IWbemClassObject::Put.

    El siguiente ejemplo de código describe cómo crear propiedades adicionales.

      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 la nueva clase llamando IWbemServices::PutClass.

    Dado que no puede definir claves e índices después de registrar una nueva clase, asegúrese de haber definido todas sus propiedades antes de llamar a PutClass.

    El siguiente ejemplo de código describe cómo registrar una nueva clase.

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

El siguiente ejemplo de código combina los ejemplos de código discutidos en el procedimiento anterior y muestra cómo crear una clase usando el WMI API.

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();
}

Creación de una clase