Actualización de una instancia completa

Los medios más comunes de actualización de una instancia de clase WMI es actualizar toda la instancia a la vez. Al actualizar una instancia completa, WMI no tiene que analizar la instancia en propiedades individuales y enviarlas a la aplicación. En su lugar, WMI puede enviarle toda la instancia. Cuando termine, WMI puede copiar toda la instancia modificada en la instancia original.

En el procedimiento siguiente se describe cómo modificar o actualizar una instancia mediante PowerShell.

Para modificar o actualizar una instancia mediante PowerShell

  1. Recupere una copia local del objeto con una llamada a Get-WmiObject.

    $mySettings = get-WMIObject Win32_WmiSetting
    
  2. Si fuera necesario, vea las propiedades del objeto con una llamada a la colección Properties.

    Aunque no sea necesario, es posible que desee conocer el valor de la propiedad antes de cambiarlo.

    $mySettings.Properties
    
  3. Realice cualquier cambio en las propiedades del objeto local.

    Si lo hace, solo cambia la copia local. Para guardar los cambios en WMI, debe volver a colocar toda la copia en el repositorio de WMI.

    $mySettings.LoggingLevel = 1
    
  4. Vuelva a colocar el objeto en el repositorio de WMI mediante una llamada al método Put.

    $mySettings.Put()
    

En el procedimiento siguiente se describe cómo modificar o actualizar una instancia mediante C#.

Para modificar o actualizar una instancia mediante C# (Microsoft.Management.Infrastructure)

  1. Recupere una copia local del objeto con una llamada a CimSession.GetInstance, como se describe en Recuperación de una instancia de WMI.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "win32_logicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    diskDrive.CimInstanceProperties.Add(CimProperty.Create("DeviceID", "C:", CimFlags.Key));
    
    CimSession session = CimSession.Create("localhost");
    CimInstance myDisk = session.GetInstance(Namespace, diskDrive);
    
  2. Si fuera necesario, vea las propiedades del objeto con una llamada a la colección Properties.

    Aunque no sea necesario, es posible que desee conocer el valor de la propiedad antes de cambiarlo.

    foreach (CimProperty property in myDisk.CimInstanceProperties)
    {
       Console.WriteLine(property.ToString());
    }
    
    Console.ReadLine();
    
  3. Realice cualquier cambio en las propiedades del objeto local.

    Si lo hace, solo cambia la copia local. Para guardar los cambios en WMI, debe volver a colocar toda la copia en el repositorio de WMI.

    myDisk.CimInstanceProperties["VolumeName"].Value = "NewName";
    
  4. Vuelva a colocar el objeto en el repositorio de WMI mediante una llamada a CimSession.ModifyInstance.

    session.ModifyInstance(Namespace,myDisk);
    

En el procedimiento siguiente se describe cómo modificar o actualizar una instancia mediante PowerShell.

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.

 

Para modificar o actualizar una instancia mediante C# (Microsoft.Management)

  1. Recupere una copia local del objeto con una llamada a ManagementObject.Get.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    myDisk.Get();
    
  2. Si fuera necesario, vea las propiedades del objeto con una llamada a la colección Properties.

    Aunque no sea necesario, es posible que desee conocer el valor de la propiedad antes de cambiarlo.

    foreach (PropertyData property in myDisk.Properties)
    {
       Console.WriteLine(property.Name + " " + property.Value);
    }
    
    Console.ReadLine();
    
  3. Realice cualquier cambio en las propiedades del objeto local.

    Si lo hace, solo cambia la copia local. Para guardar los cambios en WMI, debe volver a colocar toda la copia en el repositorio de WMI.

    myDisk["VolumeName"] = "newName";
    
  4. Vuelva a colocar el objeto en el repositorio de WMI mediante una llamada al método ManagementObject.Put.

    myDisk.Put();
    

En el procedimiento siguiente se describe cómo modificar o actualizar una instancia mediante VBScript.

Para modificar o actualizar una instancia mediante VBScript

  1. Recupere una copia local del objeto con una llamada a GetObject.

  2. Si fuera necesario, vea las propiedades del objeto con una llamada al método Properties_.

    Aunque no sea necesario, es posible que desee conocer el valor de la propiedad antes de cambiarlo.

  3. Realice cualquier cambio en las propiedades del objeto con una llamada al método SWbemProperty.Value.

    El método Value solo cambia la copia local. Para guardar los cambios en WMI, debe volver a colocar toda la copia en el repositorio de WMI.

  4. Vuelva a colocar el objeto en el repositorio de WMI con una llamada a los métodos SWbemObject.Put_ o SWbemObject.PutAsync_.

Como los nombres implican, Put_ realiza actualizaciones sincrónicamente, mientras que PutAsync_ realiza actualizaciones de forma asincrónica. Cualquiera de los métodos copia en la instancia original con la instancia modificada. Sin embargo, para aprovechar el procesamiento asincrónico, debe crear un objeto SWbemSink. Para más información, consulte Llamada a un método.

En el procedimiento siguiente se describe cómo modificar o actualizar una instancia mediante C++.

Para modificar o actualizar una instancia mediante  C++

  1. Recupere una copia local de la instancia con una llamada a IWbemServices::GetObject o IWbemServices::GetObjectAsync.

  2. Si fuera necesario, vea las propiedades del objeto con una llamada a IWbemClassObject::Get.

    Aunque no sea necesario, es posible que desee conocer el valor de la propiedad antes de cambiarlo.

  3. Realice los cambios necesarios en la copia con una llamada a IWbemClassObject::Put.

    El método Put solo cambia la copia local. Para guardar los cambios en WMI, debe volver a colocar toda la copia en el repositorio de WMI.

  4. Vuelva a colocar la copia en el repositorio de WMI con una llamada a los métodos IWbemServices::P utInstance o IWbemServices::P utInstanceAsync.

    Como los nombres implican, PutInstance se actualiza de forma sincrónica, mientras que PutInstanceAsync lo hace de forma asincrónica. Cualquiera de los métodos copia en la instancia original con la instancia modificada. Sin embargo, para aprovechar el procesamiento asincrónico, es preciso implementar la interfaz IWbemObjectSink.

    Debe tener en cuenta que es posible que una operación de actualización de una instancia que pertenezca a una jerarquía de clases no se realice correctamente debido a un error relacionado con otra clase de la jerarquía. WMI llama al método PutInstanceAsync de cada uno de los proveedores responsables de las clases de las que deriva la clase propietaria de la instancia original. Si se produce un error en alguno de estos proveedores, se produce un error en la solicitud de actualización original. Para más información, consulte la sección Observaciones de PutInstanceAsync.

Para más información, consulte Llamada a un método de proveedor.

Nota

Dado que es posible que la devolución de llamada al receptor no se devuelva en el mismo nivel de autenticación que requiere el cliente, se recomienda usar la comunicación semisincrónica, en lugar de la asincrónica. Para más información, vea Llamada a un método.