Aggiornamento di parte di un'istanza

In alcuni casi, può essere necessario aggiornare solo parte di un'istanza di . Ad esempio, alcune istanze hanno un numero elevato di proprietà. Se è stato necessario aggiornare un numero elevato di queste istanze, è possibile ridurre le prestazioni del sistema. È quindi possibile scegliere di aggiornare solo parte dell'istanza e quindi ridurre la quantità di informazioni da inviare e recuperare da e verso WMI. TUTTAVIA, WMI non supporta direttamente le operazioni di istanza parziale, né la maggior parte dei provider. Pertanto, se si scrive un'applicazione che usa operazioni di istanza parziale, è necessario prepararsi affinché le chiamate non riescano con il codice di errore WBEM_E_PROVIDER_NOT_CAPABLE o WBEM_E_NOT_SUPPORTED in C++. Nei linguaggi di scripting i codici di errore sono wbemErrProviderNotCapable o wbemErrNotSupported.

Nell'esecuzione di script, questa operazione è necessaria solo per facilitare le prestazioni durante l'aggiornamento di una o due proprietà scrivibili in un numero molto elevato di oggetti in un'organizzazione. In caso contrario, le normali chiamate VBScript a SWbemObject.Put_ o SWbemObject.PutAsync_, mentre sembrano scrivere l'intero oggetto, stanno effettivamente aggiornando solo le proprietà che il provider ha abilitato per la scrittura.

La procedura seguente descrive come richiedere un aggiornamento parziale dell'istanza usando PowerShell.

Per richiedere un aggiornamento parziale dell'istanza tramite PowerShell

  1. Recuperare il percorso dell'oggetto da aggiornare.

    È possibile descrivere il percorso manualmente oppure eseguire una query sull'oggetto e quindi recuperare la proprietà __Path .

    $myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path
    #or
    $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
    
  2. Configurare una tabella hash che elenca i nomi delle proprietà da aggiornare e usare questa tabella hash in una chiamata a Set-WmiInstance.

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

La procedura seguente descrive come richiedere un aggiornamento parziale dell'istanza usando C#.

Nota

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

 

Per richiedere un aggiornamento parziale dell'istanza tramite C #

  1. Creare un nuovo oggetto ManagementObject che rappresenta l'istanza specifica da aggiornare.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    
  2. Impostare il valore della proprietà con una chiamata a ManagementObject.SetPropertyValue.

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

La procedura seguente descrive come richiedere un aggiornamento parziale dell'istanza usando VBScript.

Per richiedere un aggiornamento parziale dell'istanza tramite VBScript

  1. Creare un oggetto di contesto SWbemNamedValueSet .

    Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
    
  2. Aggiungere i valori di estensione Put "__PUT_EXTENSIONS" e "__PUT_EXT_CLIENT_REQUEST" all'oggetto di contesto usando il metodo SWbemNamedValueSet.Add .

    objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True
    objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
    
  3. Configurare una matrice che elenca i nomi delle proprietà da aggiornare e aggiungere questa matrice all'oggetto contesto SWbemNamedValueSet con il valore di estensione Put "__PUT_EXT_PROPERTIES".

    arProperties = Array("propertyname1", "propertyname2") 
    objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
    
  4. Impostare il parametro iFlags della SWbemObject.Put_ chiamata a wbemChangeFlagUpdateOnly. Senza questo flag la chiamata avrà esito negativo con un contesto non valido.

  5. Passare il flag e l'oggetto di contesto al provider nel parametro objwbemNamedValueSet di SWbemObject.Put_ o SWbemObject.PutAsync_.

    call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
    

La procedura seguente descrive come richiedere un aggiornamento parziale dell'istanza usando C++.

Per richiedere un aggiornamento parziale dell'istanza tramite C++

  1. Creare un oggetto IWbemContext con una chiamata a CoCreateInstance.

    Un oggetto di contesto è un oggetto utilizzato da WMI per passare altre informazioni a un provider WMI. In questo caso, si usa l'oggetto IWbemContext per indicare al provider di accettare gli aggiornamenti parziali dell'istanza.

  2. Aggiungere i valori denominati "__PUT_EXTENSIONS" e "__PUT_EXT_CLIENT_REQUEST" all'oggetto IWbemContext con una chiamata a IWbemContext::SetValue.

    La tabella seguente elenca il significato di "__PUT_EXTENSIONS" e "__PUT_EXT_CLIENT_REQUEST".

    Valore denominato Descrizione
    "__PUT_EXTENSIONS" VT_BOOL impostato su VARIANT_TRUE. Valore che indica che è stato specificato uno o più valori di contesto. In questo modo è possibile controllare rapidamente l'oggetto di contesto all'interno del provider per determinare se vengono usati aggiornamenti parziali dell'istanza.
    "__PUT_EXT_CLIENT_REQUEST" VT_BOOL impostato su VARIANT_TRUE. Impostato dal client durante la richiesta iniziale. Questo valore viene usato per evitare errori di reentrancy.

     

  3. Aggiungere il __PUT_EXT_STRICT_NULLS, __PUT_EXT_PROPERTIES o __PUT_EXT_ATOMIC in qualsiasi combinazione in base alle esigenze all'oggetto IWbemContext con un'altra chiamata a IWbemContext::SetValue.

    La tabella seguente elenca il significato dei valori denominati.

    Valore denominato Descrizione
    "__PUT_EXT_STRICT_NULLS" VT_BOOL impostato su VARIANT_TRUE. Indica che il client ha intenzionalmente impostato le proprietà su VT_NULL e prevede che l'operazione di scrittura abbia esito positivo. Se il provider non può impostare i valori su NULL, deve essere segnalato un errore.
    "__PUT_EXT_PROPERTIES" SAFEARRAY di stringhe contenenti un elenco di nomi di proprietà da aggiornare. Può essere usato da solo o in combinazione con "__PUT_EXT_PROPERTIES". I valori si trovano nell'istanza scritta.
    "__PUT_EXT_ATOMIC" VT_BOOL impostato su VARIANT_TRUE. Indica che tutti gli aggiornamenti devono avere esito positivo contemporaneamente (semantica atomica) o che il provider deve ripristinare. Non può verificarsi un esito positivo parziale. Può essere usato da solo o in combinazione con altri flag.

     

  4. Impostare il parametro iFlagssu WBEM_FLAG_UPDATE_ONLY. Senza questo flag la chiamata avrà esito negativo con un contesto non valido.

  5. Passare l'oggetto contesto IWbemContext in tutte le chiamate IWbemServices::P utInstance o IWbemServices::P utInstanceAsync nel parametro pCtx .

    Il passaggio dell'oggetto IWbemContext indica al provider di consentire gli aggiornamenti parziali dell'istanza. In un aggiornamento a istanza completa impostare pCtx su NULL.

    Il provider può scrivere le proprietà necessarie se l'oggetto contesto presente nella chiamata non contiene "__PUT_EXTENSIONS". Se "__PUT_EXTENSIONS" è presente nell'oggetto di contesto, WMI richiede al provider di rispettare la semantica dell'operazione esattamente o altrimenti non riesce la chiamata. Per altre informazioni, vedere Gestione dei messaggi di accesso negato in un provider.