Windows

WMI 스크립팅 입문: 3부 (2003년 3월 13일)

_침묵_ 2005. 12. 20. 00:44

http://www.microsoft.com/Korea/MSDN/columns/Contents/scripting/scripting01142003/

 

WMI 스크립팅 입문: 3부

Greg Stemp, Dean Tsaltas, Bob Wells
Microsoft Corporation

Ethan Wilansky
Network Design Group

2003년 1월 23일

요약:WMI 스크립팅 라이브러리를 정의하고 이를 사용하여 WMI 관리 리소스에 액세스하고 관리하는 방법에 대해 설명합니다. 관리 리소스 인스턴스의 생성, 삭제 및 검색 등의 작업을 위해 WMI 스크립팅 라이브러리를 사용하여 만들 수 있는 7가지 기본 스크립트 유형을 살펴봅니다(22페이지/인쇄 페이지 기준).


스크립팅 입문을 기다리신 독자 여러분! 오랜만에 인사드립니다. Microsoft Windows 2000 Scripting Guide(나중에 자세하게 다룸)를 완성하는 중이었다는 등의 구구한 변명을 늘어놓는지 않겠습니다. 그럼 바로 시작해 볼까요? 이 문서에서는 지난 번 WMI 스크립팅 입문 과정에서 다루지 못했던 WMI 스크립팅 퍼즐의 나머지 조각, 즉 WMI 스크립팅 라이브러리에 대해 검토해 보겠습니다.

자세히 살펴 보기 전에 지금까지 다룬 내용을 잠시 복습해 봅시다.WMI 스크립팅 입문: 1부에서는 WMI 스크립팅과 관련된 WMI의 아키텍처 및 주요 구성 요소를 다루었습니다.WMI 스크립팅 입문: 2부에서는 CIM(Common Information Model), 즉 WMI 관리 리소스용 청사진(클래스 정의)을 갖고 있는 리포지토리에 대해서 설명했습니다. "이 페이지 등급" 검색 횟수를 통해 여러분 중 많은 사람이 2부를 읽지 않고 건너뛰었다는 것을 알고 있지만 여기에서는 여러분이 2부의 내용을 알고 있다고 가정합니다. 만일 모른다면 해당 자료를 직접 찾아보시기 바랍니다.

정의된 WMI 스크립팅 라이브러리

WMI 스크립팅 라이브러리란 무엇일까요? 이 질문에 답하기 위해서 잠시 유추해보겠습니다. 컴퓨터의 미디어 플레이어나 스테레오 시스템에 대해 잠시 생각해 봅시다. 모든 스테레오가 공통적으로 가지고 있는 것은 무엇입니까? 모두 볼륨 컨트롤, 고음 및 저음 컨트롤, 튜너(라디오), 이퀄라이저가 있습니다. 베토벤, 레드 제플린, 아트 오브 노이즈 등 어떤 음악을 듣건 간에 컨트롤이 작동하는 방식은 항상 똑같습니다.

완전히 똑같다고는 할 수 없지만 재미있게 비교해 보자면 WMI 스크립팅 라이브러리는 스테레오에 있는 컨트롤과 비슷하다고 할 수 있습니다. 즉, WMI 스크립팅 라이브러리는 WMI 관리 리소스에 액세스하고 관리할 수 있도록 해주는 일관성 있는 컨트롤 집합을 자동화 개체 형태로 제공합니다. 컴퓨터, 이벤트 로그, 운영 체제, 프로세스, 서비스를 관리하고 있는지 또는 원하는 리소스를 선택하는지는 문제가 되지 않습니다. WMI 스크립팅 라이브러리에 있는 개체는 항상 동일하게 작동합니다.

WMI 스크립팅 라이브러리의 자동화 개체가 제공하는 일관성은 WMI 스크립팅 라이브러리를 사용하여 실행할 수 있는 일련의 작업으로 가장 잘 전달됩니다. WMI 스크립팅 라이브러리를 사용하여 다음 7가지 기본 스크립트 유형을 만들 수 있습니다.

  1. WMI 관리 리소스의 인스턴스를 검색할 수 있습니다.
  2. WMI 관리 리소스의 속성을 읽을 수 있습니다.
  3. WMI 관리 리소스의 속성을 수정할 수 있습니다.
  4. WMI 관리 리소스의 메서드를 호출할 수 있습니다.
  5. WMI 관리 리소스의 새 인스턴스를 만들 수 있습니다.
  6. WMI 관리 리소스의 인스턴스를 삭제할 수 있습니다.
  7. WMI 관리 리소스의 생성, 수정 및/또는 삭제를 모니터링할 이벤트를 구독할 수 있습니다.

7가지 기본 스크립트 유형을 스크립트 템플릿으로 생각하면 됩니다. 그리고 볼륨 컨트롤이 CD, 카세트, 8트랙 테이프 또는 .wma 파일의 소리 크기를 조정하는 것처럼, WMI 스크립트 템플릿을 사용하여 WMI 관리 리소스를 관리할 수 있습니다. 한 가지 WMI 관리 리소스 유형을 관리할 수 있을 정도로 템플릿에 대해서 잘 이해하고 있으면 동일한 템플릿을 조정하여 다른 수백개의 WMI 관리 리소스를 쉽게 관리할 수 있습니다.

WMI 스크립팅 라이브러리 개체 모델

WMI 스크립팅 라이브러리를 만들었으므로 이제 전체 WMI 인프라를 제어할 수 있습니다. 섀시를 열고 안을 살펴 보십시오. 이 시리즈의1부에 있는 그림 3은 WMI 스크립팅 라이브러리가 %SystemRoot%\system32\wbem 디렉터리에 있는 wbemdisp.dll이라는 단일 자동화 구성 요소로 구현되는 것을 보여주었습니다.

WMI 스크립팅 라이브러리는 24개의 자동화 개체(Windows 2000 및 이전 버전에서는 19개)로 구성되며, 이 중 21개는 그림 1의 WMI 스크립팅 라이브러리 개체 모델 다이어그램에 나타나 있습니다. 이제 24개의 모든 개체에 대해서 자세히 배우기 전에 먼저 해서는 안될 일을 알아 봅시다. 사실, 그림 1에 있는 개체 중 두 세 개를 기본적으로 이해하고 있으면 앞에서 나열한 7개의 스크립트 템플릿 중 6개를 만들 수 있습니다. 그렇다면 이 개체는 무엇일까요? 너무 서두르지 말고 침착하게 생각해 봅시다.

Microsoft Windows XP 및 Windows Server 2003 버전의 wbemdisp.dll에 있는 24개의 자동화 개체 이외에 스크립팅 라이브러리에는 13개의 열거가 들어 있습니다. 열거는 관련 상수 그룹에 붙인 상상의 이름일 뿐입니다. 상수 그룹은 WMI SDK에 잘 설명되어 있으므로 여기에서는 다루지 않겠습니다. WMI 스크립팅 상수에 대한 자세한 내용은 WMI SDK의Scripting API Constants 

사용자 삽입 이미지
 를 참조하십시오.

