共用方式為


擷取 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 對應的 API 相較,擴充性不佳。

 

在 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) 上使用 GetObject伺服器端腳本中的 CreateObject。 如需詳細資訊,請參閱 建立 WMI 的作用中伺服器頁面

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

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

在 C++ 中擷取類別時,呼叫 IWbemServices版本的 GetObject

擷取C++ 中的類別定義

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

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