Udostępnij za pośrednictwem


Aktualizowanie części wystąpienia

Czasami możesz chcieć zaktualizować tylko część wystąpienia. Na przykład niektóre wystąpienia mają dużą liczbę właściwości. Jeśli trzeba było zaktualizować dużą liczbę tych wystąpień, możesz zmniejszyć wydajność systemu. W związku z tym można wybrać aktualizację tylko części wystąpienia, a tym samym zmniejszyć ilość informacji, które należy wysyłać i pobierać z usługi WMI. Jednak usługa WMI, podobnie jak większość dostawców, nie obsługuje bezpośrednio operacji z częściowymi wystąpieniami. W związku z tym, jeśli napiszesz aplikację, która używa operacji na częściowych instancjach, przygotuj się na to, że wywołania mogą zakończyć się niepowodzeniem z kodem błędu WBEM_E_PROVIDER_NOT_CAPABLE lub WBEM_E_NOT_SUPPORTED w języku C++. W językach skryptowych kody błędów to wbemErrProviderNotCapable lub wbemErrNotSupported.

W przypadku wykonywania skryptów ta operacja jest niezbędna tylko do zapewnienia wydajności podczas aktualizowania jednej lub dwóch właściwości zapisywalnych w bardzo dużej liczbie obiektów w przedsiębiorstwie. W przeciwnym razie normalne wywołania języka VBScript do SWbemObject.Put_ lub SWbemObject.PutAsync_, choć wydają się zapisywać cały obiekt, w rzeczywistości aktualizują tylko te właściwości, które mają włączony zapis przez dostawcę.

Poniższa procedura opisuje sposób żądania częściowej aktualizacji instancji przy użyciu programu PowerShell.

Aby zażądać częściowej aktualizacji instancji przy użyciu programu PowerShell

  1. Pobierz ścieżkę obiektu, który chcesz zaktualizować.

    Możesz opisać ścieżkę ręcznie lub wykonać zapytanie względem obiektu, a następnie pobrać właściwość __Path.

    $myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path
    #or
    $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
    
  2. Skonfiguruj tabelę skrótów, która zawiera nazwy właściwości do zaktualizowania, i użyj tej tabeli skrótów w wywołaniu Set-WmiInstance.

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

Poniższa procedura opisuje sposób żądania aktualizacji częściowej instancji przy użyciu języka C#.

Notatka

System.Management była oryginalną przestrzenią nazw platformy .NET używaną do uzyskiwania dostępu do usługi WMI; jednak interfejsy API w tej przestrzeni nazw są ogólnie wolniejsze i nie skalują się tak dobrze w porównaniu z ich bardziej nowoczesnymi odpowiednikami z przestrzeni nazw Microsoft.Management.Infrastructure.

 

Aby zażądać częściowej aktualizacji instancji przy użyciu języka C#

  1. Utwórz nowy obiekt ManagementObject reprezentujący określone wystąpienie do zaktualizowania.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    
  2. Ustaw wartość właściwości za pomocą wywołania ManagementObject.SetPropertyValue.

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

Poniższa procedura opisuje, jak zażądać częściowej aktualizacji wystąpienia przy użyciu języka VBScript.

Aby złożyć żądanie aktualizacji części instancji przy użyciu VBScript

  1. Utwórz obiekt kontekstu SWbemNamedValueSet.

    Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
    
  2. Dodaj wartości rozszerzenia Put "__PUT_EXTENSIONS" i "__PUT_EXT_CLIENT_REQUEST" do obiektu kontekstu przy użyciu metody SWbemNamedValueSet.Add.

    objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True
    objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
    
  3. Skonfiguruj tablicę z listą nazw właściwości do zaktualizowania i dodaj tę tablicę do obiektu kontekstu SWbemNamedValueSet z wartością rozszerzenia Put "__PUT_EXT_PROPERTIES".

    arProperties = Array("propertyname1", "propertyname2") 
    objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
    
  4. Ustaw parametr iFlags w wywołaniu funkcji SWbemObject.Put_ na wbemChangeFlagUpdateOnly. Bez tej flagi wywołanie zakończy się niepowodzeniem z powodu nieprawidłowego kontekstu.

  5. Przekaż obiekt flagi i kontekstu do dostawcy w objwbemNamedValueSet parametru SWbemObject.Put_ lub SWbemObject.PutAsync_.

    call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
    

