May 12, 2023

WMI Query Language by Example

WMI Query Language by Example

이 글은 아래주소의 내용은 구글 번역기를 이용해 한글로 번역해둔자료입니다.
자세한 내용은 아래페이지를 참고하는걸로.

https://www.codeproject.com/articles/46390/wmi-query-language-by-example

쿼리 유형을 3개의 그룹으로 분류하여 예제를 가지고 설명을 하고 있는 문서로 구글번역기 수준으로도 매우 쉽게 이해할 수 있는 자료입니다.

Object Queries
Event Queries
Schema Queries
Object Queries
Object queries are used to get information about system resources.
(개체 쿼리는 시스템 리소스에 대한 정보를 가져 오는 데 사용됩니다.)

Object Queries Exam:

    Select * From Win32_Process  

Windows 프로세스를 나타내는 Win32_Process라는 WMI 클래스의 모든 인스턴스를 가져옵니다.

Object Queries Exam:

    Select * From Win32_Process Where ProcessId = 608

( Where PropertyName Operator PropertyValue )

Object Queries Exam:

    Select * From Win32_Service Where Name Like "%SQL%" 

(Like 연산자의 사용이 가능합니다.)

Object Queries Exam:

	Select * From Win32_Service Where Name > "M" And Name < "O" 

일반적인 문자열 비교 규칙적용

Object Queries Exam:

	Select * From Win32_Service Where ExitCode = "1077" 

Win32_Process.ExitCode 속성 형식은 UInt32이지만 따옴표로 묶습니다. WMI는 문자열 값을 해석하고 적절한 형식으로 변환하기 위해 최선을 다할 것입니다. 다른 방법으로는 작동하지 않습니다. 문자열 속성을 사용하면 따옴표를 사용해야합니다.

    Select * From Cim_DataFile Where Drive = "C:" And Path = "\\Scripts\\" 

Cim_DataFile은 반드시 WHERE 절을 반드시 사용해야하는 WMI 클래스입니다. '선택 * Cim_DataFile에서'혼자 컴퓨터에있는 모든 파일을 반환하기 때문에 완료하는 데 몇 시간이 걸릴 수 있습니다. Drive 속성에는 파일 이름이나 Drive 속성에 저장되어있는 드라이브 문자가 포함되어 있지 않습니다.

Object Queries Exam:

    Associators Of {Win32_NetworkAdapter.DeviceId=1}

보시다시피 Select 쿼리 만 WQL의 쿼리 유형이 아닙니다.
Select 쿼리와 마찬가지로 Associators쿼리는 WMI 개체 또는 클래스 정의를 반환 할 수 있습니다.
그러나 차이점은 다음과 같습니다.
Select 쿼리는 항상 한 WMI 클래스 인스턴스의 컬렉션을 반환하거나 특정 수준에서 동일한 상위 클래스를 가진 클래스 인스턴스를 반환합니다.
한편, 쿼리의 연결자는 일반적으로 다른 WMI 클래스에 속한 WMI 개체의 컬렉션을 반환합니다.
반환 된 개체의 공통점 중 하나는 Associators Of 쿼리 (중괄호로 묶인)에 지정된 WMI 개체와 모두 관련되어 있다는 것입니다.
개체의 주요 속성을 사용하여 경로를 지정하고 속성 이름, 등호 및 속성 값 사이에 공백이 없어야합니다.
내 컴퓨터에서 위의 쿼리는 다음 클래스의 인스턴스를 반환합니다.

Object Queries Return instance:

		Win32_ComputerSystem
		Win32_DeviceMemoryAddress
		Win32_IRQResource
		Win32_NetworkAdapterConfiguration
		Win32_NetworkProtocol
		Win32_PnPEntity
		Win32_PortResource
		Win32_SystemDriver

Object Queries Exam:

     Associators Of {Win32_NetworkAdapter.DeviceId=1}
     Where ResultClass = Win32_NetworkAdapterConfiguration 

대부분의 경우 WMI 개체와 관련된 모든 WMI 개체가 필요하지는 않습니다.
Associators Of Query Where 절에서 반환 된 개체의 클래스를 지정하여 반환 된 컬렉션의 범위를 좁힐 수 있습니다.
위의 쿼리는 원본 개체와 연결된 Win32_NetworkAdapterConfiguration의 인스턴스를 반환합니다.

Object Queries Exam:

	Associators Of {Win32_NetworkAdapter.DeviceId=1}
        Where AssocClass = Win32_NetworkAdapterSetting 