여러 방법으로 WMI 스크립팅 라이브러리의 자동화 개체와 ADSI에서 제공하는 핵심 인터페이스를 비교할 수 있습니다. 이것은 무슨 뜻일까요? ADSI 핵심 인터페이스(예: IAD와 IADsContainer)는 개체의 클래스 및 특성에 상관없이 Active Directory의 스크립팅 개체에 일관된 접근법을 제공합니다. 마찬가지로, WMI 스크립팅 라이브러리의 자동화 개체는 WMI 관리 리소스에 일관된 스크립팅 모델을 제공합니다.

WMI 스크립팅 라이브러리(wbemdisp.dll)의 자동화 개체와 CIM 리포지토리(objects.data)에 있는 관리 리소스 클래스 정의간의 관계를 이해하는 것이 중요합니다.2부에서 설명했듯이 관리 리소스 클래스 정의는 WMI를 통해 제공되는 컴퓨터 리소스에 대한 청사진입니다. 청사진은 관리될 수 있는 리소스를 정의할 뿐 아니라 각 관리 리소스에 고유한 메서드 및 속성을 정의합니다.

다른 한편으로 WMI 스크립팅 라이브러리는 일반 용도로 사용할 수 있는 자동화 개체 집합을 제공하여 WMI를 인증하고 연결한 후 WMI 관리 리소스의 인스턴스에 액세스합니다. 일단 WMI 스크립팅 라이브러리를 사용하여 WMI 관리 리소스의 인스턴스를 얻으면 관리 리소스 클래스 정의에서 정의한 메서드 및 속성을 마치 스크립팅 라이브러리 자체의 일부였던 것처럼 액세스할 수 있습니다.

사용자 삽입 이미지

그림 1. WMI 스크립팅 라이브러리 개체 모델인 wbemdisp.dll

WMI 스크립팅 라이브러리 개체 모델 해석

그림 1은 처음 볼 때는 잘 이해되지 않지만 이 WMI 스크립팅 라이브러리 개체 모델을 통해 WMI 스크립팅 작업 방법 메커니즘을 잘 이해할 수 있습니다. 그림 1에서 볼 수 있는 줄은 원래 개체의 메서드를 호출하거나 속성을 액세스하여 얻은 개체를 가리킵니다. 예를 들어 SWbemLocatorConnectServer메서드를 호출하면SWbemServices개체가 반환됩니다.SWbemServicesExecNotificationQuery메서드를 호출하면SWbemEventSource개체가 반환됩니다. 다른 한편으로,SWbemServicesExecQuery또는InstancesOf메서드를 호출하면SWbemObjectSet컬렉션이 반환됩니다. 그리고SWbemServicesGet메서드를 호출하면SWbemObject가 반환됩니다.

이 시리즈의1부2부에 있는 WMI 스크립트와 개체 모델을 비교하여 어떻게 작동하는지 살펴 보십시오. 각 스크립트는 대부분의 WMI 스크립트에 공통되는 세 가지 기본 단계를 실행했습니다.

  1. 대상 컴퓨터에 있는 WMI 서비스에 연결하여 각 스크립트를 시작했습니다. 이 스크립트에서는 Microsoft Visual Basic Scripting Edition(VBScript)GetObject함수와 WMI 모니커인 "winmgmts:" 다음에 대상 컴퓨터 및 네임스페이스에 대한 WMI 개체 경로를 지정한 WMI 연결 문자열을 함께 사용했습니다.
    strComputer = "."  Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

    이런 식으로 WMI에 연결하면 그림 1에 있는SWbemServices개체에 대한 참조가 반환됩니다. 일단SWbemServices개체에 대한 참조를 얻으면SwbemServices메서드 중 하나를 호출할 수 있습니다. 주로 호출할 수 있는SWbemServices메서드는 생성 중인 WMI 스크립트 유형에 따라 달라집니다.

  2. 그런 다음 각 스크립트에서는SWbemServicesInstancesOf메서드를 사용하여 WMI 관리 리소스 인스턴스를 검색했습니다.
    Set colSWbemObjectSet = objSWbemServices.InstancesOf("Win32_Service")

    InstancesOf항상SWbemObjectSet컬렉션을 반환합니다. 그림 1의SWbemServicesSWbemObjectSet개체 사이에 줄이 표시되어 있듯이,SWbemObjectSetSWbemServices가 반환할 수 있는 세 가지 WMI 스크립팅 라이브러리 중 하나입니다.

  3. 마지막으로 각 스크립트에서는SWbemObjectSet의 인스턴스를 열거하여 WMI 관리 리소스 속성에 액세스했습니다.
    For Each objSWbemObject In colSWbemObjectSet    WScript.Echo "이름: " & objSWbemObject.NameNext

    그림 1에 나타나 있듯이,SWbemObjectSet컬렉션의 각 관리 리소스 인스턴스는SWbemObject로 표현됩니다.

WMI 스크립팅 라이브러리에 있는 24개의 자동화 개체 중에서 가장 중요한 세 가지 개체(즉, 먼저 배워야 하는 세 가지 개체)는SWbemServices,SWbemObjectSet,SWbemObject입니다. 그 이유는 무엇일까요?SWbemServices,SWbemObjectSetSWbemObject는 거의 모든 WMI 스크립트에 중요한 요소이기 때문입니다. 사실 ADSI 유추를 다시 살펴 보면SWbemServices,SWbemObjectSetSWbemObject가 WMI 스크립팅과 관련이 있고IADsIADsContainer는 ADSI 스크립팅과 관련이 있습니다. (팁: ADSI 스크립팅을 조금이라도 해보지 않은 분에게 알려 줄 한 가지 팁이 있습니다. ADSI 라이브러리에서 제공하는 60개의 인터페이스 중에서IADsIADsContainer를 가장 먼저 배우는 것이 좋습니다.)

SWbemServices는 로컬 또는 원격 컴퓨터의 WMI 네임스페이스에 대한 인증된 연결을 나타내는 개체입니다. 또한SWBemServices는 모든 WMI 스크립트에서 중요한 역할을 합니다. 예를 들어 관리 리소스의 모든 인스턴스를 검색하려면SWbemServicesInstancesOf메서드를 사용해야 합니다. 마찬가지로 WQL(WMI Query Language) 쿼리와 함께SWbemServicesExecQuery메서드를 사용하여 모든 관리 리소스 인스턴스 또는 그 하위 집합을 검색할 수 있습니다. 관리 환경에서 변경을 나타내는 이벤트를 구독하려면SWbemServicesExecNotificationQuery메서드를 사용합니다.

SWbemObjectSet는 0개 이상의SWbemObject개체로 구성된 컬렉션입니다. 왜 0일까요? 컴퓨터는 0개의 인스턴스, 즉 테이프 드라이브(Win32_TapeDrive 모델)를 가질 수 있기 때문입니다.SWbemObjectSet에서 각SWbemObject는 다음 중 하나를 나타낼 수 있습니다.

  1. WMI 관리 리소스 인스턴스
  2. 클래스 정의 인스턴스

SWbemObject는 관리 중인 리소스처럼 가장하는 다중 ID 개체입니다. 예를 들어 Win32_Process 관리 리소스를 검색하는 경우SWbemObject는 그림 2의 왼쪽에 보여지는 것처럼Win32_Process클래스 정의 이후에 모델화된 ID를 사용합니다. 반면 Win32_Service 관리 리소스 인스턴스를 검색하는 경우에는SWbemObject는 그림 2의 오른쪽에 보여지는 것처럼Win32_Service클래스 이후에 모델화된 ID를 사용합니다.

