Aggiornamento di un'intera istanza

Il mezzo più comune per aggiornare un'istanza di classe WMI consiste nell'aggiornare l'intera istanza contemporaneamente. Aggiornando un'intera istanza, WMI non deve analizzare l'istanza in singole proprietà e inviarle all'applicazione. WMI può invece inviare semplicemente l'intera istanza. Al termine, WMI può quindi copiare l'intera istanza modificata nell'istanza originale.

La procedura seguente descrive come modificare o aggiornare un'istanza con PowerShell.

Per modificare o aggiornare un'istanza con PowerShell

  1. Recuperare una copia locale dell'oggetto con una chiamata a Get-WmiObject.

    $mySettings = get-WMIObject Win32_WmiSetting
    
  2. Se necessario, visualizzare le proprietà dell'oggetto con una chiamata all'insieme Properties.

    Anche se non è necessario, è possibile sapere il valore della proprietà prima di modificarlo.

    $mySettings.Properties
    
  3. Apportare modifiche alle proprietà dell'oggetto locale.

    In questo modo viene modificata solo la copia locale. Per salvare le modifiche apportate a WMI, è necessario inserire l'intera copia nel repository WMI.

    $mySettings.LoggingLevel = 1
    
  4. Inserire nuovamente l'oggetto nel repository WMI usando una chiamata al metodo Put.

    $mySettings.Put()
    

La procedura seguente descrive come modificare o aggiornare un'istanza usando C#.

Per modificare o aggiornare un'istanza usando C# (Microsoft.Management.Infrastructure)

  1. Recuperare una copia locale dell'oggetto con una chiamata a CimSession.GetInstance, come descritto in Recupero di un'istanza 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. Se necessario, visualizzare le proprietà dell'oggetto con una chiamata all'insieme Properties.

    Anche se non è necessario, è possibile sapere il valore della proprietà prima di modificarlo.

    foreach (CimProperty property in myDisk.CimInstanceProperties)
    {
       Console.WriteLine(property.ToString());
    }
    
    Console.ReadLine();
    
  3. Apportare modifiche alle proprietà dell'oggetto locale.

    In questo modo viene modificata solo la copia locale. Per salvare le modifiche apportate a WMI, è necessario inserire l'intera copia nel repository WMI.

    myDisk.CimInstanceProperties["VolumeName"].Value = "NewName";
    
  4. Inserire nuovamente l'oggetto nel repository WMI usando una chiamata a CimSession.ModifyInstance.

    session.ModifyInstance(Namespace,myDisk);
    

La procedura seguente descrive come modificare o aggiornare un'istanza con PowerShell.

Nota

System.Management era lo spazio dei nomi .NET originale usato per accedere a WMI; tuttavia, le API in questo spazio dei nomi sono generalmente più lente e non sono più lente rispetto alle loro controparti Microsoft.Management.Infrastructure più moderne.

 

Per modificare o aggiornare un'istanza usando C# (Microsoft.Management)

  1. Recuperare una copia locale dell'oggetto con una chiamata a ManagementObject.Get.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    myDisk.Get();
    
  2. Se necessario, visualizzare le proprietà dell'oggetto con una chiamata all'insieme Properties.

    Anche se non è necessario, è possibile sapere il valore della proprietà prima di modificarlo.

    foreach (PropertyData property in myDisk.Properties)
    {
       Console.WriteLine(property.Name + " " + property.Value);
    }
    
    Console.ReadLine();
    
  3. Apportare modifiche alle proprietà dell'oggetto locale.

    In questo modo viene modificata solo la copia locale. Per salvare le modifiche apportate a WMI, è necessario inserire l'intera copia nel repository WMI.

    myDisk["VolumeName"] = "newName";
    
  4. Inserire nuovamente l'oggetto nel repository WMI usando una chiamata al metodo ManagementObject.Put .

    myDisk.Put();
    

La procedura seguente descrive come modificare o aggiornare un'istanza usando VBScript.

Per modificare o aggiornare un'istanza usando VBScript

  1. Recuperare una copia locale dell'oggetto con una chiamata a GetObject.

  2. Se necessario, visualizzare le proprietà dell'oggetto con una chiamata al metodo Properties_ .

    Anche se non è necessario, è possibile sapere il valore della proprietà prima di modificarlo.

  3. Apportare modifiche alle proprietà dell'oggetto con una chiamata al metodo SWbemProperty.Value .

    Il metodo Value modifica solo la copia locale. Per salvare le modifiche apportate a WMI, è necessario inserire l'intera copia nel repository WMI.

  4. Posizionare nuovamente l'oggetto nel repository WMI con una chiamata ai metodi SWbemObject.Put_ o SWbemObject.PutAsync_ .

Poiché i nomi implicano, Put_ aggiornano in modo sincrono mentre PutAsync_ aggiornano in modo asincrono. Entrambi i metodi copiano l'istanza originale con l'istanza modificata. Tuttavia, per sfruttare l'elaborazione asincrona, è necessario creare un oggetto SWbemSink . Per altre informazioni, vedere Chiamata di un metodo.

La procedura seguente descrive come modificare o aggiornare un'istanza usando C++.

Per modificare o aggiornare un'istanza usando C++

  1. Recuperare una copia locale dell'istanza con una chiamata a IWbemServices::GetObject o IWbemServices::GetObjectAsync.

  2. Se necessario, visualizzare le proprietà dell'oggetto con una chiamata a IWbemClassObject::Get.

    Anche se non è necessario, è possibile sapere il valore della proprietà prima di modificarlo.

  3. Apportare tutte le modifiche necessarie alla copia con una chiamata a IWbemClassObject::P ut.

    Il metodo Put modifica solo la copia locale. Per salvare le modifiche apportate a WMI, è necessario inserire l'intera copia nel repository WMI.

  4. Inserire nuovamente la copia nel repository WMI con una chiamata ai metodi IWbemServices::P utInstance o IWbemServices::PutInstanceAsync .

    Poiché i nomi implicano, PutInstance aggiorna in modo sincrono mentre PutInstanceAsync aggiorna in modo asincrono. Entrambi i metodi copiano l'istanza originale con l'istanza modificata. Tuttavia, per sfruttare l'elaborazione asincrona, è necessario implementare l'interfaccia IWbemObjectSink .

    È consigliabile tenere presente che un'operazione di aggiornamento in un'istanza appartenente a una gerarchia di classi potrebbe non riuscire a causa di un errore che coinvolge un'altra classe nella gerarchia. WMI chiama il metodo PutInstanceAsync di ognuno dei provider responsabili delle classi da cui deriva la classe proprietaria dell'istanza originale. Se uno di questi provider ha esito negativo, la richiesta di aggiornamento originale ha esito negativo. Per altre informazioni, vedere la sezione Osservazioni di PutInstanceAsync.

Per altre informazioni, vedere Chiamata di un metodo provider.

Nota

Poiché il callback nel sink potrebbe non essere restituito allo stesso livello di autenticazione richiesto dal client, è consigliabile usare semisynchrono anziché la comunicazione asincrona. Per altre informazioni, vedere Chiamata di un metodo.