부동산, 채권, 주식, 경제흐름 자료를 모아 보는 블로그입니다.

WMI (Windows Management Instrumentation) 본문

Study

WMI (Windows Management Instrumentation)

runardor 2016. 8. 22. 18:51

최근 악성코드를 분석하며 많은 한계를 느끼는 부분이 COM Interface 개념과, WMI관련 내용에서 많은 한계를 느끼게 되어 이를 정리하고자 해당 내용을 정리해보고자 합니다.



일단 이번에 정리할 내용은 WMI 입니다.


사실 조금만 자료를 찾아봤지만 WMI가 너무 방대하고( 책한권이 나올정도 ) 사용하는데 있어서도 문법이나 함수 사용을 하는데 기존에 API와 다른 부분이 많아 많이 어색한게 사실입니다.



이를 위해 WMI에 대해 조금 알아보고 사용법정도 정리할 예정입니다.




WMI는 윈도우의 서버나 워크스테이션, PC를 관리하기 위핸 메니지먼트 인터페이스( Monikor Object : 크게 보면 Com Interface ) 입니다.


WMI는 거의 모든 Windows 리소스를 액세스하고 구성하고 관리하고 모니터링할 수 있는 수단이며, 


디스크, 이벤트 로그, 파일, 폴더, 파일 시스템, 네트워크 구성 요소, 운영 체제 설정, 성능 데이터, 프린터, 프로세스, 레지스트리 설정, 보안, 서비스, 공유, 사용자, 그룹 등과 같은 Windows 리소스를 관리 할 수 있습니다.



WMI 이전에는 모든 Windows 그래픽 관리 도구가 Windows 리소스를 액세스하고 관리하는 데 Win32 API(Application Programming Interface)에 의존했다는 것입니다. 


그 이유는 무엇일까요? WMI 이전에는 Win32 API를 통해서만 프로그래밍 방식으로 Windows 리소스에 액세스할 수 있었기 때문입니다.


대부분의 스크립팅 언어에서 Win32 API를 직접 호출할 수 없기 때문에 널리 사용되고 있는 스크립팅 언어를 사용하여 일반 시스템 관리 작업을 자동화할수 있도록 MS에서는 WMI를 만들게 되었습니다.



일단 WMI를 보기 앞서 간단하게 구동원리를 알아보기 위해 아래의 아키텍쳐를 살펴봅니다.



출처 : https://www.microsoft.com/korea/msdn/columns/contents/scripting/scripting06112002/



CIM(Common Information Model) 리포지토리

WMI에서 사용하는 관리 환경을 모델링하고 WMI에서 제공한 모든 데이터를 스키마 형태로 저장한 저장소


WMI 공급자

WMI 공급자는 WMI와 관리 리소스 간의 중개자 역할을 합니다. 

공급자는 소비자 응용 프로그램 및 스크립트 대신 WMI 관리 리소스에서 정보를 요청하고 WMI 관리 리소스에 설명을 보냅니다.

관리 리소스

관리 리소스는 WMI를 사용하여 게시되고 관리할 수 있는 논리적 또는 물리적 구성 요소입니다. WMI를 사용하여 관리할 수 있는 Windows 리소스에는 컴퓨터 시스템, 디스크, 주변 장치, 이벤트 로그, 파일, 폴더, 파일 시스템, 네트워킹 구성 요소, 운영 체제 하위 시스템, 성능 카운터, 프린터, 프로세스, 레지스트리 설정, 보안, 서비스, 공유, SAM 사용자 및 그룹, Active Directory, Windows Installer, WDM(Windows Driver Model) 장치 드라이버 및 SNMP MIB(Management Information Base) 데이터가 있습니다.


WMI 스크립팅 라이브러리

WMI 스크립팅 라이브러리는 VBScript, Jscript 및 ActiveState의 ActivePerl과 같은 스크립팅 언어에서 WMI 인프라에 액세스하여 자동화 개체 집합을 제공



CIMOM (Common Information Model Object Manager )


