WMI 클래스 검색

검색할 수 있는 개체의 첫 번째 형식은 WMI 클래스입니다. WMI 클래스를 검색할 때 클래스를 완전히 설명하는 속성, 한정자 및 메서드를 열거하는 클래스 정의를 실제로 검색합니다. 그러나 클래스 정의는 기본적으로 클래스 그 자체를 나타냅니다.

PowerShell은 표준 쿼리를 사용하여 클래스 정의를 검색하며 meta_class 클래스를 사용합니다.

PowerShell에서 클래스 정의를 검색하려면

  • Get-WmiObjectmeta_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. ManagementObjectSerarchermeta_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 문을 참조하세요.

  2. 또는 이름이 경로로 되어 있는 새 ManagementClass 개체를 만들어 클래스를 검색합니다.

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

특정 인스턴스를 검색하는 것과 비슷한 방식으로 VBScript에서 클래스 정의를 검색할 수 있습니다.

VBScript에서 클래스 정의를 검색하려면

  1. SWbemServices.Get을 호출하지만 클래스의 개체 경로에서 특정 인스턴스를 식별하지는 않습니다.

  2. 다음 코드 예제에서는 컴퓨터의 논리 드라이브를 설명하는 클래스에 대한 클래스 정의를 검색합니다.

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    WSH(Windows Script Host)도 다음을 지원합니다.

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

    ASP(Active Server Pages)에서 서버 쪽 스크립트에 GetObject 또는 CreateObject를 사용합니다. 자세한 내용은 WMI용 활성 서버 페이지 만들기를 참조하세요.

  3. 클래스 또는 인스턴스를 지정할 수도 있습니다. 이 경우 반환된 개체는 WMI 개체(예: 서비스 개체가 아닌 Win32_LogicalDisk의 인스턴스)입니다. VBScript GetObject 함수를 사용하여 제네릭 개체 SWbemObject의 인스턴스를 만들 수 없습니다.

  4. Microsoft IE(Internet Explorer)에서 실행되는 HTML 페이지에서는 ActiveX 컨트롤과 같은 WMI 스크립팅 개체가 스크립팅에 안전한 것으로 표시되지 않으므로 GetObjectCreateObject가 실패할 수 있습니다. 한 가지 예외가 있다면 SWbemDateTime 개체입니다. 이러한 호출은 권장되지 않는 IE 보안 설정을 낮출 때에만 성공할 수 있습니다.

C++에서 클래스를 검색할 때 GetObjectIWbemServices 버전을 호출합니다.

C++에서 클래스 정의를 검색하려면

  1. IWbemServices::GetObject 또는 IWbemServices::GetObjectAsync 메서드를 호출하여 클래스의 정의를 검색합니다.
  2. 한 클래스에는 여러 클래스 정의가 있을 수 있으며, 이는 일반적으로 둘 이상의 클래스 공급자가 하나의 네임스페이스에 로드되어 있을 때 발생합니다. 하나의 클래스에 여러 클래스 정의가 있는 경우, WMI는 검색된 첫 번째 정의와 WBEM_S_DUPLICATE_OBJECTS 상태 코드를 반환합니다.

GetObject는 클래스 정의를 반환하므로 일반적으로 인스턴스를 만드는 첫 번째 단계로 사용됩니다. GetObject를 사용하는 방법에 관한 자세한 내용은 C++를 사용하여 인스턴스 만들기 및 선언을 참조하세요.