사용자 삽입 이미지

그림 2. Win32_Process 및 Win32_Service로 가장한 SWbemObject

그림 2를 자세히 살펴 보면SWbemObject가 두 가지 다른 메서드 및 속성 집합을 보여주고 있는 것을 알 수 있습니다. 밑줄로 끝나는 이름을 가진 위쪽 집합은SWbemObject에 속하고 wbemdisp.dll에 존재합니다. 밑줄은 관리 리소스의 클래스 정의에서 정의한 메서드 및 속성과의 이름 충돌을 막기 위해 사용됩니다.

아래 메서드 및 속성 집합은SWbemObject에 속하지 않습니다. 이 집합은 CIM에 있는 관리 리소스의 클래스 정의에서 정의합니다. 관리 리소스의 인스턴스를 검색할 때SWbemObject는 관리 리소스의 클래스 정의에서 정의한 메서드 및 속성에 동적으로 바인딩합니다.SWbemObject를 사용하면 마치SWbemObject의 일부였던 것처럼 관리 리소스의 클래스에 정의된 메소드를 호출하고 속성에 액세스할 수 있습니다. CIM에 정의된 관리 리소스로 몰핑하는SWBemObject의 기능은 WMI 스크립팅을 매우 직관적이게 해 줍니다. 인스턴스를 연결하고 검색하는 방법을 알게 되면 이제SWbemObject만 알면 됩니다.

자. 그러면 WMI 스크립팅 라이브러리 개체 모델에서 무엇을 알 수 있을까요? VBScript(또는 WSH)GetObject함수와 함께 WMI 모니커(winmgmts:)와 WMI 개체 경로(예: "[\\ComputerName][\Namespace][:ClassName][.KeyProperty='Value']")를 사용하여SWbemServicesSWbemObject를 직접 만들 수 있습니다. 반면SWbemLocator,SWbemLastError,SWbemObjectPath,SWbemNamedValueSet,SWbemSink,SWbemDateTimeSWbemRefresher개체는 VBScript(또는 WSH)CreateObject함수를 사용하여 만들어집니다. 나머지 개체는GetObject또는CreateObject를 사용하여 만들 수 없습니다. 대신 이 개체는 메서드를 호출하거나 속성에 액세스하여 얻을 수 있습니다.

또한 개체의 오른쪽 또는 바로 아래에 있는 보안 설명선 아이콘으로 표시되어 있듯이 WMI 스크립팅 라이브러리의 7개 개체는SWbemSecurity개체를 노출합니다.

특정 스크립팅 라이브러리 개체, 메서드 또는 속성에 대한 자세한 내용은WMI SDK Documentation 

사용자 삽입 이미지
 의Scripting API for WMI 
사용자 삽입 이미지
 를 참조하십시오. WMI 스크립팅 라이브러리의 기본 역학을 이해하려면 앞에서 나열한 WMI 스크립트 템플릿을 살펴 보십시오. WMI 스크립트 템플릿을 살펴 보기 전에 변수 명명 규칙에 대해 잠시 살펴 보겠습니다.

변수 명명 규칙에 대한 정보

다음 예제 스크립트에서 각 WMI 자동화 개체를 참조하는 데 사용된 변수 이름은 일관된 명명 규칙을 따릅니다. 각 변수는 WMI 스크립팅 라이브러리에 있는 자동화 개체 이름에 따라 명명되며 앞에 "obj"(개체 참조) 또는 "col"(컬렉션 개체 참조)이 붙습니다. 예를 들어SWbemServices개체를 참조하는 변수는 objSWbemServices로 명명됩니다.SWbemObject를 참조하는 변수는 objSWbemObject로 명명됩니다.SWbemObjectSet를 참조하는 변수는 colSWbemObjectSet로 명명됩니다.

이런 명명 규칙은 왜 중요할까요? 중요하지 않다고 말할 사람도 물론 있을 것입니다. 그러나 이런 명명 방법을 사용하면 WMI 스크립트에서 각기 다르게 작동하는 WMI 개체 유형을 이해하는 데 도움이 됩니다. 도움이 되면 좋고 도움이 안되는 경우에는 무시하면 됩니다. 염두에 두어야 할 다른 중요한 점은 개체 참조 변수 이름은 여러분이 좋아하는 어떤 이름이든 사용할 수 있다는 것입니다. foo and bar 또는 dog and cat과 같은 변수 이름을 선호한다면 사용해도 됩니다.SWbemServices개체에 대한 참조에 objSWbemServices라고 명명해야 한다는 필수 조항은 없습니다. 이 방법은 단지 저희가 사용하는 방법일 뿐입니다.

WMI 스크립트 템플릿에 대한 가이드

WMI는 배우기도 아주 어렵지만 사용하기는 훨씬 더 어렵다고 알려져 있습니다. 여러 면에서 볼 때 이러한 명성은 WMI가 실제로 어려워서라기 보다는 그 범위와 내용이 매우 방대하기 때문에 얻어진 것입니다. WMI를 사용하여 컴퓨터 하드웨어, 컴퓨터 소프트웨어 및 하드웨어와 소프트웨어 사이의 거의 모든 것을 관리할 수 있습니다. 많은 다양한 요소를 포함하는 기술은 어렵다고 생각하는 경향이 있습니다.

하지만 실제로 WMI를 사용하여 실행할 수 있는 많은 작업은 몇 안 되는 표준 방법 중 하나를 따릅니다. 예를 들어 이미 템플릿이 거의 모든 관리 리소스에 대한 정보를 반환하는 스크립트의 기초 역할을 어떻게 수행하는지 살펴 보았습니다. 이 시리즈의1부에서는 동일한 기본 스크립트(하나 또는 두 개의 사소한 수정)를 사용하여 설치된 메모리, 서비스, 이벤트 로그에 기록된 이벤트 등과 같이 전혀 다른 항목들에 대한 정보를 반환했습니다.

아래에서는 다음과 같은 작업에 사용할 수 있는 기본 WMI 스크립트 템플릿을 설명합니다.

  • 관리 리소스의 인스턴스를 검색합니다.
  • 관리 리소스의 속성을 표시합니다.
  • 관리 리소스의 속성을 수정합니다.
  • 관리 리소스의 메서드를 호출합니다.
  • 관리 리소스의 새 인스턴스를 만듭니다.
  • 관리 리소스의 인스턴스를 삭제합니다.
  • 관리 리소스의 생성, 수정 및/또는 삭제를 모니터링할 이벤트를 구독합니다.

시작하기 전에 한 가지 중요한 점을 완전히 이해하고 넘어가야 합니다. 즉, WMI 관리 리소스에 할 수 있는 작업과 할 수 없는 작업은 WMI 스크립팅 라이브러리가 아니라 CIM(Common Information Model) 리포지토리의 관리 리소스 청사진(즉, 클래스 정의)에서 관리합니다. 이 시리즈의2부가 중요한 이유가 바로 여기에 있습니다. 아직도 잘 이해가 안된다면 예를 몇 개 들어 보겠습니다.

