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)
Microsoft.Management.Infrastructure 네임스페이스를 사용하여 지정된 네임스페이스 및 클래스 이름을 포함한 CIMInstance 클래스를 만듭니다.
생성된 클래스에는 모든 클래스 정보가 포함되지만 인스턴스 데이터는 포함되지 않습니다.
using Microsoft.Management.Infrastructure; ... string Namespace = @"root\cimv2"; string className = "Win32_LogicalDisk"; CimInstance diskDrive = new CimInstance(className, Namespace);
또는 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)
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은 스키마 정의 클래스를 포함하는 ManagementObjectCollection을 반환합니다. meta_class 클래스는 쿼리를 스키마 쿼리로 정의합니다. meta_class 클래스가 없으면 이 쿼리는 Win32_LogicalDisk의 모든 인스턴스를 반환합니다. WMI 쿼리에 관한 자세한 내용은 스키마 쿼리에 대한 SELECT 문을 참조하세요.
또는 이름이 경로로 되어 있는 새 ManagementClass 개체를 만들어 클래스를 검색합니다.
using System.Management; ... ManagementClass objInst = new ManagementClass("Win32_LogicalDisk");
특정 인스턴스를 검색하는 것과 비슷한 방식으로 VBScript에서 클래스 정의를 검색할 수 있습니다.
VBScript에서 클래스 정의를 검색하려면
SWbemServices.Get을 호출하지만 클래스의 개체 경로에서 특정 인스턴스를 식별하지는 않습니다.
다음 코드 예제에서는 컴퓨터의 논리 드라이브를 설명하는 클래스에 대한 클래스 정의를 검색합니다.
Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
WSH(Windows Script Host)도 다음을 지원합니다.
<OBJECT id="myLocator" progid="WbemScripting.SWbemLocator"></OBJECT>
ASP(Active Server Pages)에서 서버 쪽 스크립트에 GetObject 또는 CreateObject를 사용합니다. 자세한 내용은 WMI용 활성 서버 페이지 만들기를 참조하세요.
클래스 또는 인스턴스를 지정할 수도 있습니다. 이 경우 반환된 개체는 WMI 개체(예: 서비스 개체가 아닌 Win32_LogicalDisk의 인스턴스)입니다. VBScript GetObject 함수를 사용하여 제네릭 개체 SWbemObject의 인스턴스를 만들 수 없습니다.
Microsoft IE(Internet Explorer)에서 실행되는 HTML 페이지에서는 ActiveX 컨트롤과 같은 WMI 스크립팅 개체가 스크립팅에 안전한 것으로 표시되지 않으므로 GetObject 및 CreateObject가 실패할 수 있습니다. 한 가지 예외가 있다면 SWbemDateTime 개체입니다. 이러한 호출은 권장되지 않는 IE 보안 설정을 낮출 때에만 성공할 수 있습니다.
C++에서 클래스를 검색할 때 GetObject의 IWbemServices 버전을 호출합니다.
C++에서 클래스 정의를 검색하려면
- IWbemServices::GetObject 또는 IWbemServices::GetObjectAsync 메서드를 호출하여 클래스의 정의를 검색합니다.
- 한 클래스에는 여러 클래스 정의가 있을 수 있으며, 이는 일반적으로 둘 이상의 클래스 공급자가 하나의 네임스페이스에 로드되어 있을 때 발생합니다. 하나의 클래스에 여러 클래스 정의가 있는 경우, WMI는 검색된 첫 번째 정의와 WBEM_S_DUPLICATE_OBJECTS 상태 코드를 반환합니다.
GetObject는 클래스 정의를 반환하므로 일반적으로 인스턴스를 만드는 첫 번째 단계로 사용됩니다. GetObject를 사용하는 방법에 관한 자세한 내용은 C++를 사용하여 인스턴스 만들기 및 선언을 참조하세요.