다음을 통해 공유


표준 소비자를 사용하여 이벤트 모니터링 및 응답

설치된 표준 소비자 클래스 사용하여 운영 체제의 이벤트를 기반으로 작업을 수행할 수 있습니다. 표준 소비자는 이미 등록된 간단한 클래스이며 영구 소비자 클래스를 정의합니다. 각 표준 소비자는 이벤트 알림을 받은 후 특정 작업을 수행합니다. 예를 들어 컴퓨터의 사용 가능한 디스크 공간이 지정된 크기와 다른 경우 스크립트를 실행하도록 ActiveScriptEventConsumer 인스턴스를 정의할 수 있습니다.

WMI는 표준 소비자를 운영 체제에 의존하는 기본 네임스페이스로 컴파일합니다. 예를 들면 다음과 같습니다.

  • Windows Server 2003에서는 모든 표준 소비자가 기본적으로 "Root\Subscription" 네임스페이스로 컴파일됩니다.

메모

각 WMI 클래스에 특정한 기본 네임스페이스 및 운영 체제는 각 클래스 항목의 설명 및 요구 사항 섹션을 참조하세요.

 

다음 표에서는 WMI 표준 소비자를 나열하고 설명합니다.

표준 소비자 묘사
ActiveScriptEventConsumer 이벤트 알림을 받으면 스크립트를 실행합니다. 자세한 내용은 이벤트 따라 스크립트를 실행하는참조하세요.
LogFileEventConsumer 이벤트 알림을 받으면 텍스트 로그 파일에 사용자 지정된 문자열을 씁니다. 자세한 내용은 이벤트 을 기반으로 로그 파일에 쓰는 것에 대해참조하십시오.
NTEventLogEventConsumer 애플리케이션 이벤트 로그에 특정 메시지를 기록합니다. 자세한 내용은 이벤트 을 기반으로을 NT 이벤트 로그에 로깅하는 방법을 참조하세요.
SMTPEventConsumer 이벤트가 배달될 때마다 SMTP를 사용하여 전자 메일 메시지를 보냅니다. 자세한 내용은 이벤트 기반의 이메일 보내기을 참조하세요.
CommandLineEventConsumer 이벤트가 로컬 시스템에 전달될 때 프로세스를 시작합니다. 실행 파일은 안전한 위치에 있거나 권한이 없는 사용자가 실행 파일을 다른 실행 파일로 대체하지 못하도록 ACL(강력한 액세스 제어 목록)으로 보호되어야 합니다. 자세한 내용은 이벤트 따라 명령줄에서 프로그램 실행참조하세요.

 

다음 절차에서는 표준 소비자를 사용하여 이벤트를 모니터링하고 응답하는 방법을 설명합니다. 이 절차는 MOF(Managed Object Format) 파일, 스크립트 또는 애플리케이션에 대해 동일합니다.