쓰기 가능한 속성만을 수정할 수 있습니다. 쓰기 가능 속성인지는 어떻게 알 수 있을까요? WbemTest.exe, WMI CIM Studio, WMIC.exe 또는 속성의 Write 한정자를 살펴 보는 스크립트를 사용합니다. (속성 한정자를 살펴 보는 방법에 대해서는 이 시리즈의2부에 있는 그림 7 또는 목록 3을 참조하십시오.) 속성에 대해 Write 한정자가 정의되어 있지 않으면 기본값은 FALSE이며 읽기 전용 속성이라는 의미입니다.

또 다른 예를 들어 봅시다. 리소스의 클래스 정의가SupportsCreate클래스 한정자를 TRUE로 설정하면 관리 리소스의 새 인스턴스를 만들 수 있습니다. 관리 리소스의 클래스 정의가SupportsCreate를 TRUE로 설정하는지는 어떻게 알 수 있을까요? 이 시리즈의2부에 있는 그림 7과 목록 3의 관리 리소스의 클래스 한정자를 다시 살펴 보십시오.

참고   관리 리소스의 클래스 정의가 적합한 한정자를 설정하지 못해도 실제로는 일부 관리 리소스를 생성, 업데이트 및/또는 삭제할 수 있습니다. 이런 문제는 수정되고 있습니다.

마지막으로 한 가지 더 알아둘 것이 있습니다. 다음에 나오는 모든 스크립트 템플릿은 로컬 컴퓨터에서 작동하도록 디자인되었습니다. 따라서 변수 strComputer의 값을 마침표(".")로 설정되어 있습니다. 원격 컴퓨터에 대한 스크립트를 실행하려면 strComputer의 값을 원격 컴퓨터의 이름으로 설정하면 됩니다. 예를 들어 다음 코드 줄은 atl-dc-01이라는 컴퓨터에 대해서 스크립트를 실행합니다.

strComputer = "atl-dc-01"

관리 리소스 인스턴스 검색

지금까지SWbemServicesInstancesOf메서드를 사용하여 목록 1과 같은 관리 리소스 인스턴스를 검색했습니다.

목록   SWbemServices InstancesOf를 사용하여 서비스 정보 검색

strComputer = "."  Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")Set colSWbemObjectSet = objSWbemServices.InstancesOf("Win32_Service")For Each objSWbemObject In colSWbemObjectSet    WScript.Echo "표시 이름:  " & objSWbemObject.DisplayName & vbCrLf & _                 "   상태:      " & objSWbemObject.State       & vbCrLf & _                 "   시작 모드: " & objSWbemObject.StartMode   & vbCrLfNext

InstancesOf가 목적을 이루는 동안 인스턴스나 속성의 하위 집합만 원하는 상황이라면 어떻게 됩니까? 인스턴스 및 속성 검색을 최적화하여 네트워크 트래픽을 최대한 줄이려는 상황을 가정해 봅시다. WMI에서 다양하고 강력한 쿼리 기능을 지원한다는 것을 알면 반가울 것입니다.

WIM 쿼리는 미리 정의된 일부 기준에 일치하는 관리 리소스 요청을 실행하는 과정을 뜻합니다. 예를 들어 WMI 쿼리는 "중지됨" 상태인 StartMode of Auto로 이러한 서비스만 요청합니다.

WMI 쿼리는 관리 리소스의 인스턴스 및 해당 속성을 검색하는 데InstancesOf메서드보다 효과적인 메커니즘을 제공합니다. WMI 쿼리는 쿼리에 일치하는 인스턴스 및 속성만 반환하는 반면,InstancesOf는 항상 각 인스턴스에 대한 모든 속성과 지정된 리소스의 모든 인스턴스를 반환합니다. 또한 쿼리는 스크립트를 실행하는 소스 컴퓨터에서가 아닌, 개체 경로에서 식별된 대상 컴퓨터에서 처리됩니다. 따라서 WMI 쿼리는InstancesOf와 같인 비효율적인 데이터 검색 메커니즘에서 발생하는 네트워크 사용량을 상당히 줄일 수 있습니다.

WMI를 쿼리하려면,WMI Query Language(WQL) 

사용자 삽입 이미지
 를 사용하여 쿼리 문자열을 만듭니다. 쿼리 문자열은 성공적으로 일치하는 결과를 얻기 위해 만족시켜야 하는 기준을 정의합니다. 쿼리 문자열이 정의되고 나면 쿼리는SWbemServicesExecQuery메서드를 사용하여 WMI 서비스로 제출됩니다. 쿼리를 만족시키는 관리 리소스의 인스턴스는SWbemObjectSet컬렉션 형태로 스크립트에 반환됩니다.

WQL 및ExecQuery메서드(InstancesOf가 아닌)를 사용하면 관심 있는 항목만 반환하는 스크립트를 융통성있게 작성할 수 있습니다. 예를 들어 목록 2에서처럼 기본 WQL 쿼리를 사용하여 주어진 관리 리소스의 모든 인스턴스 속성을 반환할 수 있습니다. 이것은InstancesOf메서드에서 반환하는 것과 동일한 정보입니다. 목록 1과 2를 비교해 보면 세째 줄의 굵게 표시된 부분이 두 스크립트 간의 유일한 차이점이라는 것을 알 수 있습니다.

목록   SWbemServices ExecQuery를 사용하여 서비스 정보 검색

strComputer = "."  Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")Set colSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM Win32_Service")For Each objSWbemObject In colSWbemObjectSet    WScript.Echo "표시 이름:  " & objSWbemObject.DisplayName & vbCrLf & _                 "   상태:      " & objSWbemObject.State       & vbCrLf & _                 "   시작 모드: " & objSWbemObject.StartMode   & vbCrLfNext

또한 WQL을 사용한 대상 쿼리, 즉 다음과 같은 작업을 할 수 있는 쿼리를 만들 수도 있습니다.

  • 관리 리소스의 모든 인스턴스의 선택된 속성만 반환합니다.
    "SELECT DisplayName, State, StartMode FROM Win32_Service"
  • 클래스의 선택된 인스턴스의 모든 속성을 반환합니다.
    "SELECT * FROM Win32_Service WHERE State = 'Stopped'"
  • 클래스의 선택된 인스턴스의 선택된 속성을 반환합니다.
    "SELECT DisplayName,State,StartMode FROM Win32_Service WHERE State='Stopped'"

대상 쿼리를 만들면 데이터가 반환되는 속도가 눈에 띄게 향상되는 경우도 있습니다. 예를 들어 모든 이벤트 로그에 있는 모든 이벤트를 반환하는 것보다 Application 이벤트 로그에서 EventCode 0을 갖고 있는 이벤트만 반환하는 것이 훨씬 더 빠릅니다. 대상 쿼리를 사용하면 반환된 데이터로 더욱 쉽게 작업할 수 있습니다. 예를 들어 Application 이벤트에서 EventCode 0을 가진 이벤트만 필요하다고 가정해 봅시다. 대상 쿼리를 사용하면 이런 항목만 반환됩니다. 반면,InstancesOf는 모든 이벤트를 반환하므로 하나씩 개별적으로 살펴 보고 이것이 1) Application 이벤트 로그에서 나온 것인지 2) EventCode 0을 갖고 있는지 알아내야 합니다. 이 작업이 가능하기는 하지만 덜 효율적이며 사용자의 작업이 추가로 더 필요합니다.

