共用方式為


列舉 Windows 管理管理工具(WMI)

列舉是一種遍歷一組物件並可能對每個物件進行修改的行為。 例如,您可以列舉一組 Win32_DiskDrive 物件,以尋找特定的序號。 請注意,雖然您可以列舉任何物件,但 WMI 只會傳回您具有安全性存取權的物件。

大型數據集的列舉可能需要大量的資源並降低效能。 如需詳細資訊,請參閱 改善列舉效能。 您也可以使用更具體的查詢來要求數據。 如需詳細資訊,請參閱 查詢 WMI

本主題將討論下列各節:

使用 PowerShell 列舉 WMI

如果您不知道特定實例的物件路徑,或想要擷取特定類別的所有實例,請使用 Get-WmiObject,並在 -class 參數中使用 類別的名稱。 如果您想要使用查詢,您可以使用 -query 參數。

下列程式描述如何使用PowerShell列舉 類別的實例。

若要使用PowerShell 列舉 類別的實例

  1. 藉由呼叫 Get-WmiObject Cmdlet 列舉實例。

    Get-WmiObject 會傳回一或多個 WMI 物件的集合,您可以透過其中列舉。 如需詳細資訊,請參閱 存取集合

    如果您想要在另一個命名空間或不同的計算機上擷取 WMI 類別實例,請分別在 -computer-namespace 參數中指定計算機和命名空間。 如需詳細資訊,請參閱 建立 WMI 文稿。 只有在您擁有適當的訪問許可權時,才能運作。 如需詳細資訊,請參閱 維護 WMI 安全性執行特殊權限作業

  2. 使用集合的成員擷取您想要的任何個別實例。

下列程式代碼範例會擷取 PowerShell 集合,然後顯示本機電腦上所有邏輯磁碟驅動器實例的大小屬性。

$objCol = get-wmiobject -class "Win32_LogicalDisk"

# Or, alternately
#$objCol = get-wmiobject -Query "SELECT * FROM Win32_LogicalDisk"

foreach ($Drive in $objCol)
{
    if ($Drive.size -ne $null)
    { "Drive " + $Drive.deviceID + " contains " + $Drive.size + " bytes" }
    else
    { "Drive " + $Drive.deviceID + " is not available." }
}

使用 C# 列舉 WMI (Microsoft.Management.Infrastructure)

  1. Microsoft.Management.Infrastructure 參考新增至參考元件。 (此元件隨附於適用於 Windows 8 Windows 軟體開發工具包 (SDK) 中。
  2. 使用 Microsoft.Management.Infrastructure 命名空間的 語句來新增
    using Microsoft.Management.Infrastructure;
  1. 初始化 CimSession 物件。 下列代碼段使用 CimSession.Create 方法的標準 “localhost” 值。
    CimSession cimSession = CimSession.Create("localhost");
  1. 呼叫 CimSession.QueryInstances 方法,傳入要使用的 CIM 命名空間和 WQL 查詢語句。 下列代碼段會傳回兩個實例,代表兩個標準 Windows 進程,其中 handle 屬性(代表進程標識符或 PID)的 值為 0 或 4。
    IEnumerable<CimInstance> queryInstances =     
      cimSession.QueryInstances(@"root\cimv2", 
                                "WQL", 
                                @"select name from win32_process where handle = 0 or handle = 4");
  1. 迴圈遍歷所傳回的 CimInstance 物件。
    foreach (CimInstance cimInstance in enumeratedInstances)
    { 
      Console.WriteLine("Process name: {0}", cimInstance.CimInstanceProperties["Name"].Value);  
    }

下列程式代碼範例會列舉本機計算機上 Win32_Process 類別的所有實例(代表使用中進程),並列印每個進程的名稱。

注意

在實際的應用程式中,您會將計算機名稱 (“localhost”) 和 CIM 命名空間 (“root\cimv2” 定義為參數)。 為了簡單起見,本範例已硬式編碼。

 

using System;
using System.Collections.Generic;
using Microsoft.Management.Infrastructure;

public partial class MI
{
    static void PrintCimInstance(CimInstance cimInstance)
    {
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.WriteLine("{0} properties", cimInstance.CimSystemProperties.ClassName);
        Console.ResetColor();

        Console.WriteLine(String.Format("{0,-5}{1,-30}{2,-15}{3,-10}", 
                                        "Key?", "Property", "Type", "Value"));

        foreach (var enumeratedProperty in cimInstance.CimInstanceProperties)
        {
            bool isKey = ((enumeratedProperty.Flags & CimFlags.Key) == CimFlags.Key);

            if (enumeratedProperty.Value != null)
            {
                Console.WriteLine(
                    "{0,-5}{1,-30}{2,-15}{3,-10}",
                    isKey == true ? "Y" : string.Empty,
                    enumeratedProperty.Name,
                    enumeratedProperty.CimType,
                    enumeratedProperty.Value);
            }
        }
        Console.WriteLine();
    }

    public static void QueryInstance(string query)
    {
        try
        {
            CimSession cimSession = CimSession.Create("localhost");

            IEnumerable<CimInstance> queryInstances = 
              cimSession.QueryInstances(@"root\cimv2", "WQL", query);
            foreach (CimInstance cimInstance in queryInstances)
            {
                //Use the current instance. This example prints the instance. 
                PrintCimInstance(cimInstance);
            }
        }
         catch (CimException ex) 
        { 
            // Handle the exception as appropriate.
            // This example prints the message.
            Console.WriteLine(ex.Message); 
        }
    }
}

using System;

namespace MIClientManaged
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.Write(&quot;Enter WQL (x = Quit): &quot;);
                string query = Console.ReadLine().ToUpper();
                if (query.CompareTo(&quot;X&quot;) == 0) break;
                MI.QueryInstance(query);
            }
        }
    }
}

