표준 소비자를 사용하여 이벤트 모니터링 및 응답
설치된 표준 소비자 클래스를 사용하여 운영 체제의 이벤트에 따라 작업을 수행할 수 있습니다. 표준 소비자는 이미 등록된 단순 클래스이며 영구 소비자 클래스를 정의합니다. 각 표준 소비자는 이벤트 알림을 받은 후에 특정 작업을 수행합니다. 예를 들어, 컴퓨터의 사용 가능한 디스크 공간이 지정된 크기와 다른 경우에 스크립트를 실행하도록 ActiveScriptEventConsumer 인스턴스를 정의할 수 있습니다.
WMI는 운영 체제에 따라 다른 기본 네임스페이스로 표준 소비자를 컴파일합니다. 예를 들면 다음과 같습니다.
- Windows Server 2003은 기본적으로 모든 표준 소비자가 "Root\Subscription" 네임스페이스로 컴파일됩니다.
참고
각 WMI 클래스에 고유한 기본 네임스페이스 및 운영 체제는 각 클래스 항목의 설명 및 요구 사항 섹션을 참조하세요.
다음 표는 WMI 표준 소비자를 나열하고 설명합니다.
표준 소비자 | 설명 |
---|---|
ActiveScriptEventConsumer | 이벤트 알림을 받으면 스크립트를 실행합니다. 자세한 내용은 스크립트 실행을 참조하세요. |
LogFileEventConsumer | 이벤트 알림을 받으면 사용자 지정 문자열을 텍스트 로그 파일에 씁니다. 자세한 내용은 로그 파일에 쓰기를 참조하세요. |
NTEventLogEventConsumer | 애플리케이션 이벤트 로그에 특정 메시지를 기록합니다. 자세한 내용은 이벤트에 따라 NT 이벤트 로그에 로깅을 참조하세요. |
SMTPEventConsumer | 이벤트를 받을 때마다 SMTP를 사용하여 이메일 메시지를 보냅니다. 자세한 내용은 이벤트에 따라 이메일 보내기를 참조하세요. |
CommandLineEventConsumer | 이벤트가 로컬 시스템에 전달될 때 프로세스를 시작합니다. 권한 없는 사용자가 실행 파일을 다른 실행 파일로 바꾸지 못하도록 실행 가능 파일은 안전한 위치에 두거나 강력한 ACL(액세스 제어 목록)으로 보호해야 합니다. 자세한 내용은 이벤트에 따라 명령줄에서 프로그램 실행을 참조하세요. |
다음 프로시저에서는 표준 소비자를 사용하여 이벤트를 모니터링하고 이벤트에 응답하는 방법을 설명합니다. 이 프로시저는 MOF(Managed Object Format) 파일, 스크립트 또는 애플리케이션에 대해 동일합니다.
표준 소비자를 사용하여 이벤트를 모니터링하고 이벤트에 응답하려면
MOF 전처리기 명령 #pragma 네임스페이스를 사용하여 MOF 파일에서 네임스페이스를 지정합니다. 스크립트 또는 애플리케이션에서 WMI에 연결되는 코드에서 네임스페이스를 지정합니다.
다음 MOF 코드 예제에서는 root\subscription 네임스페이스를 지정하는 방법을 설명합니다.
#pragma namespace ("\\\\.\\root\\subscription")
대부분의 내부 이벤트는 root\cimv2 네임스페이스의 클래스 인스턴스 변경 내용과 연결됩니다. 그러나 RegistryKeyChangeEvent와 같은 레지스트리 이벤트는 시스템 레지스트리 공급자에 의해 root\default 네임스페이스에서 실행됩니다.
소비자가 이벤트에 대한 __EventFilter 쿼리의 EventNamespace 속성에 네임스페이스를 지정하여 다른 네임스페이스에 있는 이벤트 클래스를 포함시킬 수 있습니다. __InstanceOperationEvent 같은 내부 이벤트 클래스는 모든 네임스페이스에서 사용할 수 있습니다.
표준 소비자 클래스의 인스턴스를 만들고 채웁니다.
이 인스턴스는 Name 속성에 고유한 값을 가질 수 있습니다. 동일한 이름을 다시 사용하여 기존 소비자를 업데이트할 수 있습니다.
InsertionStringTemplates에는 EventType에서 지정한 이벤트에 삽입할 텍스트가 포함되어 있습니다. 리터럴 문자열을 사용하거나 속성을 직접 참조할 수 있습니다. 자세한 내용은 준 문자열 템플릿 사용 및 트 쿼리에 대한 SELECT 문을 참조하세요.
연결된 텍스트 없이 삽입 문자열을 지원하는 이벤트 로그에 기존 원본을 사용합니다.
다음 MOF 코드 예제에서는 WSH의 기존 원본 및 EventID 값 8을 사용하는 방법을 설명합니다.
instance of NTEventLogEventConsumer as $Consumer { Name = "RunKeyEventlogConsumer"; SourceName = "WSH"; EventID = 8; // Warning EventType = 2; // One string supplies the entire message NumberOfInsertionStrings = 1; // the %Hive% and %KeyPath% are properties of // the RegistryKeyChangeEvent instance InsertionStringTemplates = {"The key %Hive%\\%RootPath% has been modified." "Check if the change is intentional"}; };
__EventFilter 인스턴스를 만들고 이벤트에 대한 쿼리를 정의합니다.
다음 예제에서는 시작 프로그램이 등록된 레지스트리 키를 필터가 모니터링합니다. 권한이 없는 프로그램이 키 아래에 등록될 수 있고 이로 인해 컴퓨터가 부팅될 때 실행되므로 이 레지스트리 키를 모니터링해야 할 것입니다.
instance of __EventFilter as $Filter { Name = "RunKeyFilter"; QueryLanguage = "WQL"; Query = "Select * from RegistryTreeChangeEvent" " where (Hive = \"HKEY_LOCAL_MACHINE\" and " "RootPath = \"Software\\\\Microsoft\\\\Windows" "\\\\CurrentVersion\\\\Run\")"; // RegistryTreeChangeEvents only fire in root\default namespace EventNamespace = "root\\default"; };
이벤트 쿼리를 모니터링하고 만들 이벤트를 식별합니다.
사용하는 내부 또는 외부 이벤트가 있는지 확인할 수 있습니다. 예를 들어, 레지스트리 공급자의 RegistryTreeChangeEvent 클래스를 사용하여 시스템 레지스트리 변경 내용을 모니터링합니다.
모니터링해야 하는 이벤트를 설명하는 클래스가 없는 경우 고유한 이벤트 공급자를 만들고 새 외래 이벤트 클래스를 정의해야 합니다. 자세한 내용은 이벤트 공급자 작성을 참조하세요.
MOF 파일에서 필터 및 소비자에 대한 별칭을 정의할 수 있는데 이 별칭을 사용해 인스턴스 경로를 쉽게 설명할 수 있습니다.
다음 예제에서는 필터 및 소비자에 대한 별칭을 정의하는 방법을 설명합니다.
instance of __EventFilter as $FILTER instance of LogFileEventConsumer as $CONSUMER
필터 및 소비자 클래스를 연결할 __FilterToConsumerBinding의 인스턴스를 만듭니다. 이 인스턴스는 지정된 필터와 일치하는 이벤트가 발생할 때 소비자가 지정한 작업이 진행되어야 한다고 결정합니다. __EventFilter, __EventConsumer 및 __FilterToConsumerBinding은 CreatorSID 속성에 동일한 개별 SID(보안 식별자)가 있어야 합니다. 자세한 내용은 논리적 소비자를 사용하여 이벤트 필터 바인딩을 참조하세요.
다음 예제에서는 개체 경로로 인스턴스를 식별하거나 별칭을 개체 경로의 약식으로 사용하는 방법을 보여줍니다.
instance of __EventFilter as $FILTER instance of NTEventLogEventConsumer as $CONSUMER
다음 예제에서는 별칭을 사용하여 필터를 소비자에게 바인딩합니다.
instance of __FilterToConsumerBinding { Filter = $FILTER; Consumer = $CONSUMER; };
필터 하나를 여러 소비자에게 바인딩하거나(일치하는 이벤트가 발생할 때 여러 작업을 수행해야 함을 나타냄) 소비자 하나를 여러 필터에 바인딩할 수 있습니다(필터 중 하나와 일치하는 이벤트가 발생할 때 조치를 취해야 함을 나타냄).
다음 조치는 소비자 및 이벤트의 조건에 따라 취합니다.
- 영구 소비자 중 하나가 실패하면 이벤트를 요청하는 다른 소비자에게 알림이 갑니다.
- 이벤트가 삭제되면 WMI가 __EventDroppedEvent를 실행합니다.
- 이 이벤트를 구독하면 삭제된 이벤트가 반환되고 __EventConsumer에 대한 참조는 실패한 소비자를 나타냅니다.
- 소비자가 실패하면 WMI가 __ConsumerFailureEvent를 실행하는데 이에 따라 ErrorCode,ErrorDescription 및 ErrorObject 속성에 자세한 정보가 포함될 수 있습니다.
자세한 내용은 논리적 소비자를 사용하여 이벤트 필터 바인딩을 참조하세요.
예
다음 예제에서는 NTEventLogEventConsumer 인스턴스에 대한 MOF를 보여줍니다. 이 MOF를 컴파일한 후 레지스트리 경로 HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows\CurrentVersion\Run에서 값을 만들거나, 삭제하거나, 수정하려고 하면 원본 애플리케이션 이벤트 로그에서 "WSH" 아래에 항목이 기록됩니다.
#pragma namespace ("\\\\.\\root\\subscription")
instance of __EventFilter as $Filter
{
Name = "RunKeyFilter";
QueryLanguage = "WQL";
Query = "Select * from RegistryTreeChangeEvent"
" where (Hive = \"HKEY_LOCAL_MACHINE\" and "
"KeyPath = \"Software\\\\Microsoft\\\\Windows"
"\\\\CurrentVersion\\\\Run\")";
// RegistryTreeChangeEvents only fire
// in root\default namespace
EventNamespace = "root\\default";
};
instance of NTEventLogEventConsumer as $Consumer
{
Name = "RunKeyEventlogConsumer";
SourceName = "WSH";
EventID = 8;
EventType = 2; // Warning
Category = 0;
NumberOfInsertionStrings = 1;
// the %Hive% and %KeyPath% are properties
// of the RegistryKeyChangeEvent instance
InsertionStringTemplates = {"The key %Hive%\\%RootPath% "
"has been modified. Check if the change is intentional"};
};
// Bind the filter to the consumer
instance of __FilterToConsumerBinding
{
Filter = $Filter;
Consumer = $Consumer;
};
관련 항목