Atualizar parte de uma instância

Ocasionalmente, talvez você queira atualizar apenas parte de uma instância. Por exemplo, algumas instâncias têm um grande número de propriedades. Se você tiver que atualizar um grande número dessas instâncias, poderá reduzir o desempenho do sistema. Portanto, você pode optar por atualizar apenas parte da instância e, assim, reduzir a quantidade de informações que deve enviar e recuperar de e para o WMI. No entanto, o WMI não dá suporte diretamente a operações de instância parcial nem à maioria dos provedores. Portanto, se você escrever um aplicativo que usa operações de instância parcial, esteja preparado para que s chamadas falhem com o código de erro WBEM_E_PROVIDER_NOT_CAPABLE ou WBEM_E_NOT_SUPPORTED no C++. Em linguagens de script, os códigos de erro são wbemErrProviderNotCapable ou wbemErrNotSupported.

No script, essa operação só é necessária para auxiliar o desempenho ao atualizar uma ou duas propriedades graváveis em um número muito grande de objetos em uma empresa. Caso contrário, as chamadas normais de VBScript para SWbemObject.Put_ ou SWbemObject.PutAsync_, ao mesmo tempo em que parecem gravar todo o objeto, estão apenas atualizando as propriedades em que o provedor está habilitado para gravação.

O procedimento a seguir descreve como solicitar uma atualização de instância parcial usando o PowerShell.

Para solicitar uma atualização de instância parcial usando o PowerShell

  1. Recupere o caminho do objeto que deseja atualizar.

    Você pode descrever o caminho manualmente ou consultar o objeto e, em seguida, recuperar a propriedade __Path.

    $myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path
    #or
    $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
    
  2. Configure uma tabela de hash listando os nomes das propriedades a serem atualizadas e use essa tabela em uma chamada para Set-WmiInstance.

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

O procedimento a seguir descreve como solicitar uma atualização de instância parcial usando C#.

Observação

System.Management era o namespace original do .NET usado para acessar o WMI. No entanto, as APIs nesse namespace geralmente são mais lentas e não escalam tão bem em relação às contrapartes mais modernas do Microsoft.Management.Infrastructure.

 

Para solicitar uma atualização de instância parcial usando C#

  1. Crie um objeto ManagementObject que representa a instância específica a ser atualizada.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    
  2. Defina o valor da propriedade com uma chamada para ManagementObject.SetPropertyValue.

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

O procedimento a seguir descreve como solicitar uma atualização de instância parcial usando VBScript.

Para solicitar uma atualização de instância parcial usando VBScript

  1. Crie um objeto de contexto SWbemNamedValueSet.

    Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
    
  2. Adicione os valores de extensão Put "__PUT_EXTENSIONS" e "__PUT_EXT_CLIENT_REQUEST" ao objeto de contexto usando o método SWbemNamedValueSet.Add.

    objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True
    objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
    
  3. Configure uma matriz listando os nomes das propriedades a serem atualizadas e adicione essa matriz ao objeto de contexto SWbemNamedValueSet com o valor de extensão Put "__PUT_EXT_PROPERTIES".

    arProperties = Array("propertyname1", "propertyname2") 
    objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
    
  4. Defina o parâmetro iFlags da chamada SWbemObject.Put_ como wbemChangeFlagUpdateOnly. Sem esse sinalizador, a chamada falhará com um contexto inválido.

  5. Passe o sinalizador e o objeto de contexto para o provedor no parâmetro objwbemNamedValueSet de SWbemObject.Put_ ou SWbemObject.PutAsync_.

    call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
    

O procedimento a seguir descreve como solicitar uma atualização de instância parcial usando C++.

Para solicitar uma atualização de instância parcial usando C++

  1. Crie um objeto IWbemContext com uma chamada para CoCreateInstance.

    Um objeto de contexto é um objeto usado pelo WMI para passar mais informações para um provedor WMI. Nesse caso, você está usando o objeto IWbemContext para instruir o provedor a aceitar atualizações de instância parcial.

  2. Adicione os valores nomeados "__PUT_EXTENSIONS" e "__PUT_EXT_CLIENT_REQUEST" ao objeto IWbemContext com uma chamada para IWbemContext::SetValue.

    A tabela a seguir lista o significado de "__PUT_EXTENSIONS" e "__PUT_EXT_CLIENT_REQUEST".

    Valor nomeado Descrição
    "__PUT_EXTENSIONS" VT_BOOL definido como VARIANT_TRUE. Um valor que indica que um ou mais dos outros valores de contexto foram especificados. Isso permite que uma verificação rápida do objeto de contexto dentro do provedor determine se as atualizações de instância parcial estão sendo usadas.
    "__PUT_EXT_CLIENT_REQUEST" VT_BOOL definido como VARIANT_TRUE. Definido pelo cliente durante a solicitação inicial. Esse valor é usado para evitar erros de reentrada.

     

  3. Adicione __PUT_EXT_STRICT_NULLS, __PUT_EXT_PROPERTIES ou __PUT_EXT_ATOMIC em qualquer combinação, conforme necessário ao objeto IWbemContext, com outra chamada para IWbemContext::SetValue.

    A tabela a seguir lista o significado dos valores nomeados.

    Valor nomeado Descrição
    "__PUT_EXT_STRICT_NULLS" VT_BOOL definido como VARIANT_TRUE. Indica que o cliente definiu intencionalmente as propriedades como VT_NULL e espera que a operação de gravação tenha êxito. Se o provedor não puder definir os valores como NULL, um erro deverá ser relatado.
    "__PUT_EXT_PROPERTIES" SAFEARRAY de cadeias de caracteres que contêm uma lista de nomes de propriedade a serem atualizados. Pode ser usado sozinho ou em combinação com "__PUT_EXT_PROPERTIES". Os valores estão na instância sendo gravada.
    "__PUT_EXT_ATOMIC" VT_BOOL definido como VARIANT_TRUE. Indica que todas as atualizações devem ter êxito simultaneamente (semântica atômica) ou que o provedor deve reverter. Não pode haver sucesso parcial. Pode ser usado sozinho ou em combinação com outros sinalizadores.

     

  4. Defina o parâmetro iFlags como WBEM_FLAG_UPDATE_ONLY. Sem esse sinalizador, a chamada falhará com um contexto inválido.

  5. Passe o objeto de contexto IWbemContext para qualquer chamada IWbemServices::PutInstance ou IWbemServices::PutInstanceAsync no parâmetro pCtx.

    Passar o objeto IWbemContext instrui o provedor a permitir atualizações parciais de instância. Em uma atualização de instância completa, você definiria pCtx como NULL.

    O provedor poderá gravar as propriedades necessárias se o objeto de contexto presente na chamada não contiver "__PUT_EXTENSIONS". Se "__PUT_EXTENSIONS" estiver presente no objeto de contexto, o WMI exigirá que o provedor obedeça a semântica da operação exatamente ou então falhe na chamada. Para obter mais informações, consulte Manipular mensagens de acesso negado em um provedor.