Een gedeelte van een instantie bijwerken
Soms wilt u mogelijk slechts een deel van een exemplaar bijwerken. Sommige exemplaren hebben bijvoorbeeld een groot aantal eigenschappen. Als u een groot aantal van deze exemplaren moet bijwerken, kunt u de systeemprestaties verminderen. Daarom kunt u ervoor kiezen om slechts een deel van het exemplaar bij te werken en zo de hoeveelheid informatie te verminderen die u moet verzenden en ophalen naar en van WMI. WMI biedt echter geen rechtstreekse ondersteuning voor gedeeltelijke instantie-bewerkingen, en de meeste providers doen dat ook niet. Als u daarom een toepassing schrijft die gebruikmaakt van bewerkingen voor gedeeltelijke exemplaren, moet u voorbereid zijn op het mislukken van uw aanroepen met de WBEM_E_PROVIDER_NOT_CAPABLE of WBEM_E_NOT_SUPPORTED foutcode in C++. In scripttalen zijn de foutcodes ofwel wbemErrProviderNotCapable of wbemErrNotSupported.
Bij het uitvoeren van scripts is deze bewerking alleen nodig om prestaties te helpen bij het bijwerken van een of twee schrijfbare eigenschappen in een zeer groot aantal objecten in een onderneming. Anders zullen de normale VBScript-aanroepen naar SWbemObject.Put_ of SWbemObject.PutAsync_, hoewel ze lijken het gehele object te schrijven, eigenlijk alleen de eigenschappen bijwerken waarvoor de provider schrijftoegang heeft ingeschakeld.
In de volgende procedure wordt beschreven hoe u een gedeeltelijke exemplaar-update aanvraagt via PowerShell.
een gedeeltelijke update van het exemplaar aanvragen met behulp van PowerShell
Haal het pad op van het object dat u wilt bijwerken.
U kunt het pad handmatig beschrijven of het object opvragen en vervolgens de eigenschap __Path ophalen.
$myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path #or $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
Stel een hash-tabel in met de namen van de eigenschappen die moeten worden bijgewerkt en gebruik deze hash-tabel in een aanroep voor Set-WmiInstance-.
$newDriveName = @{VolumeName = "OSDisk"} Set-WmiInstance -Path $myWMIDrivePath -Arguments $newDriveName
In de volgende procedure wordt beschreven hoe u een gedeeltelijke update van een exemplaar in C# aanvraagt.
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 gedeeltelijke update van een instantie aanvragen met behulp van C#
Maak een nieuw ManagementObject-object dat het specifieke exemplaar vertegenwoordigt dat moet worden bijgewerkt.
using System.Management; ... ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
Stel de eigenschapswaarde in met een aanroep naar ManagementObject.SetPropertyValue.
myDisk.SetPropertyValue("VolumeName", "OSDisk");
In de volgende procedure wordt beschreven hoe u een gedeeltelijke update van een instantie aanvraagt d.m.v. VBScript.
Een gedeeltelijke update van het exemplaar aanvragen met behulp van VBScript-
Maak een SWbemNamedValueSet contextobject.
Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
Voeg de put-extensiewaarden '__PUT_EXTENSIONS' en '__PUT_EXT_CLIENT_REQUEST' toe aan het contextobject met behulp van de methode SWbemNamedValueSet.Add.
objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
Stel een matrix in met de namen van de eigenschappen die moeten worden bijgewerkt en voeg deze matrix toe aan de SWbemNamedValueSet contextobject met de put-extensiewaarde '__PUT_EXT_PROPERTIES'.
arProperties = Array("propertyname1", "propertyname2") objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
Stel de parameter iFlags van de SWbemObject.Put_-aanroep in op wbemChangeFlagUpdateOnly-. Zonder deze vlag mislukt de aanroep met een ongeldige context.
Geef uw vlag en contextobject door aan de provider in de objwbemNamedValueSet parameter van SWbemObject.Put_ of SWbemObject.PutAsync_.
call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
In de volgende procedure wordt beschreven hoe u een gedeeltelijke-instantie-update aanvraagt in C++.
Om een gedeeltelijke update van een instantie aan te vragen met behulp van C++
Maak een IWbemContext-object met een aanroep naar CoCreateInstance-.
Een contextobject is een object dat WMI gebruikt om meer informatie door te geven aan een WMI-provider. In dit geval gebruikt u het IWbemContext-object om de provider opdracht te geven om gedeeltelijke updates van exemplaren te accepteren.
Voeg de benoemde waarden '__PUT_EXTENSIONS' en '__PUT_EXT_CLIENT_REQUEST' toe aan het object IWbemContext met een aanroep naar IWbemContext::SetValue.
De volgende tabel bevat de betekenis van '__PUT_EXTENSIONS' en '__PUT_EXT_CLIENT_REQUEST'.
Benoemde waarde Beschrijving "__PUT_EXTENSIONS" VT_BOOL ingesteld op VARIANT_TRUE. Een waarde die aangeeft dat een of meer van de andere contextwaarden zijn opgegeven. Hiermee kunt u snel controleren of het contextobject binnen de provider wordt gebruikt om te bepalen of updates van gedeeltelijke exemplaren worden gebruikt. "__PUT_EXT_CLIENT_REQUEST" VT_BOOL ingesteld op VARIANT_TRUE. Ingesteld door de client tijdens de eerste aanvraag. Deze waarde wordt gebruikt om re-entrancyfouten te voorkomen. Voeg de __PUT_EXT_STRICT_NULLS, __PUT_EXT_PROPERTIES of __PUT_EXT_ATOMIC indien nodig toe aan het object IWbemContext met een andere aanroep voor IWbemContext::SetValue.
De volgende tabel bevat de betekenis van de benoemde waarden.
Benoemde waarde Beschrijving "__PUT_EXT_STRICT_NULLS" VT_BOOL ingesteld op VARIANT_TRUE. Geeft aan dat de client opzettelijk eigenschappen heeft ingesteld op VT_NULL en verwacht dat de schrijfbewerking slaagt. Als de provider de waarden niet kan instellen op NULL-, moet er een fout worden gerapporteerd. "__PUT_EXT_PROPERTIES" SAFEARRAY van tekenreeksen met een lijst van eigenschapsnamen die moeten worden bijgewerkt. Kan alleen of in combinatie met '__PUT_EXT_PROPERTIES' worden gebruikt. De waarden bevinden zich in het object dat wordt geschreven. "__PUT_EXT_ATOMIC" VT_BOOL ingesteld op VARIANT_TRUE. Geeft aan dat alle updates gelijktijdig moeten slagen (atomische semantiek) of dat de provider terug moet keren. Er kan geen gedeeltelijk succes zijn. Kan alleen of in combinatie met andere vlaggen worden gebruikt. Stel de parameter iFlags in op WBEM_FLAG_UPDATE_ONLY. Zonder deze vlag mislukt de aanroep met een ongeldige context.
Geef het contextobject IWbemContext door bij aanroepen van IWbemServices::PutInstance of IWbemServices::PutInstanceAsync in de parameter pCtx.
Het doorgeven van het IWbemContext-object geeft de provider opdracht om updates van gedeeltelijke exemplaren toe te staan. Bij een update van een volledige instantie moet u pCtx instellen op NULL.
De provider kan alle benodigde eigenschappen schrijven als het contextobject dat aanwezig is in de aanroep geen '__PUT_EXTENSIONS' bevat. Als '__PUT_EXTENSIONS' aanwezig is in het contextobject, vereist WMI dat de provider voldoet aan de semantiek van de bewerking of anders de aanroep mislukt. Zie Toegang geweigerde berichten verwerken in een providervoor meer informatie.