대상 쿼리는 반환된 데이터의 양을 줄일 수 있는데 이것은 네트워크에서 실행되는 스크립트에 대한 중요한 고려 사항입니다. 표 1에는 다른 쿼리 유형에 대한 상대 수치가 나타나 있습니다. 여기서 알 수 있듯이 여러 쿼리 유형에서 반환하는 데이터 양에는 상당한 차이가 있을 수 있습니다.

표 1.   서로 다른 WMI 인스턴스 검색 메서드 및 쿼리 비교

메서드/WQL 쿼리반환된 바이트
objSWbemServices.InstancesOf("Win32_Service")157,398
objSWbemServices.ExecQuery("SELECT * FROM Win32_Service")156,222
objSWbemServices.ExecQuery("SELECT Name FROM Win32_Service")86,294
objSWbemServices.ExecQuery("SELECT StartMode FROM Win32_Service")88,116
objSWbemServices.ExecQuery("SELECT StartMode FROM Win32_Service WHERE State='Running'")52,546
objSWbemServices.ExecQuery("SELECT StartMode, State FROM Win32_Service WHERE State='Running'")56,314
objSWbemServices.ExecQuery("SELECT * FROM Win32_Service WHERE Name='WinMgmt'")27,852
objSWbemServices.Get("Win32_Service.Name='WinMgmt'")14,860

ExecQueryInstancesOf보다 뛰어나다는 사실을 확신하기를 바랍니다. 이제 목록 2를 WMI 관리 리소스 인스턴스 검색에 쉽게 수정할 수 있는 일반 WMI 스크립트 템플릿으로 만들어 봅시다. 목록 3에는 첫 번째 템플릿이 들어 있습니다.

목록 3.   관리 리소스 인스턴스 검색 템플릿

strComputer = "."strNamespace = "\root\cimv2"strClass = "Win32_Service"Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & strNamespace)Set colSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass)For Each objSWbemObject In colSWbemObjectSet    WScript.Echo "표시 이름: " & objSWbemObject.DisplayName    WScript.Echo "상태:        " & objSWbemObject.State    WScript.Echo "시작 모드:   " & objSWbemObject.StartModeNext

다른 WMI 클래스와 함께 이 템플릿을 사용하려면

  1. strClass의 값을 대상 관리 리소스에 적합한 WMI 클래스로 설정합니다.
  2. 필요한 경우 strNamespace의 값을 대상 클래스에 대한 WMI 네임스페이스로 설정합니다.
  3. 속성 및 값을 반향시키는 For Each 루프 내의 명령문을 바꿉니다. 다음 줄을 제거하고 표시되는 속성 값에 적합한 코드 줄로 바꿉니다.
    WScript.Echo "표시 이름: " & objSWbemObject.DisplayNameWScript.Echo "상태:        " & objSWbemObject.StateWScript.Echo "시작 모드:   " & objSWbemObject.StartMode
팁   많은 인스턴스를 반환하는 관리 리소스로 작업하고 있다면(여기서 많은 인스턴스란 1000개 이상의 인스턴스라고 정의하겠음), 선택 플래그를 사용해서ExecQuery의 동작을 최적화할 수 있습니다. 예를 들어ExecQuery를 사용하여 Event Log 레코드(Win32_NTLogEvent 클래스로 모델화됨)를 쿼리한다고 가정해 봅시다. 이미 알고 있듯이 Event Log(s)는 수천 개의 레코드를 포함할 수 있습니다. 기본적으로 Event Log 쿼리와 같이 많은 결과 집합을 반환하는 쿼리와 관련된 성능 문제를 발견할 수도 있습니다. 그 이유는 WMI가 인스턴스 전부 또는 일부에 대한(또는 Event Log 레코드 전부 또는 일부에 대한)SWbemObject참조를 캐시하는 방식과 관련이 있습니다. 이러한 문제를 피하기 위해서는 아래에서 설명하는 것처럼 포워드 전용SWbemObjectSet를 반환하도록ExecQuery를 사용하면 됩니다.
strComputer = "."strNamespace = "\root\cimv2"strClass = "Win32_NTLogEvent"Const wbemFlagReturnImmediately = &h10Const wbemFlagForwardOnly = &h20Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & strNamespace)Set colSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass, _                        "WQL" _                        wbemFlagReturnImmediately + wbemFlagForwardOnly)' 나머지 스크립트를 여기에 삽입합니다(예: For Each Next 루프)...
참고   wbemFlagReturnImmediately플래그(이 플래그는 앞에서 잠깐 다룬 열거 중 하나에 정의됨)는 기본ExecQuery동작이며 반동기적입니다. 최적화 방법 중 중요한 요소는wbemFlagForwardOnly플래그를 추가하는 것입니다.wbemFlagReturnImmediatelywbemFlagForwardOnly를 함께 사용하면 포워드 전용 열거자가 나타납니다. 포워드 전용 열거자는 WMI가SWbemObjectSet에 개체에 대한 참조를 유지하지 않기 때문에 기본 열거자보다 더 빨리 실행합니다.

관리 리소스 속성 표시

목록 3에 있는 스크립트의 한가지 제한 사항은 검색 및 표시할 모든 속성의 이름을 미리 알아야 한다는 것입니다. 리소스의 모든 속성 값을 표시하고 싶지만 속성의 이름을 모르거나 각 속성 값을 표시하는 데 필요한 40 또는 50개의 코드 줄을 입력하고 싶지 않다면 어떻게 해야 할까요? 이런 경우 목록 4의 템플릿을 사용할 수 있는데 이 템플릿은 클래스에 있는 각 속성 값을 자동으로 검색하여 표시합니다.

목록 4.   Scriptomatic lite 템플릿

strComputer = "."strNamespace = "\root\cimv2"strClass = "Win32_Process"Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & strNamespace)Set colSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass)Wscript.Echo "Scriptomatic Lite - 클래스: " & strClassWscript.Echo "===========================" & String(Len(strClass), "=") & vbCrLfintInstance = 1For Each objSWbemObject In colSWbemObjectSet    WScript.Echo "인스턴스: " & intInstance & vbCrLf & "--------------"    For Each objSWbemProperty In objSWbemObject.Properties_        strPropertyValue = ConvertPropertyValueToString(objSWbemProperty.Value)        WScript.Echo objSWbemProperty.Name & ": " & strPropertyValue    Next    WScript.Echo    intInstance = intInstance + 1NextFunction ConvertPropertyValueToString(ByVal PropertyValue)    If IsObject(PropertyValue) Then        ConvertPropertyValueToString = "<CIM_OBJECT (embedded SWbemObject)>"    ElseIf IsNull(PropertyValue) Then        ConvertPropertyValueToString = "<NULL>"    ElseIf IsArray(PropertyValue) Then        ConvertPropertyValueToString = Join(PropertyValue, ",")    Else        ConvertPropertyValueToString = CStr(PropertyValue)    End IfEnd Function

다른 WMI 클래스와 함께 이 템플릿을 사용하려면

  1. strClass의 값을 대상 관리 리소스에 적합한 WMI 클래스로 설정합니다.
  2. 필요한 경우 strNamespace의 값을 대상 클래스에 대한 WMI 네임스페이스로 설정합니다.

