更新整个实例

更新 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. 使用对 Put 方法的调用将对象放回 WMI 存储库。

    $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. 调用 CimSession.ModifyInstance 以将对象放回 WMI 存储库。

    session.ModifyInstance(Namespace,myDisk);
    

以下过程介绍如何使用 PowerShell 修改或更新实例。

注意

System.Management 是用于访问 WMI 的原始 .NET 命名空间;但是,此命名空间中的 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. 使用对 ManagementObject.Put 或方法的调用将对象放回 WMI 存储库。

    myDisk.Put();
    

以下过程介绍如何使用 VBScript 修改或更新实例。

使用 VBScript 修改或更新实例

  1. 调用 GetObject 来检索对象的本地副本。

  2. 如有必要,可通过调用 Properties_ 方法查看对象的属性。

    虽然不是必需的,但在更改属性之前,你可能希望知道属性的值。

  3. 调用 SWbemProperty.Value 方法对对象属性进行任何更改。

    Value 方法仅更改本地副本。 要保存对 WMI 的更改,必须将整个副本放回 WMI 存储库。

  4. 调用 SWbemObject.Put_SWbemObject.PutAsync_ 方法将对象放回 WMI 存储库。

顾名思义,Put_ 同步更新,而 PutAsync_ 异步更新。 这两种方法方法都使用修改后的实例在原始实例上复制。 但是,若要利用异步处理,必须创建 SWbemSink 对象。 有关详细信息,请参阅调用方法

以下过程介绍如何使用 C++ 修改或更新实例。

使用 C++ 修改或更新实例

  1. 通过调用 IWbemServices::GetObjectIWbemServices::GetObjectAsync 检索实例的本地副本。

  2. 如有必要,通过调用 IWbemClassObject::Get 查看对象的属性。

    虽然不是必需的,但在更改属性之前,你可能希望知道属性的值。

  3. 调用 IWbemClassObject::Put 对副本进行任何必要的更改。

    Put 方法仅更改本地副本。 要保存对 WMI 的更改,必须将整个副本放回 WMI 存储库。

  4. 调用 IWbemServices::PutInstanceIWbemServices::PutInstanceAsync 方法将副本放回 WMI 存储库。

    顾名思义,PutInstance 同步更新,而 PutInstanceAsync 异步更新。 这两种方法方法都使用修改后的实例在原始实例上复制。 但是,要利用异步处理,必须实现 IWbemObjectSink 接口。

    应注意,由于涉及层次结构中另一个类的错误,对属于类层次结构的实例的更新操作可能不会成功。 WMI 调用每个提供程序的 PutInstanceAsync 方法,这些提供程序负责从中派生拥有原始实例的类。 如果这些提供程序中的任何一个失败,则原始更新请求将失败。 有关详细信息,请参阅 PutInstanceAsync 的“备注”部分。

有关详细信息,请参阅调用提供程序方法

注意

由于对接收器的回调可能不会以客户端所需的相同身份验证级别返回,因此建议使用半同步而不是异步通信。 有关详细信息,请参阅调用方法