Partilhar via


Atualizando parte de uma instância

Ocasionalmente, você pode querer 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 você deve enviar e recuperar de e para o WMI. No entanto, o WMI não suporta diretamente operações de instância parcial, nem a maioria dos provedores. Portanto, se você escrever um aplicativo que usa operações de instância parcial, esteja preparado para que suas chamadas falhem com o código de erro WBEM_E_PROVIDER_NOT_CAPABLE ou WBEM_E_NOT_SUPPORTED em C++. Em linguagens de script, os códigos de erro são wbemErrProviderNotCapable ou wbemErrNotSupported.

Em scripts, essa operação só é necessária para ajudar no desempenho ao atualizar uma ou duas propriedades graváveis em um número muito grande de objetos num ambiente empresarial. Caso contrário, as chamadas normais do VBScript para SWbemObject.Put_ ou SWbemObject.PutAsync_, embora pareçam gravar o objeto inteiro, na verdade estão apenas atualizando as propriedades que o provedor tem 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 de hash 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 .NET original usado para acessar o WMI; no entanto, as APIs neste namespace geralmente são mais lentas e não são dimensionadas tão bem em relação às suas contrapartes mais modernas Microsoft.Management.Infrastructure.

 

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

  1. Crie um novo ManagementObject objeto que represente 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 através de 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 o VBScript

  1. Crie um SWbemNamedValueSet objeto de contexto.

    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 SWbemNamedValueSetcom o valor da 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 a sua bandeira e o objeto de contexto para o fornecedor 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 que o WMI usa 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 uma verificação rápida do objeto de contexto dentro do provedor para determinar 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 o pedido inicial. Esse valor é usado para evitar erros de reentrância.

     

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

    A tabela a seguir lista o significado dos valores nomeados.

    Valor atribuído Descrição
    "__PUT_EXT_STRICT_NULLS" VT_BOOL definido como VARIANT_TRUE. Indica que o cliente definiu intencionalmente as propriedades para VT_NULL e espera que a operação de gravação seja bem-sucedida. Se o provedor não puder definir os valores como NULL , um erro deverá ser relatado.
    "__COLOCAR_PROPRIEDADES_EXT" SAFEARRAY de cadeias de caracteres contendo uma lista de nomes de propriedades a serem atualizadas. Pode ser utilizado isoladamente ou em combinação com "__PUT_EXT_PROPERTIES". Os valores estão na instância que está a ser gravada.
    "__PUT_EXT_ATOMIC" VT_BOOL definido como VARIANT_TRUE. Indica que todas as atualizações devem ser bem-sucedidas simultaneamente (semântica atômica) ou que o provedor deve reverter as alterações. Não pode haver sucesso parcial. Pode ser utilizado isoladamente ou em combinação com outras bandeiras.

     

  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 de instância parciais. Em uma atualização de instância completa, você definiria pCtx como NULL.

    O provedor pode escrever quaisquer 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 à semântica da operação exatamente ou então falhe na chamada. Para obter mais informações, consulte Manipulando mensagens de acesso negado em um provedor.