Teilen über


Aktualisieren eines Teils einer Instanz

Gelegentlich müssen Sie vielleicht nur einen Teil einer Instanz aktualisieren. Einige Instanzen verfügen beispielsweise über eine große Anzahl von Eigenschaften. Wenn Sie eine große Anzahl dieser Instanzen aktualisieren müssten, könnte das die Systemleistung reduzieren. Daher können Sie nur einen Teil der Instanz aktualisieren und so die Informationsmenge reduzieren, die Sie an WMI senden und aus WMI abrufen müssen. WMI unterstützt jedoch Vorgänge, die einen Teil der Instanz betreffen, nicht direkt, ebenso wenig wie die meisten Anbieter. Wenn Sie eine Anwendung schreiben, die Vorgänge verwendet, die nur einen Teil der Instanz betreffen, sollten Sie daher darauf vorbereitet sein, dass Ihre Aufrufe in C++ mit dem Fehlercode WBEM_E_PROVIDER_NOT_CAPABLE oder WBEM_E_NOT_SUPPORTED fehlschlagen. In Skriptsprachen lauten die Fehlercodes wbemErrProviderNotCapable oder wbemErrNotSupported.

Bei der Skripterstellung ist dieser Vorgang nur erforderlich, um die Leistung beim Aktualisieren von ein oder zwei schreibbaren Eigenschaften bei einer sehr großen Anzahl von Objekten in einem Unternehmen zu unterstützen. Andernfalls aktualisieren die normalen VBScript-Aufrufe von SWbemObject.Put_ oder SWbemObject.PutAsync_ tatsächlich nur die Eigenschaften, für die der Anbieter Schreibzugriff aktiviert hat, auch wenn sie anscheinend das gesamte Objekt schreiben.

Im folgenden Verfahren wird beschrieben, wie Sie mit PowerShell ein partielles Instanzupdate anfordern.

So fordern Sie ein partielles Instanzupdate mit PowerShell an

  1. Rufen Sie den Pfad zu dem Objekt ab, das Sie aktualisieren möchten.

    Sie können den Pfad entweder manuell beschreiben oder das Objekt abfragen und dann die Eigenschaft __Path abrufen.

    $myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path
    #or
    $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
    
  2. Erstellen Sie eine Hashtabelle, in der die Namen der zu aktualisierenden Eigenschaften aufgeführt sind, und verwenden Sie diese Hashtabelle in einem Aufruf von Set-WmiInstance.

    $newDriveName = @{VolumeName = "OSDisk"}
    Set-WmiInstance -Path $myWMIDrivePath -Arguments $newDriveName
    

Im folgenden Verfahren wird beschrieben, wie Sie mit C# ein partielles Instanzupdate anfordern.

Hinweis

System.Management war der ursprüngliche .NET-Namespace, der für den Zugriff auf WMI verwendet wurde. Die APIs in diesem Namespace sind jedoch im Allgemeinen langsamer und skalieren im Vergleich zu ihren moderneren Microsoft.Management.Infrastructure-Entsprechungen nicht so gut.

 

So fordern Sie ein partielles Instanzupdate mit C# an

  1. Erstellen Sie ein neues ManagementObject-Objekt, das die spezielle, zu aktualisierende Instanz darstellt.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    
  2. Legen Sie den Eigenschaftswert mit einem Aufruf von ManagementObject.SetPropertyValue fest.

    myDisk.SetPropertyValue("VolumeName", "OSDisk");
    

Im folgenden Verfahren wird beschrieben, wie Sie mit VBScript ein partielles Instanzupdate anfordern.

So fordern Sie ein partielles Instanzupdate mit VBScript an

  1. Erstellen Sie ein SWbemNamedValueSet-Kontextobjekt.

    Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
    
  2. Fügen Sie dem Kontextobjekt mit der SWbemNamedValueSet.Add-Methode die Put-Erweiterungswerte „__PUT_EXTENSIONS“ und „__PUT_EXT_CLIENT_REQUEST“ hinzu.

    objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True
    objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
    
  3. Erstellen Sie ein Array, in dem die Namen der zu aktualisierenden Eigenschaften aufgelistet werden, und fügen Sie dieses Array mit dem Put-Erweiterungswert „__PUT_EXT_PROPERTIES“ dem SWbemNamedValueSet-Kontextobjekt hinzu.

    arProperties = Array("propertyname1", "propertyname2") 
    objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
    
  4. Legen Sie den Parameter iFlags des Aufrufs von SWbemObject.Put_ auf wbemChangeFlagUpdateOnly fest. Ohne dieses Flag schlägt der Aufruf mit einem ungültigen Kontext fehl.

  5. Übergeben Sie Ihr Flag und Kontextobjekt im Parameter objwbemNamedValueSet von SWbemObject.Put_ oder SWbemObject.PutAsync_ an den Anbieter.

    call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
    