관리 리소스 속성 수정

Windows 2000에서 WMI는 주로 읽기 전용 기술입니다. Windows 2000 root\cimv2 네임스페이스에 정의된 4,395개 속성 중에서 39개만 쓰기 가능한 속성입니다. Microsoft Windows XP에서는 그 수가 더 많아져서 대략 6560개 속성 중 145개가 쓰기 가능한 속성입니다. 이 수는 Windows Server 2003에서는 더욱 많아졌습니다.

목록 5의 템플릿은 쓰기 가능한 속성을 수정하는 방법을 보여줍니다. 스크립트는Win32_OSRecoveryConfiguration클래스로 모델화된 관리 리소스의 모든 인스턴스를 검색합니다. 이 경우 클래스에는 단 하나의 인스턴스만 포함됩니다. 스크립트는 세 개의 속성(DebugInfoType,DebugFilePath,OverWriteExistingDebugFile)에 대한 새 값을 제공한 다음,SWbemObjectPut_메서드를 사용하여 변경 사항을 적용하고 운영 체제 복구 옵션을 구성합니다.Put_메서드를 호출하지 않으면 변경 사항이 적용되지 않습니다.

참고   이 템플릿은 쓰기 가능한 속성에만 사용할 수 있습니다. 읽기 전용 속성을 변경하려고 하면 오류가 발생합니다. 쓰기 가능한 속성인지 알려면 속성의 Write 한정자를 살펴 보십시오.

목록 5.   관리 리소스의 쓰기 가능한 속성을 수정하는 템플릿

strComputer = "."strNamespace = "\root\cimv2"strClass = "Win32_OSRecoveryConfiguration"Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & strNamespace)Set colSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass)For Each objSWbemObject In colSWbemObjectSet    objSWbemObject.DebugInfoType = 1    objSWbemObject.DebugFilePath = "c:\tmp\memory.dmp"    objSWbemObject.OverWriteExistingDebugFile = False    objSWbemObject.Put_Next

For Each 루프에서SWbemObject가 사용되는 방식은 다음과 같습니다. 1)Win32_OSRecoveryConfiguration클래스에서 정의한 속성에 직접 액세스하고 수정합니다. 2) 자체Put_메서드를 호출하여 변경 사항을 적용합니다.

쓰기 가능한 속성을 구현하는 다른 WMI 클래스와 함께 이 템플릿을 사용하려면

  1. strClass의 값을 대상 관리 리소스에 적합한 WMI 클래스로 설정합니다.
  2. 필요한 경우 strNamespace의 값을 대상 클래스에 대한 WMI 네임스페이스로 설정합니다.
  3. 새 속성 값을 구성하는 For Each 루프 내의 명령문을 바꿉니다. 다음 줄을 제거하고 수정되는 속성에 적합한 코드 줄로 바꿉니다.
    objSWbemObject.DebugInfoType = 1objSWbemObject.DebugFilePath = "c:\tmp\memory.dmp"objSWbemObject.OverWriteExistingDebugFile = False

관리 리소스 메서드 호출

관리 리소스의 클래스 정의에 정의되어 있는 메서드는 관리 리소스에서 작업을 실행할 수 있게 해줍니다. 예를 들어Win32_Service클래스에는 서비스를 시작 및 중단시키는 작업을 수행하게 해주는 메서드가 있습니다.Win32_NTEventlogFile클래스에는 이벤트 로그를 백업 및 지우는 메서드가 있습니다.Win32_OperatingSystem클래스에는 컴퓨터를 다시 부팅하거나 종료시키는 메서드가 있습니다.

목록 6은 WMI 관리 리소스 메서드를 호출하는 스크립트 작성에 사용할 수 있는 템플릿을 제공합니다. 이 특정 스크립트는Win32_Service클래스의StopService메서드를 사용하여 로컬 컴퓨터에서 Alerter 서비스를 중지시킵니다.

참고   관리 리소스의 클래스 정의에 정의된 메서드를 호출하기 전에 메서드를 구현해야 합니다. 메서드가 구현되었는지는 어떻게 알 수 있을까요? 메서드의 구현된 한정자를 살펴 봅니다. TRUE 값은 메서드가 공급자에서 제공한 구현을 가지고 있음을 나타냅니다. 메서드가 구현되어도 일부 메서드는 구현된 한정자를 정의하지 않는다는 사실을 알아야 합니다. 아래에 있는Win32_ServiceStopService메서드는 이러한 메서드의 예입니다. 메서드가 구현되었는지 아닌지를 알아내는 아래 코드 줄을 사용할 때는 약간의 시행 착오가 있을 수 있습니다. 앞서 말했듯이 이런 문제는 수정되고 있습니다.

목록 6.   관리 리소스 메서드 호출 템플릿

strComputer = "."strNamespace = "\root\cimv2"strClass = "Win32_Service"strKey = "Name"strKeyValue = "Alerter"Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & strNamespace)Set colSWbemObjectSet = objSWbemServices.ExecQuery _    ("SELECT * FROM " & strClass & " WHERE " & strKey & "='" & strKeyValue & "'")For Each objSWbemObject in colSWbemObjectSet     objSWbemObject.StopService()Next

다른 WMI 클래스와 함께 이 템플릿을 사용하려면

  1. strClass의 값을 대상 관리 리소스에 적합한 WMI 클래스로 설정합니다.
  2. 필요한 경우 strNamespace의 값을 대상 클래스에 대한 WMI 네임스페이스로 설정합니다.
  3. strKey의 값을 WHERE 절의 기반을 형성하는 속성 이름으로 설정합니다.
  4. strKeyValue의 값을 strKey에 적합한 값으로 설정합니다.
  5. 메서드를 호출하는 For Each 루프 내의 명령문을 바꿉니다. 다음 줄을 제거하고 호출되는 메서드에 적합한 코드 줄로 바꿉니다. 필요한 경우 적합한 메서드 매개 변수를 포함해야 합니다.
    objSWbemObject.StopService()

관리 리소스의 새 인스턴스 생성

일부 WMI 클래스는 모델화한 리소스의 새 인스턴스를 만들 수 있게 해줍니다. 예를 들어Win32_Environment클래스를 사용하여 환경 변수를 만들 수 있고Win32_Process클래스를 사용하여 프로세스를 만들 수 있으며Win32_Share클래스를 사용하여 공유 리소스를 만들어 명명할 수 있습니다.

리소스의 새 인스턴스를 만들기 전에 관리 리소스의 클래스가 생성 작업을 지원하는지 확인해야 합니다. 이때 클래스의SupportsCreate식별자를 살펴보면 됩니다. TRUE 값은 클래스가 인스턴스의 생성을 지원함을 나타냅니다. 기본값은 FALSE입니다. 일단 클래스가 생성 작업을 지원한다는 것을 알아내면 새 인스턴스를 만드는 데 사용되는 메서드를 결정해야 합니다. 새 인스턴스를 만드는 방법은 다음 두 가지가 있습니다.

  1. 클래스가PutInstance값으로CreateBy클래스 한정자를 정의하는 경우SWbemObjectSpawnInstance_Put_메서드를 사용하여 새 인스턴스를 만듭니다.
  2. CreateBy클래스 한정자에 할당된 값이PutInstance이외의 값(예:Create)인 경우,CreateBy한정자가 식별한 메서드를 사용하여 새 인스턴스를 만듭니다.

