Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Иногда может потребоваться обновить только часть экземпляра. Например, некоторые экземпляры имеют большое количество свойств. Если вам пришлось обновить большое количество этих экземпляров, можно снизить производительность системы. Таким образом, вы можете обновить только часть объекта и тем самым уменьшить объем информации, которую необходимо передавать и получать из WMI. Однако WMI напрямую не поддерживает операции с частичными экземплярами, так же, как и большинство поставщиков. Таким образом, если вы пишете приложение, использующее операции частичного экземпляра, будьте готовы к тому, что ваши вызовы могут завершиться сбоем с кодом ошибки WBEM_E_PROVIDER_NOT_CAPABLE или WBEM_E_NOT_SUPPORTED в C++. На языках сценариев коды ошибок это либо wbemErrProviderNotCapable, либо wbemErrNotSupported.
В скриптах эта операция необходима только для повышения производительности при обновлении одного или двух записываемых свойств в очень большом количестве объектов на предприятии. В противном случае обычные вызовы VBScript к SWbemObject.Put_ или SWbemObject.PutAsync_, хотя вроде бы записывают весь объект, фактически обновляют только те свойства, для которых у поставщика разрешена запись.
В следующей процедуре описывается, как запросить обновление частичного экземпляра с помощью PowerShell.
Чтобы запросить обновление частичного экземпляра с помощью PowerShell
Найдите путь к объекту, который вы хотите обновить.
Можно описать путь вручную или запросить объект, а затем получить свойство __Path.
$myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path #or $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"Настройте хэш-таблицу с именами обновляемых свойств и используйте эту хэш-таблицу в вызове Set-WmiInstance.
$newDriveName = @{VolumeName = "OSDisk"} Set-WmiInstance -Path $myWMIDrivePath -Arguments $newDriveName
В следующей процедуре описывается, как запросить обновление частичного экземпляра с помощью C#.
Заметка
System.Management — исходное пространство имен .NET, использовавшееся для доступа к WMI; однако API в этом пространстве имен обычно работают медленнее и не масштабируются так хорошо по сравнению с более современными Microsoft.Management.Infrastructure аналогами.
Запрос на обновление частичного экземпляра с помощью C#
Создайте объект ManagementObject, который представляет собой конкретный экземпляр для обновления.
using System.Management; ... ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");Задайте значение свойства с вызовом ManagementObject.SetPropertyValue.
myDisk.SetPropertyValue("VolumeName", "OSDisk");
В следующей процедуре описывается, как запросить обновление частичного экземпляра с помощью VBScript.
Запрос обновления частичного экземпляра с помощью VBScript
Создайте объект контекста SWbemNamedValueSet.
Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")Добавьте значения расширения Put "__PUT_EXTENSIONS" и "__PUT_EXT_CLIENT_REQUEST" в объект контекста с помощью метода SWbemNamedValueSet.Add.
objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", TrueНастройте массив, в котором перечислены имена свойств, которые необходимо обновить, и добавьте этот массив в объект контекста SWbemNamedValueSet со значением расширения Put "__PUT_EXT_PROPERTIES".
arProperties = Array("propertyname1", "propertyname2") objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arPropertiesЗадайте параметр iFlags вызова SWbemObject.Put_wbemChangeFlagUpdateOnly. Без этого флага вызов завершится ошибкой с недопустимым контекстом.
Передайте флаг и объект контекста поставщику в параметре objwbemNamedValueSet либо SWbemObject.Put_, либо SWbemObject.PutAsync_.
call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
В следующей процедуре описывается, как запросить обновление частичного экземпляра с помощью C++.
Запрос на обновление частичного экземпляра с помощью C++
Создайте объектIWbemContext с вызовом CoCreateInstance.
Объект контекста — это объект, который WMI использует для передачи дополнительных сведений поставщику WMI. В этом случае вы используете объект IWbemContext, чтобы указать поставщику принять обновления частичного экземпляра.
Добавьте именованные значения "__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. Устанавливается клиентом во время первоначального запроса. Это значение используется для предотвращения ошибок повторного входа. Добавьте __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. Указывает, что все обновления должны выполняться одновременно (атомарная семантика) или поставщик должен вернуться. Не может быть частичного успеха. Может использоваться отдельно или в сочетании с другими флагами. Установите параметр iFlags на значение WBEM_FLAG_UPDATE_ONLY. Без этого флага вызов завершится ошибкой с недопустимым контекстом.
Передайте объект контекста IWbemContext в любые вызовы IWbemServices::PutInstance или IWbemServices::PutInstanceAsync в параметре pCtx.
Передача объекта IWbemContext указывает поставщику разрешить обновление частичных экземпляров. В полном обновлении экземпляра вы должны установить pCtx в NULL.
Поставщик может записывать любые необходимые свойства, если объект контекста, присутствующий в вызове, не содержит "__PUT_EXTENSIONS". Если "__PUT_EXTENSIONS" присутствует в объекте контекста, WMI требует, чтобы поставщик либо точно соответствовал семантике операции, либо иначе вызов завершится неудачей. Дополнительные сведения см. в разделе "Обработка сообщений об отказе в доступе" у поставщика.