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
Recupere uma cópia local do objeto com uma chamada para Get-WmiObject.
$mySettings = get-WMIObject Win32_WmiSetting
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
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
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)
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);
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();
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";
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)
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();
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();
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";
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
Recupere uma cópia local do objeto com uma chamada para GetObject.
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.
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.
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++
Recupere uma cópia local da instância com uma chamada para IWbemServices::GetObject ou IWbemServices::GetObjectAsync.
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.
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.
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.