更新整個實例
更新 WMI 類別實例最常見的方式是一次更新整個實例。 藉由更新整個實例,WMI 不需要將實例剖析為個別屬性,並將其傳送至您的應用程式。 相反地,WMI 可以直接傳送整個實例。 當您完成時,WMI 就可以將整個已變更的實例覆蓋到原始實例上。
下列程式描述如何使用PowerShell修改或更新實例。
使用 PowerShell 修改或更新實例
使用 Get-WmiObject 的呼叫擷取物件的本機複本。
$mySettings = get-WMIObject Win32_WmiSetting
如有必要,請使用對 Properties 集合的呼叫來檢視 對象的屬性。
雖然並非必要,但您可能想要先知道 屬性的值,再加以變更。
$mySettings.Properties
對本機物件屬性進行任意修改。
這麼做只會變更本機副本。 若要將變更儲存至 WMI,您必須將整個復本放回 WMI 存放庫。
$mySettings.LoggingLevel = 1
使用 Put 方法的呼叫,將物件放回 WMI 存放庫。
$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";
使用 呼叫 CimSession.ModifyInstance,將物件放回 WMI 存放庫。
session.ModifyInstance(Namespace,myDisk);
下列程式描述如何使用PowerShell修改或更新實例。
注意
System.Management 是用來存取 WMI 的原始 .NET 命名空間, 不過,此命名空間中的 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";
使用呼叫 ManagementObject.Put 或方法,將物件放回 WMI 存放庫。
myDisk.Put();
下列程序描述如何使用 VBScript 修改或更新實例。
使用 VBScript 修改或更新實例
擷取物件的本機複本,並呼叫 GetObject。
如有必要,請使用對 Properties_ 方法的呼叫來檢視 對象的屬性。
雖然並非必要,但您可能想要先知道 屬性的值,再加以變更。
使用呼叫 SWbemProperty.Value 方法,對對象屬性進行任何變更。
Value 方法只會變更本地版本。 若要將變更儲存至 WMI,您必須將整個復本放回 WMI 存放庫。
使用呼叫 SWbemObject.Put_ 或 SWbemObject.PutAsync_ 方法,將物件放回 WMI 存放庫。
如同名稱所暗示,Put_ 同步更新,同時 PutAsync_ 異步更新。 任一種方法都會用您已修改的實例覆蓋原始實例。 不過,若要利用異步處理,您必須建立 SWbemSink 物件。 如需詳細資訊,請參閱 呼叫 方法。
下列程式描述如何使用 C++來修改或更新實例。
使用C++ 來修改或更新實例
使用呼叫 IWbemServices::GetObject 或 IWbemServices::GetObjectAsync來擷取實例的本機複本。
如有必要,請使用呼叫 IWbemClassObject::Get來檢視 對象的屬性。
雖然並非必要,但您可能想要先知道 屬性的值,再加以變更。
請對文本進行任何必要的變更,並呼叫 IWbemClassObject::Put。
Put 方法只會變更本機複本。 若要將變更儲存至 WMI,您必須將整個復本放回 WMI 存放庫。
使用呼叫 IWbemServices::PutInstance 或 IWbemServices::PutInstanceAsync 方法,將您的副本放回 WMI 存放庫。
正如名稱所暗示,PutInstance 同步更新,同時 PutInstanceAsync 異步更新。 任何一種方法都會用您修改過的實例覆蓋原始實例。 不過,若要利用異步處理,您必須實作 IWbemObjectSink介面。
您應該知道,屬於類別階層的一個實例上的更新作業可能不會成功,這是由於階層中另一個類別的相關錯誤所導致的。 WMI 會呼叫每個負責從擁有原始實例的類別所衍生的類別的提供者的 PutInstanceAsync 方法。 如果其中任何一個提供者失敗,原始更新要求就會失敗。 如需詳細資訊,請參閱 PutInstanceAsync部分。
如需詳細資訊,請參閱 呼叫提供者方法。
注意
由於傳送至接收者的回呼可能不會以用戶端所需的相同驗證層級返回,因此建議您使用半同步通訊,而不是非同步通訊。 如需詳細資訊,請參閱 呼叫 方法。