WMI 클래스는 연관 클래스라고하는 특수한 유형의 WMI 클래스로 연결됩니다. Win32_NetworkAdapter 및 Win32_NetworkAdapterConfiguration 개체는 Win32_NetworkAdapterSetting이라는 연결 클래스의 인스턴스와 연결됩니다. 보시다시피 관련 클래스 이름을 사용하여 반환 된 객체 컬렉션을 제한 할 수도 있습니다.

Object Queries Exam:

	References Of {Win32_NetworkAdapter.DeviceId=1} 

References Of 쿼리를 사용하여 WMI 개체 연결을 검사 할 수 있습니다. 쿼리의 Associators와 달리 쿼리의 References는 WMI 연결 클래스 만 반환합니다. 이 쿼리는 다음 WMI 연결 클래스의 인스턴스를 반환합니다.

Object Queries Return instance:

		Win32_AllocatedResource
		Win32_NetworkAdapterSetting
		Win32_PnPDevice
		Win32_ProtocolBinding
		Win32_SystemDevices

Event Queries
Event queries are used for WMI event subscriptions.
(이벤트 쿼리는 WMI 이벤트 구독에 사용됩니다.)

Event Queries Exam:

    Select * From __InstanceCreationEvent
	Within 5
	Where TargetInstance Isa "Win32_Process"

WMI 이벤트 쿼리는 WMI 개체를 즉시 반환하지 않는다는 점에서 다른 쿼리 유형과 다릅니다.
대신 WMI 이벤트를 구독하는 데 사용되며 이벤트가 도착하면 개체가 반환됩니다.
Within 쿼리 유형과 __InstanceCreationEvent 클래스의 다른 쿼리 유형에는없는 두 가지 고유 한 이벤트 쿼리의 특성에 유의하십시오.
Within 절은 몇 초 안에 이벤트를 폴링하는 빈도를 WMI에 알려줍니다. 위의 쿼리에서 폴링 간격은 5 초입니다.
WQL 이벤트 모니터링은 시스템 리소스를 소비하므로 시간에 이벤트를 가져올 필요와 시스템에 부담을 줄 필요가없는 사이의 균형을 맞추는 것이 중요합니다.
__InstanceCreationEvent 클래스는 이벤트 쿼리에서만 사용되는 클래스 중 하나입니다 (다른 두 가지 일반적으로 사용되는 클래스는 __InstanceModificationEvent 및 __InstanceDeletionEvent입니다).
이 클래스의 인스턴스는 요청 된 이벤트가 도착하면 만들어집니다. __InstanceCreationEvent.TargetInstance 속성은 실제로 이벤트를 트리거 한 WMI 클래스에 대한 참조를 보유합니다.
위의 쿼리에서는 Win32_Process 클래스이며 TargetInstance 속성을 사용하여 해당 속성에 액세스 할 수 있습니다.

Event Queries Exam:

	Select * From __InstanceCreationEvent
	Within 5
	Where TargetInstance Isa "Win32_Process"
	And TargetInstance.Name = "Notepad.exe"

이 쿼리는 프로세스 만들기 이벤트를 모니터링하지만 'Notepad.exe'라는 프로세스 만 모니터링합니다.

Event Queries Exam:

	Select * From __InstanceDeletionEvent
	Within 5
	Where TargetInstance Isa "Win32_Process"
	And TargetInstance.Name = "Notepad.exe" 

이 쿼리를 사용하여 Name 속성이 'Notepad.exe'인 프로세스의 프로세스 삭제 이벤트를 모니터링합니다. 프로세스 삭제 이벤트는 프로세스가 종료 될 때 발생합니다. 다음과 같은 쿼리에 대해 메모해야 할 사항이 하나 있습니다. 메모장을 열고 빠르게 닫으면 (5 초 이내에) WMI에서이를 놓치고 이벤트로보고하지 않을 수 있습니다.

Event Queries Exam:

	Select * From __InstanceOperationEvent
	Within 5
	Where TargetInstance Isa "Win32_Process"
	And TargetInstance.Name = "Notepad.exe"

이 쿼리는 생성, 삭제 및 수정 이벤트의 세 가지 유형의 이벤트를 모두 모니터링합니다. __InstanceOperationEvent 클래스는 __InstanceCreation, __InstanceDeletion 및 __InstanceModification 클래스의 부모이며이 사실을 사용하여 세 가지 이벤트 유형을 모두 동시에 구독 할 수 있습니다. __InstanceOperationEvent 클래스는 인스턴스가없는 추상 클래스이므로 이벤트에 의해 반환 된 실제 이벤트 클래스는 트리 인스턴스 클래스 중 하나이며 __Class 시스템 속성을 검사하여 어떤 인스턴스가 있는지 확인할 수 있습니다. 이렇게하면 이벤트 유형을 결정할 수 있습니다.

