Delen via


Een hele instantie bijwerken

De meest voorkomende methode voor het bijwerken van een WMI-klasse-exemplaar is het bijwerken van het hele exemplaar in één keer. Door een volledig exemplaar bij te werken hoeft WMI het exemplaar niet te parseren in afzonderlijke eigenschappen en deze naar uw toepassing te verzenden. In plaats daarvan kan WMI u gewoon het hele exemplaar sturen. Wanneer u klaar bent, kan WMI vervolgens uw hele gewijzigde exemplaar over het oorspronkelijke exemplaar heen kopiëren.

In de volgende procedure wordt beschreven hoe u een exemplaar wijzigt of bijwerkt met behulp van PowerShell.

Een exemplaar wijzigen of bijwerken met behulp van PowerShell

  1. Haal een lokale kopie van het object op met een aanroep naar Get-WmiObject.

    $mySettings = get-WMIObject Win32_WmiSetting
    
  2. Bekijk indien nodig de eigenschappen van het object met een aanroep naar de verzameling Eigenschappen.

    Hoewel dit niet vereist is, wilt u mogelijk de waarde van de eigenschap weten voordat u deze wijzigt.

    $mySettings.Properties
    
  3. Breng wijzigingen aan in de eigenschappen van het lokale object.

    Als u dit doet, wordt alleen de lokale kopie gewijzigd. Als u de wijzigingen in WMI wilt opslaan, moet u de hele kopie weer in de WMI-opslagplaats plaatsen.

    $mySettings.LoggingLevel = 1
    
  4. Plaats het object weer in de WMI-opslagplaats met behulp van een aanroep naar de Put-methode.

    $mySettings.Put()
    

In de volgende procedure wordt beschreven hoe u een exemplaar wijzigt of bijwerkt met C#.

Een exemplaar wijzigen of bijwerken met behulp van C# (Microsoft.Management.Infrastructure)

  1. Haal een lokale kopie van het object op met een oproep naar CimSession.GetInstance, zoals beschreven in Het ophalen van een WMI-exemplaar.

    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. Bekijk indien nodig de eigenschappen van het object met een aanroep naar de verzameling Eigenschappen.

    Hoewel dit niet vereist is, wilt u mogelijk de waarde van de eigenschap weten voordat u deze wijzigt.

    foreach (CimProperty property in myDisk.CimInstanceProperties)
    {
       Console.WriteLine(property.ToString());
    }
    
    Console.ReadLine();
    
  3. Breng wijzigingen aan in de eigenschappen van het lokale object.

    Als u dit doet, wordt alleen de lokale kopie gewijzigd. Als u de wijzigingen in WMI wilt opslaan, moet u de hele kopie weer in de WMI-opslagplaats plaatsen.

    myDisk.CimInstanceProperties["VolumeName"].Value = "NewName";
    
  4. Plaats het object weer in de WMI-opslagplaats met behulp van een aanroep naar CimSession.ModifyInstance.

    session.ModifyInstance(Namespace,myDisk);
    

In de volgende procedure wordt beschreven hoe u een exemplaar wijzigt of bijwerkt met behulp van PowerShell.

Notitie

System.Management was de oorspronkelijke .NET-naamruimte die wordt gebruikt voor toegang tot WMI; De API's in deze naamruimte zijn over het algemeen echter langzamer en worden niet zo goed geschaald ten opzichte van hun modernere Microsoft.Management.Infrastructure tegenhangers.

 

Een exemplaar wijzigen of bijwerken met behulp van C# (Microsoft.Management)

  1. Haal een lokale kopie van het object op met een aanroep naar ManagementObject.Get.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    myDisk.Get();
    
  2. Bekijk indien nodig de eigenschappen van het object met een aanroep naar de verzameling Eigenschappen.

    Hoewel dit niet vereist is, wilt u mogelijk de waarde van de eigenschap weten voordat u deze wijzigt.

    foreach (PropertyData property in myDisk.Properties)
    {
       Console.WriteLine(property.Name + " " + property.Value);
    }
    
    Console.ReadLine();
    
  3. Breng wijzigingen aan in de eigenschappen van het lokale object.

    Als u dit doet, wordt alleen de lokale kopie gewijzigd. Als u de wijzigingen in WMI wilt opslaan, moet u de hele kopie weer in de WMI-opslagplaats plaatsen.

    myDisk["VolumeName"] = "newName";
    
  4. Plaats het object weer in de WMI-opslagplaats met behulp van een aanroep naar de ManagementObject.Put of methode.

    myDisk.Put();
    

