更新整個實例

更新 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::P ut對複本進行任何必要的變更。

    Put方法只會變更本機複本。 若要將變更儲存至 WMI,您必須將整個複本放回 WMI 存放庫。

  4. 使用呼叫 IWbemServices::P utInstanceIWbemServices::P utInstanceAsync 方法,將您的複本放回 WMI 存放庫。

    如同名稱所示, PutInstance 會以同步方式更新 ,而 PutInstanceAsync 會以非同步 方式更新。 任一方法會複製原始實例上,並搭配您修改的實例。 不過,若要利用非同步處理,您必須實作 IWbemObjectSink 介面。

    您應該注意,屬於類別階層之實例上的更新作業可能因為階層中另一個類別發生錯誤而失敗。 WMI 會呼叫每個提供者的 PutInstanceAsync 方法,這些提供者負責擁有原始實例的類別衍生來源類別。 如果上述任何提供者失敗,原始更新要求就會失敗。 如需詳細資訊,請參閱 PutInstanceAsync的一節。

如需詳細資訊,請參閱 呼叫提供者方法

注意

由於對接收的回呼可能不會在用戶端所需的相同驗證層級傳回,因此建議您使用半同步而非非同步通訊。 如需詳細資訊,請參閱 呼叫方法