Обновление части экземпляра

Иногда может потребоваться обновить только часть экземпляра. Например, некоторые экземпляры имеют большое количество свойств. Если потребуется обновить большое количество таких экземпляров, производительность системы может снизиться. Таким образом, можно обновить только часть экземпляра и тем самым сократить объем данных, которые необходимо отправлять и извлекать в WMI и из нее. Однако WMI не поддерживает операции с частичными экземплярами напрямую, как и большинство поставщиков. Поэтому при написании приложения, использующего операции с частичным экземпляром, будьте готовы к сбою вызовов с кодом ошибки WBEM_E_PROVIDER_NOT_CAPABLE или WBEM_E_NOT_SUPPORTED в C++. В языках сценариев кодами ошибок являются wbemErrProviderNotCapable или wbemErrNotSupported.

В скриптах эта операция необходима только для повышения производительности при обновлении одного или двух доступных для записи свойств в очень большом количестве объектов на предприятии. В противном случае обычные вызовы VBScript для SWbemObject.Put_ или SWbemObject.PutAsync_, хотя, казалось бы, записывают весь объект, фактически обновляют только свойства, которые поставщик поддерживает запись.

В следующей процедуре описывается, как запросить обновление частичного экземпляра с помощью PowerShell.

Запрос частичного обновления экземпляра с помощью PowerShell

  1. Получите путь к объекту, который требуется обновить.

    Путь можно описать вручную или запросить объект, а затем получить свойство __Path .

    $myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path
    #or
    $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
    
  2. Настройте хэш-таблицу с именами обновляемых свойств и используйте эту хэш-таблицу в вызове Метода Set-WmiInstance.

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

В следующей процедуре описывается, как запросить обновление частичного экземпляра с помощью C#.

Примечание

System.Management — это исходное пространство имен .NET, используемое для доступа к WMI; Однако API-интерфейсы в этом пространстве имен обычно работают медленнее и не масштабируются по сравнению с более современными аналогами Microsoft.Management.Infrastructure .

 

Запрос частичного обновления экземпляра с помощью C #

  1. Создайте новый объект ManagementObject , представляющий конкретный обновляемый экземпляр.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    
  2. Задайте значение свойства с помощью вызова ManagementObject.SetPropertyValue.

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

В следующей процедуре описывается, как запросить обновление частичного экземпляра с помощью VBScript.

Запрос частичного обновления экземпляра с помощью VBScript

  1. Создайте объект контекста SWbemNamedValueSet .

    Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
    
  2. Добавьте значения расширения Put "__PUT_EXTENSIONS" и "__PUT_EXT_CLIENT_REQUEST" в объект контекста с помощью метода SWbemNamedValueSet.Add .

    objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True
    objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
    
  3. Настройте массив со списком имен обновляемых свойств и добавьте этот массив в объект контекста SWbemNamedValueSet со значением расширения Put "__PUT_EXT_PROPERTIES".

    arProperties = Array("propertyname1", "propertyname2") 
    objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
    
  4. Задайте параметр iFlags вызова SWbemObject.Put_wbemChangeFlagUpdateOnly. Без этого флага вызов завершится ошибкой с недопустимым контекстом.

  5. Передайте объект флага и контекста поставщику в параметре objwbemNamedValueSetSWbemObject.Put_ или SWbemObject.PutAsync_.

    call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
    

В следующей процедуре описывается, как запросить обновление частичного экземпляра с помощью C++.

Запрос частичного обновления экземпляра с помощью C++

  1. Создайте объект IWbemContext с помощью вызова CoCreateInstance.

    Объект контекста — это объект, который WMI использует для передачи дополнительных сведений поставщику WMI. В этом случае вы используете объект IWbemContext , чтобы указать поставщику принять обновления частичного экземпляра.

  2. Добавьте именованные значения "__PUT_EXTENSIONS" и "__PUT_EXT_CLIENT_REQUEST" в объект IWbemContext с помощью вызова IWbemContext::SetValue.

    В следующей таблице перечислены значения "__PUT_EXTENSIONS" и "__PUT_EXT_CLIENT_REQUEST".

    Именованное значение Описание
    "__PUT_EXTENSIONS" VT_BOOL задано значение VARIANT_TRUE. Значение , указывающее, что задано одно или несколько других значений контекста. Это позволяет быстро проверка объекта контекста внутри поставщика, чтобы определить, используются ли обновления частичного экземпляра.
    "__PUT_EXT_CLIENT_REQUEST" VT_BOOL задано значение VARIANT_TRUE. Устанавливается клиентом во время первоначального запроса. Это значение используется для предотвращения ошибок повторного входа.

     

  3. Добавьте __PUT_EXT_STRICT_NULLS, __PUT_EXT_PROPERTIES или __PUT_EXT_ATOMIC в любом сочетании в объект IWbemContext с помощью другого вызова IWbemContext::SetValue.

    В следующей таблице перечислены значения именованных значений.

    Именованное значение Описание
    "__PUT_EXT_STRICT_NULLS" VT_BOOL задано значение VARIANT_TRUE. Указывает, что клиент намеренно задал свойствам значение VT_NULL и ожидает успешного выполнения операции записи. Если поставщик не может задать значения NULL, следует сообщить об ошибке.
    "__PUT_EXT_PROPERTIES" SAFEARRAY строк, содержащих список имен свойств, которые необходимо обновить. Может использоваться отдельно или в сочетании с "__PUT_EXT_PROPERTIES". Значения находятся в записываемом экземпляре.
    "__PUT_EXT_ATOMIC" VT_BOOL задано значение VARIANT_TRUE. Указывает, что все обновления должны выполняться одновременно (атомарная семантика) или поставщик должен отменить изменения обратно. Частичного успеха не может быть. Может использоваться отдельно или в сочетании с другими флагами.

     

  4. Задайте для параметра iFlagsзначение WBEM_FLAG_UPDATE_ONLY. Без этого флага вызов завершится ошибкой с недопустимым контекстом.

  5. Передайте объект контекста IWbemContext во все вызовы IWbemServices::P utInstance или IWbemServices::P utInstanceAsync в параметре pCtx .

    Передача объекта IWbemContext указывает поставщику разрешить обновления частичного экземпляра. При обновлении полного экземпляра pCtx следует задать значение NULL.

    Поставщик может записать все необходимые свойства, если объект контекста, присутствующий в вызове, не содержит "__PUT_EXTENSIONS". Если в объекте контекста присутствует "__PUT_EXTENSIONS", WMI требует, чтобы поставщик либо подчинялся семантике операции в точности, либо не выполнял вызов. Дополнительные сведения см. в разделе Обработка сообщений об отказе в доступе в поставщике.