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


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

Наиболее распространенным способом обновления экземпляра класса 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::P ut.

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

  4. Поместите копию обратно в репозиторий WMI с помощью вызова методов IWbemServices::P utInstance или IWbemServices::P utInstanceAsync .

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

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

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

Примечание

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