각각에 대한 템플릿을 살펴 봅시다.

목록 7은 리소스의 클래스 정의가SupportsCreate를 TRUE로 설정하고CreateByPutInstance로 설정할 때 어떻게 리소스의 인스턴스를 만드는지 보여줍니다. 대상 컴퓨터에서 WMI에 연결한 이후에는 생성하려는 대상에 대한 청사진(즉, 클래스 정의)을 먼저 얻어야 합니다. 이렇게 하려면SWbemServicesGet메서드를 사용하여 클래스의 검색 인스턴스가 아닌 실제 WMI 클래스를 반입합니다. 클래스를 나타내는 개체를 얻고 나면SWbemObjectSpawnInstance_메서드를 사용하여 클래스의 새로운 "빈" 인스턴스를 만듭니다. 새 인스턴스의 속성을 설정하고SWbemObjectPut_메서드를 호출하여 새 인스턴스를 만듭니다.

목록 7.   SpawnInstance_ 및 Put_을 사용하여 새 인스턴스를 생성하는 템플릿

strComputer = "."strNamespace = "\root\cimv2"strClass = "Win32_Environment"Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & strNamespace)Set objSWbemObject = objSWbemServices.Get(strClass)Set objNewSWbemObject = objSWbemObject.SpawnInstance_()objNewSWbemObject.Properties_.Item("Name") = "TMPSHARE"objNewSWbemObject.Properties_.Item("UserName") = "<SYSTEM>"objNewSWbemObject.Properties_.Item("VariableValue") = "c:\tmp"objNewSWbemObject.Put_

PutInstance를 지원하는 다른 WMI 클래스와 함께 이 템플릿을 사용하려면

  1. strClass의 값을 대상 관리 리소스에 적합한 WMI 클래스로 설정합니다.
  2. 필요한 경우 strNamespace의 값을 대상 클래스에 대한 WMI 네임스페이스로 설정합니다.
  3. 환경 변수에 대한 값을 구성하는 명령문을 바꿉니다. 다음 줄을 제거하고 생성될 개체에 적합한 코드 줄로 바꿉니다.
    objNewSWbemObject.Properties_.Item("Name") = "TMPSHARE"objNewSWbemObject.Properties_.Item("UserName") = "<SYSTEM>"objNewSWbemObject.Properties_.Item("VariableValue") = "c:\tmp"
팁   SWbemObjectSpawnInstance_Put_메서드를 사용하여 새 인스턴스를 만들 때 클래스의 모든 키 속성에 대한 값을 제공해야 합니다. 예를 들어 목록 7에서 사용된Win32_Environment클래스는NameUserName두 개의 키 속성을 정의합니다. 클래스의 키 속성은 어떻게 결정할까요? WbemTest.exe, WMI CIM Studio, WMIC.exe 또는 속성의Key한정자를 살펴 보는 스크립트를 사용합니다.

목록 8은 리소스의 클래스 정의가 자체 생성 메서드를 제공할 때 리소스의 인스턴스를 만드는 방법을 보여줍니다. 대상 컴퓨터에서 WMI에 연결한 이후에는 생성하려는 대상에 대한 청사진(즉, 클래스 정의)을 먼저 얻어야 합니다. 이렇게 하려면SWbemServicesGet메서드를 사용하여 클래스의 검색 인스턴스가 아닌 실제 WMI 클래스를 반입합니다. 클래스를 나타내는 개체를 갖게 되면SWbemObject를 사용하여 클래스의CreateBy한정자가 식별한 메서드를 호출합니다. 목록 8의 스크립트 템플릿은Win32_Share Create메서드를 사용하여 새 공유 폴더를 만듭니다.

목록 8.   관리 리소스 메서드를 사용하여 새 인스턴스를 생성하는 템플릿

strComputer = "."strNamespace = "\root\cimv2"strClass = "Win32_Share"Const SHARED_FOLDER = 0strPath = "c:\tmp"strShareName = "tmp"intMaximumAllowed = 1strDescription = "임시 공유"Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & strNamespace)Set objSWbemObject = objSWbemServices.Get(strClass)intReturnValue = objSWbemObject.Create(strPath, _                                       strShareName, _                                       SHARED_FOLDER, _                                       intMaximumAllowed, _                                       strDescription)WScript.Echo "반환 값: " & intReturnValue

사용자 지정 생성 메서드를 제공하는 다른 WMI 클래스와 함께 이 템플릿을 사용하려면

  1. strClass의 값을 대상 관리 리소스에 적합한 WMI 클래스로 설정합니다.
  2. 필요한 경우 strNamespace의 값을 대상 클래스에 대한 WMI 네임스페이스로 설정합니다.
  3. 생성 메서드에 전달된 매개 변수를 나타내는 변수 초기화 문을 바꿉니다. 다음 줄을 제거하고 생성될 개체에 적합한 코드 줄로 바꿉니다.
    Const SHARED_FOLDER = 0strPath = "c:\tmp"strShareName = "tmp"intMaximumAllowed = 1strDescription = "임시 공유"
  4. 생성 중인 관리 리소스에 적합한 메서드로Win32_Share Create메서드 호출을 바꿉니다. 다음 줄을 제거하고 생성될 개체에 적합한 코드 줄로 바꿉니다.
    intReturnValue = objSWbemObject.Create(strPath, _                                       strShareName, _                                       SHARED_FOLDER, _                                       intMaximumAllowed, _                                       strDescription)
팁   관리 리소스의 클래스 정의에서 제공하는 메서드를 사용하여 새 인스턴스를 만들 때 메서드에서 정의한 필수 매개 변수에 대한 값을 제공해야 합니다. 예를 들어 목록 8에서 사용된Win32_Share클래스는 세 가지 필수 매개 변수(Path, Name, Type)를 정의합니다. 메서드의 필수 매개 변수는 어떻게 결정할까요? WMI SDK에서 관리 리소스의클래스 정의 
사용자 삽입 이미지
 를 참조하십시오.

관리 리소스 인스턴스 삭제

관리 리소스의 새 인스턴스를 만들 수 있으면 인스턴스를 삭제할 수도 있습니다. 사실 삭제할 수 있는 관리 리소스 인스턴스를 관리하는 규칙은 생성 작업을 관리하는 규칙과 매우 유사합니다. 필수 조건을 살펴본 다음 예를 몇 개 살펴 보겠습니다.

리소스의 인스턴스를 삭제하기 전에 관리 리소스의 클래스가 삭제 작업을 지원하는지 확인해야 합니다. 이 작업을 할 때 클래스의SupportsDelete한정자를 살펴봅니다. TRUE 값은 클래스가 삭제를 지원함을 나타냅니다. 기본값은 FALSE입니다. 일단 클래스가 삭제를 지원한다는 것을 알아내면 인스턴스 삭제에 사용되는 메서드를 결정해야 합니다. 두 가지 방법으로 인스턴스를 삭제할 수 있습니다.

  1. 클래스가DeleteInstance값으로DeleteBy클래스 한정자를 정의하는 경우SWbemServicesDelete또는SWbemObjectDelete_메서드를 사용하여 인스턴스를 삭제할 수 있습니다.
  2. DeleteBy클래스 한정자에 할당된 값이DeleteInstance이외의 값(예: delete)인 경우DeleteBy한정자가 식별한 메서드를 사용하여 인스턴스를 삭제합니다.