In de volgende procedure wordt beschreven hoe u een exemplaar wijzigt of bijwerkt met behulp van VBScript.

Een exemplaar wijzigen of bijwerken met behulp van VBScript-

  1. Haal een lokale kopie van het object op met een aanroep naar GetObject-.

  2. Bekijk indien nodig de eigenschappen van het object met een aanroep naar de methode Properties_.

    Hoewel dit niet vereist is, wilt u mogelijk de waarde van de eigenschap weten voordat u deze wijzigt.

  3. Breng wijzigingen aan in de objecteigenschappen met een aanroep naar de methode SWbemProperty.Value.

    De methode Waarde wijzigt alleen de lokale kopie. Als u de wijzigingen in WMI wilt opslaan, moet u de hele kopie weer in de WMI-opslagplaats plaatsen.

  4. Plaats het object weer in de WMI-opslagplaats met een aanroep van de SWbemObject.Put_ of SWbemObject.PutAsync_ methoden.

Zoals de namen doen vermoeden, worden Put_ updates synchroon bijgewerkt, terwijl PutAsync_ asynchroon wordt bijgewerkt. Met beide methoden kopieert u het oorspronkelijke exemplaar met uw gewijzigde exemplaar. Als u echter wilt profiteren van asynchrone verwerking, moet u een SWbemSink object maken. Zie Een methode aanroepenvoor meer informatie.

In de volgende procedure wordt beschreven hoe u een exemplaar wijzigt of bijwerkt met behulp van C++.

Een exemplaar wijzigen of bijwerken met behulp van C++

  1. Haal een lokale kopie van het exemplaar op met een aanroep naar IWbemServices::GetObject of IWbemServices::GetObjectAsync.

  2. Bekijk indien nodig de eigenschappen van het object met een aanroep naar IWbemClassObject::Get.

    Hoewel dit niet vereist is, wilt u mogelijk de waarde van de eigenschap weten voordat u deze wijzigt.

  3. Breng de benodigde wijzigingen aan in de tekst met een aanroep naar IWbemClassObject::Put.

    De methode Put wijzigt alleen de lokale kopie. Als u de wijzigingen in WMI wilt opslaan, moet u de hele kopie weer in de WMI-opslagplaats plaatsen.

  4. Plaats uw kopie terug in de WMI-opslagplaats met een aanroep van de IWbemServices::PutInstance of IWbemServices::PutInstanceAsync methoden.

    Zoals de namen impliceren, wordt PutInstance synchroon bijgewerkt, terwijl PutInstanceAsync asynchroon wordt bijgewerkt. Met beide methoden kopieert u het oorspronkelijke exemplaar met uw gewijzigde exemplaar. Als u echter wilt profiteren van asynchrone verwerking, moet u de IWbemObjectSink interface implementeren.

    U moet er rekening mee houden dat een updatebewerking voor een exemplaar dat deel uitmaakt van een klassehiërarchie mogelijk niet slaagt vanwege een fout met een andere klasse in de hiërarchie. WMI roept de PutInstanceAsync-methode aan van elk van de providers die verantwoordelijk zijn voor de klassen waaruit de klasse die de oorspronkelijke instantie bezit, is afgeleid. Als een van deze providers mislukt, mislukt de oorspronkelijke updateaanvraag. Zie de sectie Opmerkingen van PutInstanceAsyncvoor meer informatie.

Zie Een providermethode aanroepenvoor meer informatie.

Notitie

Omdat de callback naar de sink mogelijk niet op hetzelfde verificatieniveau wordt geretourneerd als de client vereist, wordt u aangeraden semisynchroon te gebruiken in plaats van asynchrone communicatie. Zie Een methode aanroepenvoor meer informatie.