소비자가 WMI에 액세스하여 일반 인터페이스를 제공하는 것 외에 CIMOM은 다음과 같은 핵심 서비스를 WMI 인프라에 제공
  • 공급자 등록 WMI 공급자는 CIMOM을 사용하여 위치 및 기능 정보를 등록(스키마 저장)합니다. 이 정보는 CIM 리포지토리에 저장됩니다.
  • 요청 라우팅 CIMOM은 공급자 등록 정보를 사용하여 소비자 요청을 해당 공급자에게 라우팅합니다.
  • 원격 액세스 소비자는 원격 시스템의 CIMOM에 연결하여 원격 WMI 사용 가능 시스템에 액세스합니다. 연결이 설정되면 소비자는 로컬로 실행할 수 있는 동일한 작업을 실행할 수 있습니다.
  • 보안 CIMOM은 로컬 컴퓨터나 원격 컴퓨터에서 사용자의 WMI 연결을 허용하기 전에 각 사용자의 액세스 토큰을 확인하여 WMI 관리 리소스에 대한 액세스를 제어합니다. WMI는 운영 제체에서 제공하는 보안을 무시하거나 방해하지 않습니다.
  • 쿼리 처리 소비자가 WQL(WMI Query Language)을 사용하여 WMI 관리 리소스에 대한 쿼리를 제공할 수 있게 합니다. 예를 들면, 지난 24시간 동안 발생한 특정 이벤트 ID에 일치하는 모든 이벤트에 대해 이벤트 로그를 쿼리할 수 있습니다. CIMOM은 공급자가 기본적으로 쿼리 작업을 지원하지 않는 경우 쿼리에 대한 평가를 실행할 수 있습니다.
  • 이벤트 처리 소비자가 WMI 관리 리소스에 대한 변경 사항을 나타내는 이벤트에 가입할 수 있도록 합니다. 예를 들면, 논리 디스크 드라이브의 공간이 허용 가능한 임계값 이하로 떨어지는 시기를 나타내는 이벤트에 가입할 수 있습니다. CIMOM은 사용자가 지정한 간격으로 관리 리소스를 폴링하고 가입이 만족스러우면 이벤트 알림을 생성합니다.



상기 아키텍쳐 기반으로 동작과정을 살펴보면 아래와 같이 이해 할 수 있다.


1. 사용자는 WMI 스크립트로 작성된 언어를 사용하여 스크립트를 작성한다.

2. WMI 스크립팅 라이브러리는 사용자가 작성한 WMI 스크립트를 실행하기 위한 작업을 수행하고 이를 CIMOM으로 넘겨준다.

3. CIMOM에서는 해당 스크립트 작업의 보안작업이나 이벤트 등록을 위한 정보를 저장하기 위해 CIM 리포리토지에 저장하거나 또는 기존에 등록된 이벤트 등을 조회하는 작업등을 수행한다. 

4. CIMOM에서는 3의 작업을 수행하고 이를 명세하여 WMI 공급자에게 작업을 요청한다.

5. WMI 작업자는 관리 리소스에 CIMOM에서 요청한 작업에 대해 작업을 하도록 요청하고, 전달받은 작업내용을 다시 CIMOM에 전달한다.

6. CIMOM는 5에서 생성된 전달 작업을 다시 리포리토지에 기록하거나 사용자에게 돌려준다.



WMI 사용시 WMI 공급자 내역은 아래와 같습니다.


공급자DLL네임스페이스설명
Active Directory 공급자dsprov.dllroot\directory\ldapActive Directory 개체를 WMI에 매핑합니다.
이벤트 로그 공급자ntevt.dllroot\cimv2Windows 이벤트 로그를 관리합니다. 예를 들면, 이벤트 로그 설정 읽기, 백업, 지우기, 복사, 삭제, 모니터링, 이름 바꾸기, 압축, 압축 풀기 및 변경 작업을 수행합니다.
성능 카운터 공급자wbemperf.dllroot\cimv2원시 성능 데이터에 대한 액세스를 제공합니다.
레지스트리 공급자stdprov.dllroot\default레지스트리 키와 값을 읽고, 쓰고, 나열하고, 모니터링하고, 만들고 삭제합니다.
SNMP 공급자snmpincl.dllroot\snmpSNMP MIB 데이터에 대한 액세스를 제공하고 SNMP 관리 장치에서 트랩합니다.
WDM 공급자wmiprov.dllroot\wmiWDM 장치 드라이버의 정보에 대한 액세스를 제공합니다.
Win32 공급자cimwin32.dllroot\cimv2컴퓨터, 디스크, 주변 장치, 파일, 폴더, 파일 시스템, 네트워킹 구성 요소, 운영 체제, 프린터, 프로세스, 보안, 서비스, 공유, SAM 사용자 및 그룹 등에 대한 정보를 제공합니다.
Windows Installer 공급자msiprov.dllroot\cimv2설치된 소프트웨어 정보에 대한 액세스를 제공합니다.


기능에 따라 호출되어야 하는 네임스페이스는 다르며


대부분 사용자가 많이 사용하는 기능의 경우 root\cimv2 네임스페이스를 이용하여 사용자의 요청을 처리하게 됩니다.




WMI를 사용하기 위한 WMI 공급자 호출


WMI의 경우 Moniker 인터페이스를 사용하므로 기존의 COM 인터페이스를 사용하는것과 동일하게 GetObject를 사용하여 오브젝트 객체를 할당받아 속성이나 메소드를 사용하게 됩니다.


호출시 명령어는 아래와 같습니다.


Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\\root\cimv2")


winmgmts : Winmgmt is the WMI service within the SVCHOST process running under the LocalSystem account 

\\root\cimv2 : Win32 공급자를 사용하기 위한 메인스페이스


이후 Win32 공급자 메소드를 이용하여 각종 시스템 정보등을 취득 가능하다.

Comments