Schema Queries
Schema queries are used to get information about WMI itself and its structure.(스키마 쿼리는 WMI 자체 및 구조에 대한 정보를 가져 오는 데 사용됩니다.)

Schema Queries Exam:

	 Select * From Meta_Class 

가장 기본적인 스키마 쿼리입니다. 모든 WMI 네임 스페이스에 연결하여 이 쿼리를 사용하여 해당 클래스에 있는 모든 클래스를 가져올 수 있습니다. Meta_Class는 스키마 쿼리에서만 사용되는 메타 클래스입니다.

Schema Queries Exam:

	Select * From Meta_Class Where __Class = "Win32_LogicalDisk"  

이 쿼리는 __Class 시스템 속성을 사용하여 Win32_LogicalDisk 클래스를 가져옵니다. 스키마 쿼리는 클래스 인스턴스가 아니라 클래스 정의를 반환하며 이와 같은 쿼리는 인스턴스가 있는지 여부에 관계없이 클래스 정의를 반환합니다. 왜 클래스 정의를 얻고 싶습니까? 새 WMI 클래스는 모든 새 Windows 버전에 추가되며 이와 같은 쿼리는 클래스가 시스템에 있는지 확인할 수 있습니다.

Schema Queries Exam:

	Select * From Meta_Class Where __Superclass Is Null 

WMI는 계층 적으로 구성됩니다. 클래스 컨테이너로서 네임 스페이스의 계층 구조가 있으며 각 네임 스페이스 내에 클래스 계층이 있습니다. '루트'라는 최상위 네임 스페이스가 하나만 있지만 네임 스페이스에 항상 최상위 클래스가 두 개 이상 있습니다. 새 빈 네임 스페이스를 만들 때도 자동으로 여러 시스템 WMI 클래스가 만들어집니다. 이 쿼리를 사용하여 네임 스페이스에 대한 모든 최상위 클래스를 가져올 수 있습니다. (이 쿼리는 'Is'대신 '='를 사용하는 경우에도 작동합니다.)

Schema Queries Exam:

    Select * From Meta_Class Where __Superclass = "Win32_CurrentTime" 	

각 WMI 클래스에 대해 __Superclass 속성은 바로 위 부모 클래스의 이름을 포함합니다. 이 쿼리를 사용하여 클래스의 모든 직계 하위 클래스를 반환 할 수 있습니다. 클래스 이름을 따옴표로 묶으십시오. __Superclass는 7 가지 WMI 시스템 속성 중 하나 (자세한 내용은 여기 참조)이며 스키마 쿼리에서 사용할 수 있습니다. 하나만 제외하고 - __Dynasty 속성은 문자열 배열이며 WQL 쿼리에서 배열 속성을 사용할 수 없습니다. 위의 쿼리는 Win32_LocalTime과 Win32_UTCTime의 두 클래스를 반환하는데, Win32_CurrentTime의 직접적인 자식입니다.

Schema Queries Exam:

	Select * From Meta_Class Where __Dynasty = "Cim_Setting" 

__Dynasty는 또 다른 WMI 시스템 속성입니다. 각 클래스에 대해 클래스가 파생 된 최상위 클래스의 이름을 보유합니다. 이 쿼리는 Root \ Cimv2 네임 스페이스에있는 최상위 클래스 인 Cim_Setting의 모든 자식을 반환합니다.

Schema Queries Exam:

	Select * From Meta_Class Where __Class Like "Win32%" 

모든 WMI 클래스는 스키마에 속하며 적어도 스키마에 속해야합니다. 예를 들어 이름이 'Cim'으로 시작하는 클래스는 DMTF에서 정의한 '핵심 및 공통'WMI 클래스 그룹 인 Cim 스키마에 속합니다. 'Win32'로 시작하는 클래스는 'Win32'스키마에 속합니다.이 클래스는 Cim 클래스에서 파생되어 확장됩니다. 이 쿼리를 사용하여 'Win32'스키마에 속한 모든 클래스를 나열 할 수 있습니다. 쿼리는 Like 연산자를 사용합니다. 즉, Like 연산자가 XP 용 WQL에 추가 되었기 때문에 Windows XP 이전의 Windows 버전에서는이 연산자를 사용할 수 없습니다.

Schema Queries Exam:

	Select * From Meta_Class Where __This Isa "__Event"

이것은 __Event 클래스를 사용한다는 사실에도 불구하고 이벤트 쿼리가 아닙니다. __Event의 모든 하위 클래스 (직접 및 간접 모두)를 나열하는 스키마 쿼리입니다. 스키마 쿼리에 사용되는 특수 WMI 속성 인 '__This'와 'Isa'연산자를 사용합니다.