Condividi tramite


Aggiornamento di un'intera istanza

Il mezzo più comune per aggiornare un'istanza della 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ò sostituire l'intera istanza modificata con l'istanza originale.

La procedura seguente descrive come modificare o aggiornare un'istanza usando 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 alla collezione Properties.

    Sebbene non sia necessario, è possibile conoscere il valore della proprietà prima di modificarlo.

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

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

    $mySettings.LoggingLevel = 1
    
  4. Riportare 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 con 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, visualizza le proprietà dell'oggetto con una chiamata alla raccolta proprietà.

    Sebbene non sia necessario, è possibile conoscere il valore della proprietà prima di modificarlo.

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

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

    myDisk.CimInstanceProperties["VolumeName"].Value = "NewName";
    
  4. Riportare 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 usando PowerShell.

Nota

System.Management era il namespace .NET originale utilizzato per accedere a WMI; tuttavia, le API in questo namespace generalmente sono più lente e non si scalano altrettanto bene rispetto alle loro controparti più moderne di Microsoft.Management.Infrastructure.

 

Per modificare o aggiornare un'istanza con 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 alla collezione Properties.

    Sebbene non sia necessario, è possibile conoscere il valore della proprietà prima di modificarlo.

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

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

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

    myDisk.Put();
    

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

Per modificare o aggiornare un'istanza utilizzando 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_.

    Sebbene non sia necessario, è possibile conoscere il valore della proprietà prima di modificarlo.

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

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

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

Come implicano i nomi, Put_ aggiorna sincronamente mentre PutAsync_ aggiorna asincronamente. Entrambi i metodi copiano l'istanza originale con l'istanza modificata. Tuttavia, per sfruttare i vantaggi dell'elaborazione asincrona, è necessario creare un oggettoSWbemSink. Per ulteriori informazioni, consultare Metodo di chiamata.

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.

    Sebbene non sia necessario, è possibile conoscere il valore della proprietà prima di modificarlo.

  3. Apportare le modifiche necessarie alla copia con una chiamata a IWbemClassObject::Put.

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

  4. Ripristinare la copia nel repository WMI con una chiamata ai metodi IWbemServices::PutInstance o IWbemServices::PutInstanceAsync.

    Come implicano i nomi, PutInstance aggiorna sincronamente mentre PutInstanceAsync aggiorna asincronamente. Entrambi i metodi copiano l'istanza originale con l'istanza modificata. Tuttavia, per sfruttare i vantaggi dell'elaborazione asincrona, è necessario implementare l'interfacciaIWbemObjectSink.

    È necessario 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 interessa 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 Chiamare un metodo del provider.

Nota

Poiché il callback al sink potrebbe non essere restituito allo stesso livello di autenticazione richiesto dal client, è consigliabile usare la comunicazione semiincrona anziché la comunicazione asincrona. Per ulteriori informazioni, vedere Chiamare un metodo.