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 terminar, o WMI poderá copiar toda a instância alterada sobre a 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 obrigatório, você pode querer saber o valor do imóvel antes de alterá-lo.
$mySettings.Properties
Faça quaisquer alterações nas propriedades do objeto local.
Isso altera apenas a cópia local. Para salvar as 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 Recuperando uma instância 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 obrigatório, você pode querer saber o valor do imóvel antes de alterá-lo.
foreach (CimProperty property in myDisk.CimInstanceProperties) { Console.WriteLine(property.ToString()); } Console.ReadLine();
Faça quaisquer alterações nas propriedades do objeto local.
Isso altera apenas a cópia local. Para salvar as 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 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 .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 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 obrigatório, você pode querer saber o valor do imóvel antes de alterá-lo.
foreach (PropertyData property in myDisk.Properties) { Console.WriteLine(property.Name + " " + property.Value); } Console.ReadLine();
Faça quaisquer alterações nas propriedades do objeto local.
Isso altera apenas a cópia local. Para salvar as 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 utilizando uma chamada para o método ManagementObject.Put ou.
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 obrigatório, você pode querer saber o valor do imóvel antes de alterá-lo.
Faça quaisquer 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 as 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 WMI com uma chamada aos métodos SWbemObject.Put_ ou SWbemObject.PutAsync_.
Como os nomes indicam, Put_ atualiza de forma síncrona enquanto PutAsync_ atualiza de forma assíncrona. Qualquer um dos métodos substitui a instância original pela instância modificada. No entanto, para aproveitar o processamento assíncrono, você deve criar um objeto SWbemSink. Para obter mais informações, consulte Chamando 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 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 IWbemClassObject::Get.
Embora não seja obrigatório, você pode querer saber o valor do imóvel antes de alterá-lo.
Faça as alterações necessárias no texto com uma chamada para IWbemClassObject::Put.
O método Put altera apenas a cópia local. Para salvar as alterações no WMI, você deve colocar a cópia inteira de volta no repositório WMI.
Coloque a sua cópia de volta no repositório WMI usando os métodos IWbemServices::PutInstance ou IWbemServices::PutInstanceAsync.
Como os nomes indicam, PutInstance atualiza de forma síncrona, enquanto PutInstanceAsync atualiza de forma assíncrona. Em qualquer um dos métodos, a instância original é substituída pela instância modificada. No entanto, para tirar proveito do processamento assíncrono, você deve implementar o IWbemObjectSink interface.
Você deve estar ciente de que uma operação de atualização em uma instância pertencente a uma hierarquia de classe pode não ter êxito devido a um erro envolvendo outra classe na hierarquia. O WMI chama o PutInstanceAsync método de cada um dos provedores responsáveis pelas classes das quais deriva a classe proprietária da instância original. Se algum desses provedores falhar, a solicitação de atualização original falhará. Para obter mais informações, consulte a seção Comentários de PutInstanceAsync.
Para obter mais informações, consulte Chamando um método de serviço.
Observação
Como o callback para o sink pode não ser retornado no mesmo nível de autenticação exigido pelo cliente, é recomendável usar comunicação semi-síncrona em vez de assíncrona. Para obter mais informações, consulte chamando um método.