Im folgenden Verfahren wird beschrieben, wie Sie mit C++ ein partielles Instanzupdate anfordern.

So fordern Sie ein partielles Instanzupdate mit C++ an

  1. Erstellen Sie mit einem Aufruf von CoCreateInstance ein IWbemContext-Objekt.

    Ein Kontextobjekt ist ein Objekt, das von WMI verwendet wird, um weitere Informationen an einen WMI-Anbieter zu übergeben. In diesem Fall verwenden Sie das IWbemContext-Objekt, um den Anbieter anzuweisen, partielle Instanzupdates zu akzeptieren.

  2. Fügen Sie dem IWbemContext-Objekt mit einem Aufruf von IWbemContext::SetValue die benannten Werte „__PUT_EXTENSIONS“ und „__PUT_EXT_CLIENT_REQUEST“ hinzu.

    Die folgende Tabelle enthält die Bedeutung von „__PUT_EXTENSIONS“ und „__PUT_EXT_CLIENT_REQUEST“.

    Benannter Wert BESCHREIBUNG
    "__PUT_EXTENSIONS" VT_BOOL auf VARIANT_TRUE festgelegt. Ein Wert, der angibt, dass einer oder mehrere der anderen Kontextwerte angegeben wurde. Dies ermöglicht eine schnelle Überprüfung des Kontextobjekts innerhalb des Anbieters, um festzustellen, ob partielle Instanzupdates verwendet werden.
    "__PUT_EXT_CLIENT_REQUEST" VT_BOOL auf VARIANT_TRUE festgelegt. Wird vom Client während der ersten Anforderung festgelegt. Dieser Wert wird verwendet, um Eingabevarianzfehler zu verhindern.

     

  3. Fügen Sie dem IWbemContext-Objekt mit einem weiteren Aufruf von IWbemContext::SetValue die Werte „__PUT_EXT_STRICT_NULLS“, „__PUT_EXT_PROPERTIES“ oder „__PUT_EXT_ATOMIC“ nach Bedarf in beliebiger Kombination hinzu.

    Die folgende Tabelle enthält die Bedeutung der benannten Werte.

    Benannter Wert BESCHREIBUNG
    "__PUT_EXT_STRICT_NULLS" VT_BOOL auf VARIANT_TRUE festgelegt. Gibt an, dass der Client absichtlich Eigenschaften auf VT_NULL festgelegt hat und erwartet, dass der Schreibvorgang erfolgreich ist. Wenn der Anbieter die Werte nicht auf NULL festlegen kann, sollte ein Fehler gemeldet werden.
    "__PUT_EXT_PROPERTIES" SAFEARRAY mit Zeichenfolgen, die eine Liste der zu aktualisierenden Eigenschaftennamen enthalten. Kann allein oder in Kombination mit „__PUT_EXT_PROPERTIES“ verwendet werden. Die Werte befinden sich in der Instanz, die geschrieben wird.
    "__PUT_EXT_ATOMIC" VT_BOOL auf VARIANT_TRUE festgelegt. Gibt an, dass alle Updates gleichzeitig erfolgreich sein müssen (atomare Semantik) oder der Anbieter den Vorgang rückgängig machen muss. Ein Teilerfolg ist nicht zulässig. Kann allein oder in Kombination mit anderen Flags verwendet werden.

     

  4. Legen Sie den Parameter iFlags auf WBEM_FLAG_UPDATE_ONLY fest. Ohne dieses Flag schlägt der Aufruf mit einem ungültigen Kontext fehl.

  5. Übergeben Sie das IWbemContext-Kontextobjekt an alle Aufrufe IWbemServices::PutInstance oder IWbemServices::PutInstanceAsync im Parameter pCtx.

    Durch Übergeben des IWbemContext-Objekts wird der Anbieter angewiesen, partielle Instanzupdates zuzulassen. Bei einem vollständigen Instanzupdate würden Sie pCtx auf NULL festlegen.

    Der Anbieter kann alle erforderlichen Eigenschaften schreiben, wenn das im Aufruf vorhandene Kontextobjekt den Wert „__PUT_EXTENSIONS“ nicht enthält. Wenn „__PUT_EXTENSIONS“ im Kontextobjekt vorhanden ist, verlangt WMI vom Anbieter, dass er die Semantik des Vorgangs genau befolgt. Ansonsten schlägt der Aufruf fehl. Weitere Informationen finden Sie unter Behandeln von Zugriffsverweigerungsnachrichten in einem Anbieter.