표준 소비자 사용하여 이벤트를 모니터링하고 응답하려면

  1. MOF 전처리기 명령 #pragma 네임스페이스사용하여 MOF 파일에서 네임스페이스를 지정합니다. 스크립트 또는 애플리케이션에서 WMI에 연결하는 코드에서 네임스페이스를 지정합니다.

    다음 MOF 코드 예제에서는 root\subscription 네임스페이스를 지정하는 방법을 보여줍니다.

    #pragma namespace ("\\\\.\\root\\subscription")
    

    대부분의내장 이벤트는 root\cimv2 네임스페이스의 클래스 인스턴스 변경 내용과 연결됩니다. 그러나 RegistryKeyChangeEvent 같은 레지스트리 이벤트는 시스템 레지스트리 공급자루트\기본 네임스페이스에서 발생합니다.

    소비자는 이벤트에 대한 __EventFilter 쿼리의 EventNamespace 속성에 네임스페이스를 지정하여 다른 네임스페이스에 있는 이벤트 클래스를 포함할 수 있습니다. __InstanceOperationEvent 같은 내장 이벤트 클래스는 모든 네임스페이스에서 사용할 수 있습니다.

  2. 표준 소비자 클래스의 인스턴스를 만들고 채웁다.

    이 인스턴스는 Name 속성에 고유한 값을 가질 수 있습니다. 동일한 이름을 다시 사용하여 기존 소비자를 업데이트할 수 있습니다.

    InsertionStringTemplates에는 EventType에서 지정한 이벤트에 삽입할 텍스트가 포함되어 있습니다. 리터럴 문자열을 사용하거나 속성을 직접 참조할 수 있습니다. 자세한 내용은 표준 문자열 템플릿 사용하여 이벤트 쿼리 SELECT 문을참조하세요.

    연결된 텍스트 없이 삽입 문자열을 지원하는 이벤트 로그에 기존 원본을 사용합니다.

    다음 MOF 코드 예제에서는 WSH의 기존 원본 및 8의 EventID 값을 사용하는 방법을 보여 있습니다.

    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"};
    };
    
  3. __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";                       
    };
    
  4. 모니터링할 이벤트를 식별하고 이벤트 쿼리를 만듭니다.

    사용할 수 있는 내재적 또는 외재적 이벤트가 있는지 확인할 수 있습니다. 예를 들어 레지스트리 공급자의 RegistryTreeChangeEvent 클래스를 사용하여 시스템 레지스트리의 변경 내용을 모니터링합니다.

    모니터링해야 하는 이벤트를 설명하는 클래스가 없는 경우 고유한 이벤트 공급자를 만들고 새 외래 이벤트 클래스를 정의해야 합니다. 자세한 내용은 이벤트 공급자작성에 대한 정보를 참조하세요.

    MOF 파일에서 필터 및 소비자에 대한 별칭 정의하여 인스턴스 경로를 쉽게 설명할 수 있습니다.

    다음 예제에서는 필터 및 소비자에 대한 별칭 정의하는 방법을 보여 줍니다.

    instance of __EventFilter as $FILTER
    instance of LogFileEventConsumer as $CONSUMER
    
  5. 필터 및 소비자 클래스를 연결할 __FilterToConsumerBinding 인스턴스를 만듭니다. 이 인스턴스는 지정된 필터와 일치하는 이벤트가 발생할 때 소비자가 지정한 동작이 발생하도록 결정합니다. __EventFilter, __EventConsumer__FilterToConsumerBindingCreatorSID 속성에 동일한 개별 SID(보안 식별자)가 있어야 합니다. 자세한 내용은 이벤트 필터를 논리 소비자와 바인딩하기를 참조하세요.

    다음 예제에서는 개체 경로로 인스턴스를 식별하거나 별칭을 개체 경로의 약식으로 사용하는 방법을 보여 줍니다.

    instance of __EventFilter as $FILTER
    instance of NTEventLogEventConsumer as $CONSUMER
    

    다음 예제에서는 별칭을 사용하여 필터를 소비자에 바인딩합니다.

    instance of __FilterToConsumerBinding
    {
        Filter = $FILTER;
        Consumer = $CONSUMER;
    
    };
    

    하나의 필터를 여러 소비자에게 바인딩할 수 있습니다. 이는 일치하는 이벤트가 발생할 때 여러 작업을 수행해야 했음을 나타냅니다. 또는 한 소비자를 여러 필터에 바인딩할 수 있습니다. 이는 필터 중 하나와 일치하는 이벤트가 발생할 때 작업을 수행해야 임을 나타냅니다.

    다음 작업은 소비자 및 이벤트의 조건에 따라 수행됩니다.

    • 영구 소비자 중 하나가 실패하면 이벤트를 요청하는 다른 소비자는 알림을 받습니다.
    • 이벤트가 삭제되면 WMI가 __EventDroppedEvent을(를) 트리거합니다.
    • 이 이벤트를 구독하면 삭제된 이벤트가 반환되고 __EventConsumer 대한 참조가 실패한 소비자를 나타냅니다.
    • 소비자가 실패하면 WMI는 __ConsumerFailureEvent를 발생시킵니다. 이 이벤트의 ErrorCode, ErrorDescriptionErrorObject 속성에는 추가 정보가 포함될 수 있습니다.

    자세한 내용은 논리 소비자사용하여 이벤트 필터 바인딩을 참조하세요.

본보기

다음 예제에서는 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;
};

이벤트를 안전하게 수신하기