Poniższa procedura opisuje, jak zażądać częściowej aktualizacji instancji za pomocą języka C++.

Aby poprosić o aktualizację częściowej instancji przy użyciu języka C++

  1. Utwórz obiekt IWbemContext z wywołaniem CoCreateInstance.

    Obiekt kontekstu jest obiektem używanym przez usługę WMI do przekazywania dodatkowych informacji do dostawcy usługi WMI. W takim przypadku używasz obiektu IWbemContext, aby poinstruować dostawcę, aby zaakceptował aktualizacje częściowych instancji.

  2. Dodaj wartości "__PUT_EXTENSIONS" i "__PUT_EXT_CLIENT_REQUEST" do obiektu IWbemContext, używając wywołania IWbemContext::SetValue.

    W poniższej tabeli przedstawiono znaczenia "__PUT_EXTENSIONS" i "__PUT_EXT_CLIENT_REQUEST".

    Nazwana wartość Opis
    "__PUT_EXTENSIONS" VT_BOOL ustawiono na VARIANT_TRUE. Wartość wskazująca, że określono co najmniej jedną z innych wartości kontekstu. Dzięki temu można szybko sprawdzić kontekst obiektu w dostawcy, aby określić, czy są używane częściowe aktualizacje wystąpień.
    "__PUT_EXT_CLIENT_REQUEST" VT_BOOL została ustawiona na VARIANT_TRUE. Ustawiany przez klienta podczas początkowego żądania. Ta wartość służy do zapobiegania błędom ponownego stosowania.

     

  3. Dodaj __PUT_EXT_STRICT_NULLS, __PUT_EXT_PROPERTIES lub __PUT_EXT_ATOMIC w dowolnej kombinacji zgodnie z potrzebami do obiektuIWbemContext poprzez kolejne wywołanie metody IWbemContext::SetValue.

    W poniższej tabeli wymieniono znaczenie nazwanych wartości.

    Nazwana wartość Opis
    "__PUT_EXT_STRICT_NULLS" VT_BOOL ustawiono na VARIANT_TRUE. Wskazuje, że klient celowo ustawił właściwości na VT_NULL i oczekuje, że operacja zapisu zakończy się pomyślnie. Jeśli dostawca nie może ustawić wartości null, powinien zostać zgłoszony błąd.
    "__PUT_EXT_PROPERTIES" SAFEARRAY ciągów zawierających listę nazw właściwości do zaktualizowania. Może być używany samodzielnie lub w połączeniu z "__PUT_EXT_PROPERTIES". Wartości znajdują się w zapisywanym wystąpieniu.
    "__PUT_EXT_ATOMIC" VT_BOOL ustawiony na wartość VARIANT_TRUE. Wskazuje, że wszystkie aktualizacje muszą zakończyć się jednocześnie sukcesem (semantyka atomowa) lub dostawca musi wycofać zmiany. Nie można odnieść częściowego sukcesu. Może być używany samodzielnie lub w połączeniu z innymi flagami.

     

  4. Ustaw parametr iFlags na WBEM_FLAG_UPDATE_ONLY. Bez tej flagi wywołanie nie powiedzie się z powodu nieprawidłowego kontekstu.

  5. Przekaż obiekt kontekstu IWbemContext przy dowolnym wywołaniu IWbemServices::PutInstance lub IWbemServices::PutInstanceAsync w parametrze pCtx.

    Przekazanie obiektu IWbemContext instruuje dostawcę usługi, aby zezwolił na częściowe aktualizacje wystąpień. W aktualizacji pełnego wystąpienia należy ustawić pCtx na null.

    Dostawca może napisać wszelkie niezbędne właściwości, jeśli obiekt kontekstu obecny w wywołaniu nie zawiera "__PUT_EXTENSIONS". Jeśli element "__PUT_EXTENSIONS" znajduje się w obiekcie kontekstu, usługa WMI wymaga, aby dostawca przestrzegał semantyki operacji dokładnie lub inaczej nie powiodło się wywołanie. Aby uzyskać więcej informacji, zobacz Obsługa komunikatów odmowy dostępu u dostawcy.