Поделиться через


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

Наиболее распространенным средством обновления экземпляра класса WMI является обновление всего экземпляра одновременно. Обновив весь экземпляр, WMI не придётся разбирать экземпляр на отдельные свойства и отправлять их в ваше приложение. Вместо этого WMI может просто отправить весь экземпляр. После завершения WMI может скопировать весь измененный экземпляр на место исходного экземпляра.

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

Модификация или обновление экземпляра с помощью PowerShell

  1. Получите локальную копию объекта с вызовом Get-WmiObject.

    $mySettings = get-WMIObject Win32_WmiSetting
    
  2. При необходимости просмотрите свойства объекта с вызовом коллекции Properties.

    Хотя это не обязательно, вы можете знать значение свойства перед его изменением.

    $mySettings.Properties
    
  3. Внесите изменения в свойства локального объекта.

    Это изменяет только локальную копию. Чтобы сохранить изменения в WMI, необходимо поместить всю копию обратно в репозиторий WMI.

    $mySettings.LoggingLevel = 1
    
  4. Поместите объект обратно в репозиторий WMI с помощью вызова метода Put.

    $mySettings.Put()
    

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

Изменение или обновление экземпляра с помощью C# (Microsoft.Management.Infrastructure)

  1. Получение локальной копии объекта с использованием вызова 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);
    
  2. При необходимости просмотрите свойства объекта с вызовом коллекции Properties.

    Хотя это не обязательно, вы можете знать значение свойства перед его изменением.

    foreach (CimProperty property in myDisk.CimInstanceProperties)
    {
       Console.WriteLine(property.ToString());
    }
    
    Console.ReadLine();
    
  3. Внесите изменения в свойства локального объекта.

    Это изменяет только локальную копию. Чтобы сохранить изменения в WMI, необходимо поместить всю копию обратно в репозиторий WMI.

    myDisk.CimInstanceProperties["VolumeName"].Value = "NewName";
    
  4. Поместите объект обратно в репозиторий WMI с помощью вызова CimSession.ModifyInstance.

    session.ModifyInstance(Namespace,myDisk);
    

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

Заметка

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

 

Чтобы изменить или обновить экземпляр с помощью C# (Microsoft.Management)

  1. Получите локальную копию объекта с вызовом ManagementObject.Get.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    myDisk.Get();
    
  2. При необходимости просмотрите свойства объекта с вызовом коллекции Properties.

    Хотя это не обязательно, вы можете знать значение свойства перед его изменением.

    foreach (PropertyData property in myDisk.Properties)
    {
       Console.WriteLine(property.Name + " " + property.Value);
    }
    
    Console.ReadLine();
    
  3. Внесите изменения в свойства локального объекта.

    Это изменяет только локальную копию. Чтобы сохранить изменения в WMI, необходимо поместить всю копию обратно в репозиторий WMI.

    myDisk["VolumeName"] = "newName";
    
  4. Поместите объект обратно в репозиторий WMI с помощью вызова ManagementObject.Put или метода.

    myDisk.Put();
    

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

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

  1. Получите локальную копию объекта с вызовом GetObject.

  2. При необходимости просмотрите свойства объекта с вызовом метода Properties_.

    Хотя это не обязательно, вы можете знать значение свойства перед его изменением.

  3. Внесите изменения в свойства объекта с вызовом метода SWbemProperty. Value.

    Метод Value изменяет только локальную копию. Чтобы сохранить изменения в WMI, необходимо поместить всю копию обратно в репозиторий WMI.

  4. Поместите объект обратно в репозиторий WMI с вызовом методов SWbemObject.Put_ или SWbemObject.PutAsync_.

Как следует из названий, Put_ обновляется синхронно, а PutAsync_ обновляется асинхронно. Каждый из методов заменяет исходный экземпляр на ваш измененный экземпляр. Однако для использования асинхронной обработки необходимо создать объект SWbemSink. Дополнительные сведения см. в разделе Вызов метода.

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

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

  1. Получите локальную копию экземпляра с вызовом IWbemServices::GetObject или IWbemServices::GetObjectAsync.

  2. При необходимости просмотрите свойства объекта с вызовом IWbemClassObject::Get.

    Хотя это не обязательно, вы можете знать значение свойства перед его изменением.

  3. Внесите необходимые изменения в копию с вызовом IWbemClassObject::Put.

    Метод Put изменяет только локальную копию. Чтобы сохранить изменения в WMI, необходимо поместить всю копию обратно в репозиторий WMI.

  4. Поместите копию обратно в репозиторий WMI с вызовом методов IWbemServices::PutInstance или IWbemServices::PutInstanceAsync.

    Как подразумевают имена, PutInstance синхронно обновляется в то время как PutInstanceAsync асинхронно обновляется. Метод копирует изменённый экземпляр поверх исходного экземпляра. Однако для использования асинхронной обработки необходимо реализовать интерфейс IWbemObjectSink.

    Следует учитывать, что операция обновления в экземпляре, принадлежащем иерархии классов, может не произойти из-за ошибки, связанной с другим классом в иерархии. WMI вызывает метод PutInstanceAsync каждого поставщика, ответственного за классы, от которых наследуется исходный экземпляр класса. Если какой-либо из этих поставщиков завершится ошибкой, исходный запрос на обновление завершается ошибкой. Дополнительные сведения см. в разделе "Примечания" PutInstanceAsync.

Дополнительные сведения см. в разделе вызов метода поставщика.

Заметка

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