Partilhar via


Atualizar uma instância inteira

O meio mais comum de atualizar uma instância de classe WMI é atualizar toda a instância de uma só vez. Ao atualizar uma instância inteira, o WMI não precisa analisar a instância em propriedades individuais e enviá-las para seu aplicativo. Em vez disso, o WMI pode simplesmente enviar a instância inteira. Quando você termina, o WMI pode copiar toda a instância alterada na instância original.

O procedimento a seguir descreve como modificar ou atualizar uma instância usando o PowerShell.

Para modificar ou atualizar uma instância usando o PowerShell

  1. Recupere uma cópia local do objeto com uma chamada para Get-WmiObject.

    $mySettings = get-WMIObject Win32_WmiSetting
    
  2. Se necessário, exiba as propriedades do objeto com uma chamada para a coleção Properties.

    Embora não seja necessário, talvez você queira saber o valor da propriedade antes de alterá-la.

    $mySettings.Properties
    
  3. Faça alterações nas propriedades do objeto local.

    Isso altera apenas a cópia local. Para salvar suas alterações no WMI, você deve colocar a cópia inteira de volta no repositório WMI.

    $mySettings.LoggingLevel = 1
    
  4. Coloque o objeto de volta no repositório WMI usando uma chamada para o método Put.

    $mySettings.Put()
    

O procedimento a seguir descreve como modificar ou atualizar uma instância usando C#.

Para modificar ou atualizar uma instância usando C# (Microsoft.Management.Infrastructure)

  1. Recupere uma cópia local do objeto com uma chamada para CimSession.GetInstance, conforme descrito em Recuperar uma instância do 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 necessário, exiba as propriedades do objeto com uma chamada para a coleção Properties.

    Embora não seja necessário, talvez você queira saber o valor da propriedade antes de alterá-la.

    foreach (CimProperty property in myDisk.CimInstanceProperties)
    {
       Console.WriteLine(property.ToString());
    }
    
    Console.ReadLine();
    
  3. Faça alterações nas propriedades do objeto local.

    Isso altera apenas a cópia local. Para salvar suas alterações no WMI, você deve colocar a cópia inteira de volta no repositório WMI.

    myDisk.CimInstanceProperties["VolumeName"].Value = "NewName";
    
  4. Coloque o objeto de volta no repositório do WMI usando uma chamada para CimSession.ModifyInstance.

    session.ModifyInstance(Namespace,myDisk);
    

O procedimento a seguir descreve como modificar ou atualizar uma instância usando o PowerShell.

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 modificar ou atualizar uma instância usando C# (Microsoft.Management)

  1. Recupere uma cópia local do objeto com uma chamada para ManagementObject.Get.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    myDisk.Get();
    
  2. Se necessário, exiba as propriedades do objeto com uma chamada para a coleção Properties.

    Embora não seja necessário, talvez você queira saber o valor da propriedade antes de alterá-la.

    foreach (PropertyData property in myDisk.Properties)
    {
       Console.WriteLine(property.Name + " " + property.Value);
    }
    
    Console.ReadLine();
    
  3. Faça alterações nas propriedades do objeto local.

    Isso altera apenas a cópia local. Para salvar suas alterações no WMI, você deve colocar a cópia inteira de volta no repositório WMI.

    myDisk["VolumeName"] = "newName";
    
  4. Coloque o objeto de volta no repositório WMI usando uma chamada para o ManagementObject.Put ou método.

    myDisk.Put();
    

O procedimento a seguir descreve como modificar ou atualizar uma instância usando VBScript.

Para modificar ou atualizar uma instância usando o VBScript

  1. Recupere uma cópia local do objeto com uma chamada para GetObject.

  2. Se necessário, exiba as propriedades do objeto com uma chamada para o método Properties_.

    Embora não seja necessário, talvez você queira saber o valor da propriedade antes de alterá-la.

  3. Faça alterações nas propriedades do objeto com uma chamada para o método SWbemProperty.Value.

    O método Value altera apenas a cópia local. Para salvar suas alterações no WMI, você deve colocar a cópia inteira de volta no repositório WMI.

  4. Coloque o objeto de volta no repositório do WMI com uma chamada aos métodos SWbemObject.Put_ ou SWbemObject.PutAsync_.

Como os nomes implicam, Put_ é atualizado de forma síncrona enquanto PutAsync_ é atualizado de forma assíncrona. Qualquer um dos métodos copia pela instância original com a instância modificada. No entanto, para aproveitar o processamento assíncrono, você deve criar um objeto SWbemSink. Para obter mais informações, consulte Chamar um método.

O procedimento a seguir descreve como modificar ou atualizar uma instância usando C++.

Para modificar ou atualizar uma instância usando o C++

  1. Recupere uma cópia local da instância com uma chamada para IWbemServices::GetObject ou IWbemServices::GetObjectAsync.

  2. Se necessário, exiba as propriedades do objeto com uma chamada para o método IWbemClassObject::Get.

    Embora não seja necessário, talvez você queira saber o valor da propriedade antes de alterá-la.

  3. Faça as alterações necessárias na cópia com uma chamada para IWbemClassObject::Put.

    O método Put altera apenas a cópia local. Para salvar suas alterações no WMI, você deve colocar a cópia inteira de volta no repositório WMI.

  4. Coloque sua cópia de volta no repositório do WMI com uma chamada para os métodos IWbemServices::PutInstance ou IWbemServices::PutInstanceAsync.

    Como os nomes implicam, PutInstance é atualizado de forma síncrona enquanto PutInstanceAsync é atualizado de forma assíncrona. Qualquer um dos métodos copia pela instância original com a instância modificada. No entanto, para aproveitar o processamento assíncrono, você deve implementar a interface IWbemObjectSink.

    Você deve estar ciente de que uma operação de atualização em uma instância que pertence a uma hierarquia de classe pode não ter êxito devido a um erro envolvendo outra classe na hierarquia. O WMI chama o método PutInstanceAsync de cada um dos provedores responsáveis pelas classes das quais a classe que possui a instância original deriva. Se algum desses provedores falhar, a solicitação de atualização original falhará. Para obter mais informações , confira a seção Comentários de PutInstanceAsync.

Para obter mais informações, consulte Chamar um método Provider.

Observação

Como o retorno de chamada para o coletor pode não ser retornado no mesmo nível de autenticação exigido pelo cliente, é recomendável que você use comunicação semissíncrona em vez de assíncrona. Para obter mais informações, confira Como chamar um método.