Partager via


Mise à jour d’une partie d’une instance

Il peut arriver que vous ne souhaitiez mettre à jour qu'une partie d'une instance. Par exemple, certaines instances ont un grand nombre de propriétés. Si vous deviez mettre à jour un grand nombre de ces instances, vous risquez de réduire les performances du système. Par conséquent, vous pouvez choisir de mettre à jour uniquement une partie de la instance, ce qui réduit la quantité d’informations que vous devez envoyer et récupérer à partir de WMI. Cependant, WMI ne prend pas directement en charge les opérations sur les instances partielles, pas plus que la plupart des fournisseurs. Par conséquent, si vous écrivez une application qui utilise des opérations de instance partielle, préparez-vous à l’échec de vos appels avec le code d’erreur WBEM_E_PROVIDER_NOT_CAPABLE ou WBEM_E_NOT_SUPPORTED en C++. Dans les langages de script, les codes d’erreur sont wbemErrProviderNotCapable ou wbemErrNotSupported.

Dans les scripts, cette opération n'est nécessaire que pour améliorer les performances lors de la mise à jour d'une ou deux propriétés inscriptibles dans un très grand nombre d'objets au sein d'une entreprise. Sinon, les appels VBScript normaux à SWbemObject.Put_ ou SWbemObject.PutAsync_, alors qu’ils semblent écrire l’objet entier, ne mettent en fait à jour que les propriétés pour lesquelles le fournisseur a activé l’écriture.

La procédure suivante décrit comment demander une mise à jour partielle instance à l’aide de PowerShell.

Pour demander une mise à jour de instance partielle à l’aide de PowerShell

  1. Récupérez le chemin de l'objet que vous souhaitez mettre à jour.

    Vous pouvez décrire le chemin manuellement ou interroger l’objet, puis récupérer la propriété __Path .

    $myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path
    #or
    $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
    
  2. Configurez une table de hachage répertoriant les noms des propriétés à mettre à jour et utilisez cette table de hachage dans un appel à Set-WmiInstance.

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

La procédure suivante décrit comment demander une mise à jour partielle d'une instance en utilisant le langage C#.

Notes

System.Management était l’espace de noms .NET d’origine utilisé pour accéder à WMI ; toutefois, les API de cet espace de noms sont généralement plus lentes et ne sont pas mises à l’échelle aussi bien par rapport à leurs équivalents Microsoft.Management.Infrastructure plus modernes.

 

Pour demander une mise à jour de instance partielle à l’aide de PowerShell

  1. Créez un objet ManagementObject qui représente la instance spécifique à mettre à jour.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    
  2. Fixer la valeur de la propriété par un appel à ManagementObject.SetPropertyValue.

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

La procédure suivante décrit comment demander une mise à jour partielle d'une instance en utilisant le langage C#.

Pour demander une mise à jour de instance partielle à l’aide de PowerShell

  1. Créez un objet de contexte SWbemNamedValueSet .

    Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
    
  2. Ajoutez les valeurs d’extension Put "__PUT_EXTENSIONS" et "__PUT_EXT_CLIENT_REQUEST" à l’objet de contexte à l’aide de la méthode SWbemNamedValueSet.Add .

    objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True
    objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
    
  3. Configurez un tableau répertoriant les noms des propriétés à mettre à jour et ajoutez ce tableau à l’objet de contexte SWbemNamedValueSet avec la valeur d’extension Put "__PUT_EXT_PROPERTIES".

    arProperties = Array("propertyname1", "propertyname2") 
    objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
    
  4. Définissez le paramètre iFlags de l’appel SWbemObject.Put_ sur wbemChangeFlagUpdateOnly. Sans cet indicateur, l’appel échoue avec un contexte non valide.

  5. Transmettez votre indicateur et votre objet de contexte au fournisseur dans le paramètre objwbemNamedValueSet de SWbemObject.Put_ ou SWbemObject.PutAsync_.

    call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
    

La procédure suivante décrit comment demander une mise à jour partielle d'une instance en utilisant le langage C#.

Pour demander une mise à jour de instance partielle à l’aide de PowerShell

  1. Créez un objet IWbemContext avec un appel à CoCreateInstance.

    Un objet de contexte est un objet que WMI utilise pour transmettre plus d’informations à un fournisseur WMI. Dans ce cas, vous utilisez l’objet IWbemContext pour indiquer au fournisseur d’accepter des mises à jour de instance partielles.

  2. Ajoutez les valeurs nommées "__PUT_EXTENSIONS" et "__PUT_EXT_CLIENT_REQUEST" à l’objet IWbemContext avec un appel à IWbemContext::SetValue.

    Le tableau suivant répertorie la signification de "__PUT_EXTENSIONS" et "__PUT_EXT_CLIENT_REQUEST".

    Valeur nommée Description
    "__PUT_EXTENSIONS" VT_BOOL défini sur VARIANT_TRUE. Valeur indiquant qu’une ou plusieurs des autres valeurs de contexte ont été spécifiées. Cela permet une case activée rapide de l’objet de contexte à l’intérieur du fournisseur pour déterminer si des mises à jour de instance partielles sont utilisées.
    "__PUT_EXT_CLIENT_REQUEST" VT_BOOL défini sur VARIANT_TRUE. Défini par le client lors de la demande initiale. Cette valeur est utilisée pour empêcher les erreurs de réentrance.

     

  3. Ajoutez le __PUT_EXT_STRICT_NULLS, le __PUT_EXT_PROPERTIES ou le __PUT_EXT_ATOMIC dans n’importe quelle combinaison nécessaire à l’objet IWbemContext avec un autre appel à IWbemContext::SetValue.

    Le tableau suivant indique la signification des valeurs nommées.

    Valeur nommée Description
    "__PUT_EXT_STRICT_NULLS" VT_BOOL défini sur VARIANT_TRUE. Indique que le client a intentionnellement défini les propriétés sur VT_NULL et s’attend à ce que l’opération d’écriture réussisse. Si le fournisseur ne peut pas définir les valeurs à NULL, une erreur doit être signalée.
    "__PUT_EXT_PROPERTIES" SAFEARRAY des chaînes contenant une liste de noms de propriétés à mettre à jour. Peut être utilisé seul ou en combinaison avec "__PUT_EXT_PROPERTIES". Les valeurs sont dans le instance en cours d’écriture.
    "__PUT_EXT_ATOMIC" VT_BOOL défini sur VARIANT_TRUE. Indique que toutes les mises à jour doivent réussir simultanément (sémantique atomique) ou que le fournisseur doit revenir en arrière. Il ne peut y avoir de réussite partielle. Peut être utilisé seul ou en combinaison avec d'autres drapeaux.

     

  4. Définissez le paramètre iFlags sur WBEM_FLAG_UPDATE_ONLY. Sans cet indicateur, l’appel échoue avec un contexte non valide.

  5. Transmettez l’objet de contexte IWbemContext dans n’importe quel appel IWbemServices::P utInstance ou IWbemServices::P utInstanceAsync dans le paramètre pCtx .

    La transmission de l’objet IWbemContext indique au fournisseur d’autoriser les mises à jour de instance partielles. Dans une mise à jour instance complète, vous devez définir pCtx sur NULL.

    Le fournisseur peut écrire toutes les propriétés nécessaires si l’objet de contexte présent dans l’appel ne contient pas "__PUT_EXTENSIONS". Si "__PUT_EXTENSIONS" est présent dans l’objet de contexte, WMI exige que le fournisseur obéisse exactement à la sémantique de l’opération ou échoue à l’appel. Pour plus d’informations, consultez Gestion des messages d’accès refusé dans un fournisseur.