擷取 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) 中擷取類別定義

  1. 使用 Microsoft.Management.Infrastructure 命名空間,建立具有指定命名空間和類別名稱的 CIMInstance 類別。

    建立的類別將包含所有類別資訊,但不包含任何實例資料。

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    
  2. 或者,如同 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) 中擷取類別定義

  1. 您可以使用 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 會傳回包含架構定義類別的 ManagementObjectCollectionmeta_class類別會將查詢定義為架構查詢。 如果沒有 meta_class 類別,此查詢會傳回 Win32_LogicalDisk的所有實例。 如需查詢 WMI 的詳細資訊,請參閱 架構查詢的 SELECT 語句

  2. 或者,使用名稱作為路徑來建立新的 ManagementClass 物件,以擷取類別。

    using System.Management;
    ...
    ManagementClass objInst = new ManagementClass("Win32_LogicalDisk");
    

您可以在 VBScript 中擷取類別定義,其方式類似于擷取特定實例。

在 VBScript 中擷取類別定義

  1. 呼叫 SWbemServices.Get ,但不會識別 類別物件路徑中的特定實例。

  2. 下列程式碼範例會擷取描述您電腦上邏輯磁片磁碟機之 類別的類別定義。

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    Windows腳本主機 (WSH) 也支援下列專案。

    <OBJECT id="myLocator" progid="WbemScripting.SWbemLocator"></OBJECT>
    

    在 Active Server Pages (ASP) 伺服器端腳本中使用 GetObjectCreateObject 。 如需詳細資訊,請參閱 建立 WMI 的作用中伺服器頁面

  3. 您也可以指定類別或實例,在此情況下,傳回的物件是 WMI 物件,例如 ,Win32_LogicalDisk的實例,而不是 services 物件。 請注意,您無法使用 VBScript GetObject 函式來建立泛型物件的實例 SWbemObject

  4. 在 Microsoft Internet Explorer (IE) 中執行的 HTML 頁面中,GetObjectCreateObject可能會失敗,因為 WMI 腳本物件,例如ActiveX控制項,不會標示為安全的腳本。 其中一個例外狀況是 SWbemDateTime 物件。 這些呼叫可以成功的唯一方式是降低 IE 安全性設定,不建議這麼做。

在 C++ 中擷取類別時,呼叫GetObjectIWbemServices版本。

若要在 C++ 中擷取類別定義

  1. 呼叫 IWbemServices::GetObjectIWbemServices::GetObjectAsync 方法來擷取類別的定義。
  2. 一個類別可以有多個類別定義,這通常是當您有多個類別提供者載入一個命名空間時發生。 當類別有多個類別定義時,WMI 會傳回探索的第一個定義,以及 WBEM_S_DUPLICATE_OBJECTS 狀態碼。

由於 GetObject 會傳回類別定義,因此通常用來作為建立實例的第一個步驟。 如需如何使用 GetObject的詳細資訊,請參閱 使用 C++ 建立和宣告實例