WMI 열거

열거는 개체 집합들 사이를 이동하며 각 개체를 수정하는 작업입니다. 예를 들어 Win32_DiskDrive 개체 집합을 열거하여 특정 일련 번호를 찾을 수 있습니다. 모든 개체를 열거할 수 있지만 WMI는 사용자에게 보안 액세스 권한이 있는 개체만 반환합니다.

큰 데이터 집합을 열거하는 데는 많은 양의 리소스가 필요하므로 성능이 저하될 수 있습니다. 자세한 내용은 열거 성능 향상을 참조하세요. 보다 구체적인 쿼리를 사용하여 데이터를 요청할 수도 있습니다. 자세한 내용은 WMI 쿼리를 참조하세요.

이 항목에서 다루는 섹션은 다음과 같습니다.

PowerShell을 사용하여 WMI 열거

특정 인스턴스의 개체 경로를 모르거나 특정 클래스에 대한 모든 인스턴스를 검색하려는 경우 -class 매개 변수에 클래스 이름과 함께 Get-WmiObject를 사용합니다. 쿼리를 사용하려는 경우 -query 매개 변수를 사용할 수 있습니다.

다음 절차에서는 PowerShell을 사용하여 클래스의 인스턴스를 열거하는 방법을 설명합니다.

PowerShell을 사용하여 클래스의 인스턴스를 열거하려면

  1. Get-WmiObject cmdlet을 호출하여 인스턴스를 열거합니다.

    Get-WmiObject는 열거할 수 있는 하나 이상의 WMI 개체 컬렉션을 반환합니다. 자세한 내용은 컬렉션 액세스를 참조하세요.

    다른 네임스페이스 또는 다른 컴퓨터에서 WMI 클래스 인스턴스를 검색하려면 -computer-namespace 매개 변수에 각각 컴퓨터 및 네임스페이스를 지정합니다. 자세한 내용은 Creating a WMI Script를 참조하세요. 적절한 액세스 권한이 있는 경우에만 작동합니다. 자세한 내용은 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#(Microsoft.Management.Infrastructure)을 사용하여 WMI 열거

  1. Microsoft.Management.Infrastructure 참조 어셈블리에 참조를 추가합니다. (이 어셈블리는 Windows 8용 Windows SDK(소프트웨어 개발 키트)의 일부로 제공됩니다.)
  2. Microsoft.Management.Infrastructure 네임스페이스에 using 문을 추가합니다.
    using Microsoft.Management.Infrastructure;
  1. CimSession 개체를 인스턴스화합니다. 다음 코드 조각은 CimSession.Create 메서드에 대한 표준 “localhost” 값을 사용합니다.
    CimSession cimSession = CimSession.Create("localhost");
  1. 사용하고자 하는 CIM 네임스페이스 및 WQL을 전달하는 CimSession.QueryInstances 메서드를 호출합니다. 다음 코드 조각은 핸들 속성(프로세스 ID 또는 PID를 나타냄) 값이 0 또는 4인 두 개의 표준 Windows 프로세스를 나타내는 두 개의 인스턴스를 반환합니다.
    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#(System.Management)을 사용하여 WMI 열거

특정 인스턴스의 개체 경로를 모르거나 특정 클래스에 대한 모든 인스턴스를 검색하려는 경우 ManagementClass 개체를 사용하여 WMI 네임스페이스에서 지정된 클래스의 모든 인스턴스를 포함하는 ManagementObjectCollection을 검색합니다. 또는 ManagementObjectSearcher를 통해 WMI를 쿼리하여 동일한 개체 집합을 가져올 수 있습니다.

참고

System.Management는 WMI에 액세스하는 데 사용되는 원래 .NET 네임스페이스였습니다. 그러나 이 네임스페이스의 API는 일반적으로 최신 네임스페이스인 Microsoft.Management.Infrastructure에 비해 더 느리고 스케일링 성능이 떨어집니다.

 

다음 절차에서는 C#을 사용하여 클래스의 인스턴스를 열거하는 방법을 설명합니다.

C#를 사용하여 클래스의 인스턴스를 열거하려면

  1. ManagementClass.GetInstances를 호출하여 인스턴스를 열거합니다.

    GetInstances 메서드는 열거할 수 있는 개체의 컬렉션 또는 집합을 반환합니다. 자세한 내용은 컬렉션 액세스를 참조하세요. 반환된 컬렉션은 실제로 ManagementObjectCollection 개체이므로 해당 개체의 메서드를 호출할 수 있습니다.

    다른 네임스페이스 또는 컴퓨터에서 WMI 클래스 인스턴스를 검색하려면 path 매개 변수에 컴퓨터와 네임스페이스를 지정합니다. 자세한 내용은 Creating a WMI Script를 참조하세요. 적절한 액세스 권한이 있는 경우에만 작동합니다. 자세한 내용은 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 클래스 인스턴스를 검색하려면 모니커에서 컴퓨터와 네임스페이스를 지정합니다. 자세한 내용은 Creating a WMI Script를 참조하세요. 적절한 액세스 권한이 있는 경우에만 작동합니다. 자세한 내용은 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 개체에 대한 열거자를 만드는 데 사용하는 메서드를 나열합니다.

    Object 메서드
    클래스
    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::Next 또는 IEnumWbemClassObject::NextAsync에 대한 여러 호출을 사용하여 반환된 열거형을 트래버스합니다.

자세한 내용은 클래스 및 인스턴스 정보 조작을 참조하세요.