擷取 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 是 PowerShell 用來從 WMI 擷取類別和實例資訊的標準 Cmdlet。 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 對應的 API 相較,擴充性不佳。
在 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 的作用中伺服器頁面。
您也可以指定類別或實例,在此情況下,傳回的物件是 WMI 物件,例如,Win32_LogicalDisk實例,而不是服務物件。 請注意,您無法使用 VBScript GetObject 函式來建立泛型物件的實例,SWbemObject。
在 Microsoft Internet Explorer (IE) 中執行的 HTML 頁面中,GetObject 和 CreateObject 可能會失敗,因為 WMI 腳本物件,例如 ActiveX 控件,不會標示為安全的腳本。 其中一個例外狀況是 SWbemDateTime物件。 這些呼叫可以成功的唯一方式是降低 IE 安全性設定,不建議這麼做。
在 C++ 中擷取類別時,呼叫 IWbemServices版本的 GetObject。
擷取C++ 中的類別定義
- 呼叫 IWbemServices::GetObject 或 IWbemServices::GetObjectAsync 方法來擷取類別的定義。
- 一個類別可以有多個類別定義,這通常發生在您有多個類別提供者載入一個命名空間時。 當類別有多個類別定義時,WMI 會傳回探索到的第一個定義,以及 WBEM_S_DUPLICATE_OBJECTS 狀態代碼。
因為 GetObject 傳回類別定義,所以通常用來作為建立實例的第一個步驟。 如需如何使用 getObject 的詳細資訊,請參閱 使用 C++建立和宣告實例。