Обновление всего экземпляра
Наиболее распространенным способом обновления экземпляра класса WMI является обновление всего экземпляра одновременно. При обновлении всего экземпляра WMI не нужно анализировать экземпляр в отдельные свойства и отправлять их в приложение. Вместо этого WMI может просто отправить вам весь экземпляр. По завершении WMI сможет скопировать весь измененный экземпляр на исходный экземпляр.
В следующей процедуре описывается изменение или обновление экземпляра с помощью PowerShell.
Изменение или обновление экземпляра с помощью PowerShell
Получите локальную копию объекта с помощью вызова Get-WmiObject.
$mySettings = get-WMIObject Win32_WmiSetting
При необходимости просмотрите свойства объекта с помощью вызова коллекции Properties.
Хотя это не обязательно, вы можете узнать значение свойства перед его изменением.
$mySettings.Properties
Внесите любые изменения в свойства локального объекта.
При этом изменяется только локальная копия. Чтобы сохранить изменения в WMI, необходимо поместить всю копию обратно в репозиторий WMI.
$mySettings.LoggingLevel = 1
Поместите объект обратно в репозиторий WMI с помощью вызова метода Put.
$mySettings.Put()
В следующей процедуре описывается изменение или обновление экземпляра с помощью C#.
Изменение или обновление экземпляра с помощью C# (Microsoft.Management.Infrastructure)
Получите локальную копию объекта с помощью вызова CimSession.GetInstance, как описано в разделе Извлечение экземпляра WMI.
using Microsoft.Management.Infrastructure; ... string Namespace = @"root\cimv2"; string className = "win32_logicalDisk"; CimInstance diskDrive = new CimInstance(className, Namespace); diskDrive.CimInstanceProperties.Add(CimProperty.Create("DeviceID", "C:", CimFlags.Key)); CimSession session = CimSession.Create("localhost"); CimInstance myDisk = session.GetInstance(Namespace, diskDrive);
При необходимости просмотрите свойства объекта с помощью вызова коллекции Properties.
Хотя это не обязательно, вы можете узнать значение свойства перед его изменением.
foreach (CimProperty property in myDisk.CimInstanceProperties) { Console.WriteLine(property.ToString()); } Console.ReadLine();
Внесите любые изменения в свойства локального объекта.
При этом изменяется только локальная копия. Чтобы сохранить изменения в WMI, необходимо поместить всю копию обратно в репозиторий WMI.
myDisk.CimInstanceProperties["VolumeName"].Value = "NewName";
Поместите объект обратно в репозиторий WMI с помощью вызова CimSession.ModifyInstance.
session.ModifyInstance(Namespace,myDisk);
В следующей процедуре описывается изменение или обновление экземпляра с помощью PowerShell.
Примечание
System.Management — это исходное пространство имен .NET, используемое для доступа к WMI; Однако API-интерфейсы в этом пространстве имен обычно работают медленнее и не масштабируются по сравнению с более современными аналогами Microsoft.Management.Infrastructure .
Изменение или обновление экземпляра с помощью C# (Microsoft.Management)
Получите локальную копию объекта с помощью вызова ManagementObject.Get.
using System.Management; ... ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'"); myDisk.Get();
При необходимости просмотрите свойства объекта с помощью вызова коллекции Properties.
Хотя это не обязательно, вы можете узнать значение свойства перед его изменением.
foreach (PropertyData property in myDisk.Properties) { Console.WriteLine(property.Name + " " + property.Value); } Console.ReadLine();
Внесите любые изменения в свойства локального объекта.
При этом изменяется только локальная копия. Чтобы сохранить изменения в WMI, необходимо поместить всю копию обратно в репозиторий WMI.
myDisk["VolumeName"] = "newName";
Поместите объект обратно в репозиторий WMI с помощью вызова метода ManagementObject.Put или .
myDisk.Put();
В следующей процедуре описывается изменение или обновление экземпляра с помощью VBScript.
Изменение или обновление экземпляра с помощью VBScript
Получите локальную копию объекта с помощью вызова GetObject.
При необходимости просмотрите свойства объекта с помощью вызова метода Properties_ .
Хотя это не обязательно, вы можете узнать значение свойства перед его изменением.
Внесите любые изменения в свойства объекта с помощью вызова метода SWbemProperty.Value .
Метод Value изменяет только локальную копию. Чтобы сохранить изменения в WMI, необходимо поместить всю копию обратно в репозиторий WMI.
Поместите объект обратно в репозиторий WMI с помощью вызова методов SWbemObject.Put_ или SWbemObject.PutAsync_ .
Как следует из названий, Put_ синхронно, а PutAsync_ обновления асинхронно. Любой из методов копирует исходный экземпляр с измененным экземпляром. Однако, чтобы воспользоваться преимуществами асинхронной обработки, необходимо создать объект SWbemSink . Дополнительные сведения см. в разделе Вызов метода .
В следующей процедуре описывается изменение или обновление экземпляра с помощью C++.
Изменение или обновление экземпляра с помощью C++
Получите локальную копию экземпляра с помощью вызова IWbemServices::GetObject или IWbemServices::GetObjectAsync.
При необходимости просмотрите свойства объекта с помощью вызова IWbemClassObject::Get.
Хотя это не обязательно, вы можете узнать значение свойства перед его изменением.
Внесите необходимые изменения в копию с помощью вызова IWbemClassObject::P ut.
Метод Put изменяет только локальную копию. Чтобы сохранить изменения в WMI, необходимо поместить всю копию обратно в репозиторий WMI.
Поместите копию обратно в репозиторий WMI с помощью вызова методов IWbemServices::P utInstance или IWbemServices::P utInstanceAsync .
Как следует из названий, PutInstance обновляется синхронно, а PutInstanceAsync — асинхронно. Любой из методов копирует исходный экземпляр с измененным экземпляром. Однако, чтобы воспользоваться преимуществами асинхронной обработки, необходимо реализовать интерфейс IWbemObjectSink .
Следует помнить, что операция обновления экземпляра, принадлежащего иерархии классов, может не завершиться из-за ошибки, связанной с другим классом в иерархии. WMI вызывает метод PutInstanceAsync каждого из поставщиков, отвечающих за классы, от которых наследуется класс, владеющий исходным экземпляром. Если какой-либо из этих поставщиков завершается ошибкой, исходный запрос на обновление завершается ошибкой. Дополнительные сведения см. в разделе Примечания статьи PutInstanceAsync.
Дополнительные сведения см. в разделе Вызов метода поставщика.
Примечание
Так как обратный вызов в приемник может быть возвращен не на том же уровне проверки подлинности, который требуется клиенту, рекомендуется использовать полусинхронный режим вместо асинхронного взаимодействия. Дополнительные сведения см. в разделе Вызов метода .