Actualización de parte de una instancia

En ocasiones, puede que solo quiera actualizar parte de una instancia. Por ejemplo, algunas instancias tienen un gran número de propiedades. Si tuviera que actualizar un gran número de estas instancias, podría reducir el rendimiento del sistema. Por lo tanto, puede optar por actualizar solo parte de la instancia y así reducir la cantidad de información que se debe enviar a WMI y recuperar de ahí. Sin embargo, WMI no admite directamente operaciones de instancia parcial ni la mayoría de los proveedores. Por lo tanto, si escribe una aplicación que usa operaciones de instancia parcial, prepárese para que las llamadas generen el código de error WBEM_E_PROVIDER_NOT_CAPABLE o WBEM_E_NOT_SUPPORTED en C++. En los lenguajes de scripting, los códigos de error son wbemErrProviderNotCapable o wbemErrNotSupported.

En el scripting, esta operación solo es necesaria para ayudar al rendimiento al actualizar una o dos propiedades que se pueden escribir en un gran número de objetos en una empresa. De lo contrario, las llamadas normales de VBScript a SWbemObject.Put_ o SWbemObject.PutAsync_, aunque parezcan escribir todo el objeto, realmente solo actualizan las propiedades para las que el proveedor tiene habilitada la escritura.

En el procedimiento siguiente se describe cómo solicitar una actualización de instancia parcial mediante PowerShell.

Solicitud de una actualización de instancia parcial mediante PowerShell

  1. Recupere la ruta de acceso del objeto que quiere actualizar.

    Puede describir la ruta de acceso manualmente, o bien consultar el objeto y, luego, recuperar la propiedad __Path.

    $myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path
    #or
    $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
    
  2. Configure una tabla hash que muestre los nombres de las propiedades que se van a actualizar y use esta tabla hash en una llamada a Set-WmiInstance.

    $newDriveName = @{VolumeName = "OSDisk"}
    Set-WmiInstance -Path $myWMIDrivePath -Arguments $newDriveName
    

En el procedimiento siguiente se describe cómo solicitar una actualización de instancia parcial mediante C#.

Nota

System.Management era el espacio de nombres de .NET original que se usaba para acceder a WMI; sin embargo, las API de este espacio de nombres suelen ser más lentas y no se escalan tan bien como sus homólogos más modernos Microsoft.Management.Infrastructure.

 

Solicitud de una actualización de instancia parcial mediante C#

  1. Cree un objeto ManagementObject que represente la instancia específica que se va a actualizar.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    
  2. Establezca el valor de la propiedad con una llamada a ManagementObject.SetPropertyValue.

    myDisk.SetPropertyValue("VolumeName", "OSDisk");
    

En el procedimiento siguiente se describe cómo solicitar una actualización de instancia parcial mediante VBScript.

Solicitud de una actualización de instancia parcial mediante VBScript

  1. Cree un objeto de contexto SWbemNamedValueSet.

    Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
    
  2. Agregue los valores de extensión Put "__PUT_EXTENSIONS" y "__PUT_EXT_CLIENT_REQUEST" al objeto de contexto mediante el método SWbemNamedValueSet.Add.

    objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True
    objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
    
  3. Configure una matriz que muestre los nombres de las propiedades que se van a actualizar y agregue esta matriz al objeto de contexto SWbemNamedValueSet con el valor de extensión Put "__PUT_EXT_PROPERTIES".

    arProperties = Array("propertyname1", "propertyname2") 
    objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
    
  4. Establezca el parámetro iFlags de la llamada SWbemObject.Put_ en wbemChangeFlagUpdateOnly. Sin esta marca, la llamada mostrará un error de contexto no válido.

  5. Pase la marca y el objeto de contexto al proveedor en el parámetro objwbemNamedValueSet de SWbemObject.Put_ o SWbemObject.PutAsync_.

    call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
    

En el procedimiento siguiente se describe cómo solicitar una actualización de instancia parcial mediante C++.

Solicitud de una actualización de instancia parcial mediante C++

  1. Cree un objeto IWbemContext con una llamada a CoCreateInstance.

    Un objeto de contexto es un objeto que WMI usa para pasar más información a un proveedor de WMI. En este caso, va a usar el objeto IWbemContext para indicar al proveedor que acepte actualizaciones parciales de instancias.

  2. Agregue los valores con nombre "__PUT_EXTENSIONS" y "__PUT_EXT_CLIENT_REQUEST" al objeto IWbemContext con una llamada a IWbemContext::SetValue.

    En la tabla siguiente se muestra el significado de "__PUT_EXTENSIONS" y "__PUT_EXT_CLIENT_REQUEST".

    Valor con nombre Descripción
    "__PUT_EXTENSIONS" VT_BOOL establecido en VARIANT_TRUE. Valor que indica que se ha especificado uno o varios de los otros valores de contexto. Esto permite una comprobación rápida del objeto de contexto dentro del proveedor para determinar si se usan actualizaciones de instancia parcial.
    "__PUT_EXT_CLIENT_REQUEST" VT_BOOL establecido en VARIANT_TRUE. Establecido por el cliente durante la solicitud inicial. Este valor se usa para evitar errores de reentrada.

     

  3. Agregue __PUT_EXT_STRICT_NULLS, __PUT_EXT_PROPERTIES o __PUT_EXT_ATOMIC en cualquier combinación según sea necesario al objeto IWbemContext con otra llamada a IWbemContext::SetValue.

    En la tabla siguiente se muestra el significado de los valores con nombre.

    Valor con nombre Descripción
    "__PUT_EXT_STRICT_NULLS" VT_BOOL establecido en VARIANT_TRUE. Indica que el cliente ha establecido intencionadamente propiedades en VT_NULL y espera que la operación de escritura se realice correctamente. Si el proveedor no puede establecer los valores en NULL, se debe notificar un error.
    "__PUT_EXT_PROPERTIES" SAFEARRAY de cadenas que contienen una lista de nombres de propiedad que se van a actualizar. Se puede utilizar solo o en combinación con "__PUT_EXT_PROPERTIES". Los valores están en la instancia de que se escribe.
    "__PUT_EXT_ATOMIC" VT_BOOL establecido en VARIANT_TRUE. Indica que todas las actualizaciones deben tener éxito a la vez (semántica atómica) o el proveedor debe volver atrás. No puede haber un éxito parcial. Se puede utilizar solo en combinación con otras marcas.

     

  4. Establezca el parámetro iFlags en WBEM_FLAG_UPDATE_ONLY. Sin esta marca, la llamada mostrará un error de contexto no válido.

  5. Pase el objeto de contexto IWbemContext a cualquier llamada IWbemServices::P utInstance o IWbemServices::P utInstanceAsync en el parámetro pCtx.

    Si se pasa el objeto IWbemContext, se indica al proveedor que permita actualizaciones de instancia parcial. En una actualización de instancia completa, establecería pCtx en NULL.

    El proveedor puede escribir las propiedades necesarias si el objeto de contexto presente en la llamada no contiene "__PUT_EXTENSIONS". Si "__PUT_EXTENSIONS" está presente en el objeto de contexto, WMI requiere que el proveedor obedezca exactamente la semántica de la operación o que la llamada genere errores. Para obtener más información, consulte Controlar mensajes denegados de acceso en un proveedor.