使用 C# 列舉 WMI (System.Management)

如果您不知道特定實例的物件路徑,或想要擷取特定類別的所有實例,請使用 ManagementClass 對象來擷取 ManagementObjectCollection,其中包含 WMI 命名空間中指定類別的所有實例。 或者,您可以透過 ManagementObjectSearcher 查詢 WMI, 以取得相同的物件集。

注意

System.Management 是用來存取 WMI 的原始 .NET 命名空間;然而,相比於較新式的 Microsoft.Management.Infrastructure 對應項目,此命名空間中的 API 通常較慢且擴展性較差。

 

下列程式描述如何使用 C# 列舉 類別的實例。

使用 C# 列舉類別的實例

  1. 使用呼叫 ManagementClass.GetInstances列舉實例。

    GetInstances 方法會傳回一個物件集合,您可以透過此集合進行列舉。 如需詳細資訊,請參閱 存取集合。 傳回的集合實際上是 ManagementObjectCollection 物件,因此可以呼叫該物件的任何方法。

    如果您想要在另一個命名空間或不同計算機上擷取 WMI 類別實例,請在 路徑 參數中指定計算機和命名空間。 如需詳細資訊,請參閱 建立 WMI 文稿。 只有在您擁有適當的訪問許可權時,才能運作。 如需詳細資訊,請參閱 維護 WMI 安全性執行特殊權限作業

  2. 使用集合的成員擷取您想要的任何個別實例。

下列程式代碼範例會擷取 C# 集合,然後顯示本機電腦上所有邏輯磁碟驅動器實例的大小屬性。

using System.Management;
...

ManagementClass mc = new ManagementClass("Win32_LogicalDisk");
ManagementObjectCollection objCol = mc.GetInstances();

//or, alternately
//ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
//ManagementObjectCollection objCol = mgmtObjSearcher.Get();

if (objCol.Count != 0)
{
   foreach (ManagementObject Drive in objCol)
   {
      if (Drive["size"] != null)
      {
         Console.WriteLine("Drive {0} contains {1} bytes.", Drive["deviceID"], Drive["size"]);
      }
      else
      {
         Console.WriteLine("Drive {0} is not available.", Drive["deviceID"]);
      }
   }
}
Console.ReadLine();

使用 VBScript 列舉 WMI

如果您不知道特定實例的物件路徑,或想要擷取特定類別的所有實例,請使用 SWbemServices.InstancesOf 方法來傳回類別的所有實例列舉SWbemObjectSet。 或者,您可以透過 SWbemServices.ExecQuery 查詢 WMI,以取得相同的物件集。

下列程式描述如何使用 VBScript 列舉 類別的實例。

若要使用 VBScript 列舉類別的實例

  1. 使用呼叫 SWbemServices.InstancesOf 方法來列舉實例。

    InstancesOf 方法會傳回您可以列舉的物件集合或物件集。 如需詳細資訊,請參閱 存取集合。 傳回的集合實際上是 SWbemObjectSet 物件,因此可以呼叫該物件的任何方法。

    如果您想要在另一個命名空間或不同計算機上擷取 WMI 類別實例,請在 Moniker 中指定電腦和命名空間。 如需詳細資訊,請參閱 建立 WMI 文稿。 只有在您擁有適當的訪問許可權時,才能運作。 如需詳細資訊,請參閱 維護 WMI 安全性執行特殊權限作業

  2. 使用集合方法擷取您想要的任何個別實例。

下列程式代碼範例會擷取 SWbemServices 物件,然後執行 InstancesOf 方法,以顯示本機計算機上所有邏輯磁碟驅動器實例的大小屬性。

Set objCol = GetObject("WinMgmts:").InstancesOf("Win32_LogicalDisk")
For Each Drive In objCol
    If Not IsNull(Drive.Size) Then    
       WScript.Echo ("Drive " & Drive.deviceid & " contains " & Drive.Size & " bytes")
    Else
       WScript.Echo ("Drive " & Drive.deviceid & " is not available.")
    End If
Next

使用 C++ 列舉 WMI

除了執行基本列舉之外,您還可以設定數個旗標和屬性,以提高列舉的效能。 如需詳細資訊,請參閱 改善列舉效能

若要列舉 WMI 中的物件集

  1. 建立 IEnumWbemClassObject 介面,描述您想要列舉的物件集。

    IEnumWbemClassObject 物件包含描述一組 WMI 物件的清單。 您可以使用 IEnumWbemClassObject 方法來列舉正向、略過物件、從開頭開始,然後複製列舉值。 下表列出用來為不同類型的 WMI 物件建立列舉值的方法。

    物件 方法
    類別
    IWbemServices::CreateClassEnum
    [IWbemServices::CreateClassEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createclassenumasync)
    實例
    IWbemServices::CreateInstanceEnum
    [IWbemServices::CreateInstanceEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createinstanceenumasync)
    查詢結果
    IWbemServices::ExecQuery
    [IWbemServices::ExecQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execqueryasync)
    事件通知
    IWbemServices::ExecNotificationQuery
    [IWbemServices::ExecNotificationQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execnotificationqueryasync)

     

  2. 使用多個呼叫 IEnumWbemClassObject::NextIEnumWbemClassObject::NextAsync來遍歷傳回的列舉。

如需詳細資訊,請參閱操作類別和實例信息