목록 9와 10은 목록 7에서 만들어진 환경 변수를 삭제하는 방법을 보여줍니다. 목록 9는SWbemServicesDelete메서드를 사용하고, 목록 10은SWbemObjectDelete_메서드를 사용합니다. 리소스의 클래스 정의가SupportsDelete를 TRUE로 설정하고DeleteByDeleteInstance로 설정할 때 목록 9 또는 10을 사용합니다.

목록 9.   SWbemServices Delete 메서드를 사용하여 인스턴스를 삭제하는 템플릿

strComputer = "."strNamespace = "\root\cimv2"strInstance = "Win32_Environment.Name='TMPSHARE',UserName='<SYSTEM>'"Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & strNamespace)objSWbemServices.Delete strInstance

목록 10.   SWbemObject Delete_ 메서드를 사용하여 인스턴스를 삭제하는 템플릿

strComputer = "."strNamespace = "\root\cimv2"strInstance = "Win32_Environment.Name='TMPSHARE',UserName='<SYSTEM>'"Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & strNamespace)Set objSWbemObject = objSWbemServices.Get(strInstance)objSWbemObject.Delete_

DeleteInstance를 지원하는 다른 WMI 클래스와 함께 이 템플릿을 사용하려면

  1. strInstance의 값을 대상 관리 리소스 인스턴스에 적합한 WMI 클래스, 키, 키 값으로 설정합니다.

목록 11에서는 목록 8에서 만든 공유 폴더를 삭제하면서 리소스의 클래스 정의에서 자체 삭제 메서드를 제공할 때 리소스의 인스턴스를 삭제하는 방법을 보여 줍니다. 잠시 목록 10과 11을 비교해 봅시다. strInstance에 할당된 값 외에 다른 차이점이 보입니까? 목록 10은SWbemObjectDelete_메서드(밑줄에 주의)를 사용하여 관리 리소스의 클래스 정의가DeleteBy클래스 한정자를DeleteInstance로 설정할 때 인스턴스를 삭제합니다. 반면 목록 11은Win32_Share Delete메서드를 사용하고 있습니다.

목록 11.   관리 리소스 메서드를 사용하여 인스턴스를 삭제하는 템플릿

strComputer = "."strNamespace = "\root\cimv2"strInstance = "Win32_Share.Name='tmp'"Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & strNamespace)Set objSWbemObject = objSWbemServices.Get(strInstance)objSWbemObject.Delete

사용자 지정 삭제 메서드를 제공하는 다른 WMI 클래스와 함께 이 템플릿을 사용하려면

  1. strInstance의 값을 대상 관리 리소스 인스턴스에 적합한 WMI 클래스, 키, 키 값으로 설정합니다.

이벤트 구독

자. 이제 프로그래머들의 첫 번째 미덕인 게으름을 시험할 때인 것 같습니다. 걱정하지 마십시오. 이벤트 구독에 대해서도 다룰 것입니다. 그러나 여기에서 이벤트 구독을 다루기보다는 TechNet의Tales from the Script 

사용자 삽입 이미지
 칼럼의A Brief Introduction to WMI Events 
사용자 삽입 이미지
 를 소개해 드립니다. 이 사이트에서 WMI 이벤트 구독에 대한 소개 뿐 아니라 다른 스크립팅 소스에 대한 내용도 찾아볼 수 있습니다.

결론

이 기사를 마지막으로 WMI 스크립팅에 대한 설명을 마치겠습니다. 물론 다룰 내용이 더 많기는 합니다. 여러분이 알고 싶은 스크립팅 클리닉 주제에 대한 제안을 보내주시면 기꺼이 경청하겠습니다.scripter@microsoft.com으로 메일을 보내시거나 이 페이지의 맨 위에 있는 사용자 의견란에 의견을 남겨 주십시오.

마지막으로 말씀드릴 것이 있습니다. 이 기사의 시작 부분에서 언급했던 시스템 관리 자동화 서적인Microsoft Windows 2000 Scripting Guide 

사용자 삽입 이미지
 를 기억하십니까? 기술 서적을 아주 저렴한 가격으로 판매하는 온라인 서점인Bookpool 
사용자 삽입 이미지
 에서 지금 바로 한 부 구입하시는 것이 좋습니다. 시간과 비용을 절약하려는 분들을 위해 이 책 전체(1328페이지)를온라인 
사용자 삽입 이미지
 으로 게시했으므로 이용하시기 바랍니다. 아래의 스크립팅 클리닉 팀이 여러분의 도움 요청에 신속하게 답변을 드리지 못할 경우에는 이 온라인 가이드를 보시면 많은 도움이 될 것입니다. 이 책의 일부나 전부를 읽을 기회가 있으시면 이 책에 대한 서평을 보내주시면 감사하겠습니다. 앞으로 좀 더 나은 내용으로 업데이트된 가이드를 만드는 데 최선을 다하겠습니다.

 


스크립팅 클리닉

Greg Stemp는 오랫동안 전국 최고의 스크립팅 대가 중 한 사람으로 또한 세계적인 풋볼 코치로 널리 인정받아 왔습니다. 그런데 어떻게 풋볼 코치가 이런 일을 하게 되었냐구요? 그는 "해고"되었습니다. Greg Stemp는... 이제 이렇게 말할 수 밖에 없군요. 좋습니다. Greg Stemp는 Microsoft에서System Administration Scripting Guide의 수석 집필진으로 일하고 있습니다.

Dean Tsaltas는 노바스코샤 출신으로 레드먼드에 살고 있습니다. 그는 영어를 유창하게 구사하며 심지어 친구와 가족들의 액센트도 비웃을 정도로 영어 실력이 뛰어납니다. 그는 할머니와 부모님이 그가 애지중지하는 C-64를 사주고 Compute!' Gazette를 구독하게 해 준 어린 시절에 컴퓨팅을 시작했습니다! 그는 수년간 Microsoft에서 재직 중이며, 집과 벤쿠버에 있는 친구와 가족에 대해 다음과 같은 메시지를 전하고 있습니다. "아직 Bill을 만나지 못했어요!"

Bob Wells는 관심을 갖고 있는 사람이면 누구에게나 스크립팅의 가치를 역설합니다. Bob이 대부분의 사람들보다 스크립팅에 대해서 더 많이 알고 있다는 소문이 있습니다. 여가 시간에 Bob은System Administration Scripting Guide에 기고합니다.

Ethan Wilansky는 많은 시간을 저술 및 컨설팅 활동에 보냅니다. 그리고 스크립팅, 요가, 원예 및 가정일에 열심입니다. 현재는 쓰레기를 버리고 설겆이를 하는 스크립트를 만드는 일에 전념하고 있습니다.



최종 수정일: 2003년 3월 13일

'Windows' 카테고리의 다른 글

DllMain  (0) 2006.11.09
WMI 스크립팅 입문: 2부 (2002년 10월 7일)  (0) 2005.12.20
WMI 스크립팅 입문: 1부 (2002년 10월 7일)  (0) 2005.12.20