擷取 WMI 類別
您可以擷取的第一種物件類型是 WMI 類別。 擷取 WMI 類別時,您實際上會擷取類別定義,這是完整描述類別的屬性、限定詞和方法清單。 不過,類別定義基本上是類別本身。
PowerShell 會使用標準查詢,使用 meta_class 類別來擷取類別定義。
在 PowerShell 中擷取類別定義
使用 Get-WmiObject 搭配查詢 來meta_class,其中 WHERE 子句包含您要擷取之類別的名稱。
Get-WmiObject -query "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'"
Get-WmiObject 是標準 Cmdlet PowerShell 用來從 WMI 擷取類別和實例資訊。 meta_class類別會將查詢定義為架構查詢。 如果沒有 meta_class 類別,此查詢會傳回所有Win32_LogicalDisk實例。 如需查詢 WMI 的詳細資訊,請參閱 架構查詢的 SELECT 語句。
在 C# 中擷取 WMI 定義的目前程式是使用 CIMInstance 類別。
在 C# 中擷取類別定義 (Microsoft.Management.Infrastructure)
使用 Microsoft.Management.Infrastructure 命名空間,使用指定的命名空間和類別名稱建立 CIMInstance 類別。
建立的類別將包含所有類別資訊,但不包含實例資料。
using Microsoft.Management.Infrastructure; ... string Namespace = @"root\cimv2"; string className = "Win32_LogicalDisk"; CimInstance diskDrive = new CimInstance(className, Namespace);
或者,如同 PowerShell,您也可以使用 meta_class 標籤作為查詢的一部分來執行查詢。
using Microsoft.Management.Infrastructure; ... string Namespace = @"root\cimv2"; string diskDriveQuery = "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'"; CimSession mySession = CimSession.Create("localhost"); IEnumerable<CimInstance> queryInstance = mySession.QueryInstances(Namespace, "WQL", diskDriveQuery);
如同 PowerShell,C# 會使用 meta_class 查詢來擷取類別定義。 或者,您可以建立 ManagementClass 物件,直接存取類別定義。
注意
System.Management 是用來存取 WMI 的原始 .NET 命名空間;不過,此命名空間中的 API 通常較慢,而且不會相對於其較新式 的 Microsoft.Management.Infrastructure 對應專案進行調整。
在 C# (System.Management) 擷取類別定義
您可以使用 ManagementObjectSerarcher 搭配查詢 來meta_class,其中 WHERE 子句包含您要擷取之類別的名稱。
using System.Management; ... ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'"); ManagementObjectCollection myDiskCollection = searcher.Get();
ManagementObjectSerarcher 是標準類別 .NET 用來從 WMI 擷取類別和實例資訊。 ManagementObjectSerarcher.Get 會傳回 ManagementObjectCollection ,其中包含架構定義類別。 meta_class類別會將查詢定義為架構查詢。 如果沒有 meta_class 類別,此查詢會傳回 Win32_LogicalDisk的所有實例。 如需查詢 WMI 的詳細資訊,請參閱 架構查詢的 SELECT 語句。
或者,建立名為 作為路徑的新 ManagementClass 物件,以擷取類別。
using System.Management; ... ManagementClass objInst = new ManagementClass("Win32_LogicalDisk");
您可以在 VBScript 中擷取類別定義,其方式類似于擷取特定實例。
在 VBScript 中擷取類別定義
呼叫 SWbemServices.Get ,但不會識別 類別物件路徑中的特定實例。
下列程式碼範例會擷取描述電腦上邏輯磁片磁碟機之 類別的類別定義。
Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
Windows 腳本主機 (WSH) 也支援下列專案。
<OBJECT id="myLocator" progid="WbemScripting.SWbemLocator"></OBJECT>
在 Active Server Pages (ASP) 在伺服器端腳本中使用 GetObject 或 CreateObject 。 如需詳細資訊,請參閱 建立 WMI 的 Active Server Pages。
您也可以指定類別或實例,在此情況下,傳回的物件是 WMI 物件,例如 ,Win32_LogicalDisk的實例,而不是服務物件。 請注意,您無法使用 VBScript GetObject 函式來建立泛型物件 SWbemObject的實例。
在 Microsoft Internet Explorer (IE) 中執行的 HTML 頁面中, GetObject 和 CreateObject 可能會失敗,因為 WMI 腳本物件,例如 ActiveX 控制項,不會標示為安全進行腳本。 其中一個例外狀況是 SWbemDateTime 物件。 這些呼叫可以成功的唯一方式是當您降低 IE 安全性設定時,不建議這麼做。
在 C++ 中擷取類別時,呼叫GetObject的IWbemServices版本。
在 C++ 中擷取類別定義
- 呼叫 IWbemServices::GetObject 或 IWbemServices::GetObjectAsync 方法來擷取類別的定義。
- 一個類別可以有多個類別定義,這通常是當您將多個類別提供者載入一個命名空間時發生。 當類別有多個類別定義時,WMI 會傳回探索的第一個定義,以及 WBEM_S_DUPLICATE_OBJECTS 狀態碼。
由於 GetObject 會傳回類別定義,因此通常用來建立實例的第一個步驟。 如需如何使用 GetObject的詳細資訊,請參閱 使用 C++ 建立和宣告實例。