이벤트를 기반으로 스크립트 실행

ActiveScriptEventConsumer 클래스에 의해 구현되는 표준 소비자를 사용하면 컴퓨터가 스크립트를 실행하고 중요한 이벤트가 발생할 때 조치를 취하여 컴퓨터가 자동으로 문제를 감지하고 해결할 수 있도록 합니다.

이 소비자는 기본적으로 root\subscription 네임스페이스에 로드됩니다.

ScriptingStandardConsumerSetting의 단일 인스턴스에서 Timeout 또는 MaximumScripts 속성 값을 설정하여 시스템에서 ActiveScriptEventConsumer의 모든 인스턴스의 성능을 구성할 수 있습니다.

표준 소비자를 사용하기 위한 기본 절차는 항상 동일하며 표준 소비자를 사용하여 이벤트 모니터링 및 응답에서 확인할 수 있습니다. 다음 프로시저는 기본 프로시저에 추가되고 ActiveScriptEventConsumer 클래스에만 적용되며 스크립트를 실행하는 이벤트 소비자를 만드는 방법을 설명합니다.

주의

ActiveScriptEventConsumer 클래스에는 특별한 보안 제약 조건이 있습니다. 이 표준 소비자는 로컬 컴퓨터에서 관리자 그룹의 로컬 구성원에 의해 구성되어야 합니다. 도메인 계정을 사용하여 구독을 만드는 경우 작성자가 로컬 관리자 그룹의 구성원인지 확인하려면 LocalSystem 계정에 도메인에 대한 필수 권한이 있어야 합니다.

 

다음 절차에서는 스크립트를 실행하는 이벤트 소비자를 만드는 방법을 설명합니다.

스크립트를 실행하는 이벤트 소비자를 만들려면 다음을 따릅니다.

  1. 이벤트가 발생할 때 실행할 스크립트를 작성합니다.

    어떤 언어로든 스크립트를 작성할 수 있지만 선택한 언어에 대한 스크립팅 엔진이 컴퓨터에 설치되어 있어야 합니다. 스크립트는 WMI 스크립팅 개체를 사용할 필요가 없습니다.

    관리자만 스크립트 소비자를 설정할 수 있으며, 스크립트는 LocalSystem 자격 증명으로 실행되어 네트워크 액세스를 제외하고 소비자에게 광범위한 기능을 제공합니다. 그러나 스크립트는 환경 변수 및 네트워크 공유와 같은 특정 사용자 로그온 데이터에는 액세스할 수 없습니다.

  2. MOF(Managed Object Format) 파일에서 ActiveScriptEventConsumer의 인스턴스를 만들어 쿼리에서 요청하는 이벤트를 수신합니다.

    스크립트 텍스트를 ScriptText에 배치하거나 ScriptFileName에서 스크립트의 경로와 파일 이름을 지정할 수 있습니다. 자세한 내용은 MOF(Managed Object Format) 클래스 디자인을 참조하세요.

  3. __EventFilter의 인스턴스를 만들고, 이름을 지정한 다음, 쿼리를 만들어 스크립트 실행을 트리거하는 이벤트 유형을 지정합니다.

    자세한 내용은 WQL을 사용하여 쿼리를 참조하세요.

  4. __FilterToConsumerBinding 인스턴스를 만들어 필터를 ActiveScriptEventConsumer 인스턴스와 연결합니다.

  5. Mofcomp.exe를 사용하여 MOF 파일을 컴파일합니다.

다음 섹션의 예제에서는 이벤트 기반 스크립트를 구현하는 두 가지 방법을 보여 줍니다. 첫 번째 예제에서는 외부 파일에 정의된 스크립트를 사용하고 두 번째 예제에서는 MOF 코드에 기본 제공되는 스크립트를 사용합니다. 이 예제는 MOF 코드에 있지만 WMI용 스크립팅 API 또는 WMI용 COM API를 사용하여 프로그래밍 방식으로 인스턴스를 만들 수 있습니다.

외부 스크립트 사용 예제

다음 절차에서는 외부 스크립트 예제를 사용하는 방법을 설명합니다.

외부 스크립트 예제를 사용하려면 다음을 따릅니다.

  1. c:\Asec.vbs이라는 파일을 만든 다음, 이 예제의 스크립트를 복사합니다.

  2. MOF 목록을 텍스트 파일에 복사하고 .mof 확장명으로 저장합니다.

  3. 명령 프롬프트 창에서 다음 명령을 사용하여 MOF 파일을 컴파일합니다.

    Mofcompfilename**.mof**

  4. 계산기를 실행하여 calc.exe 프로세스를 만듭니다. 5초 이상 기다렸다가 계산기 창을 닫은 다음, C:\ 디렉터리에서 ASEC.log라는 파일을 찾습니다.

    다음 텍스트는 ASEC.log 파일에 포함될 텍스트와 유사합니다.

    Time: 12/31/2002 2:56:33 PM; Entry made by: ASEC
    Application closed. UserModeTime:  1562500; 
    KernelModeTime: 3125000 [hundreds of nanoseconds]
    

다음 VBScript 코드 예제에서는 영구 소비자가 이벤트를 수신할 때 호출되는 스크립트를 보여줍니다. TargetEvent 개체는 __InstanceDeletionEvent 인스턴스이므로 이벤트를 발생시키는 데 사용되는 Win32_Process 인스턴스인 TargetInstance라는 속성이 있습니다. Win32_Process 클래스에는 스크립트에서 만든 로그 파일에 배치되는 UserModeTimeKernelModeTime 속성이 있습니다.

' asec.vbs script
Dim objFS, objFile
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile = objFS.OpenTextFile("C:\ASEC.log", 8, true)
objFile.WriteLine "Time: " & Now & "; Entry made by: ASEC"

objFile.WriteLine "Application closed. UserModeTime:  " & _
    TargetEvent.TargetInstance.UserModeTime & _
    "; KernelModeTime: " & _
    TargetEvent.TargetInstance.KernelModeTime & _
    " [hundreds of nanoseconds]"
objFile.Close

다음 MOF 코드 예제에서는 이벤트가 수신될 때 스크립트를 호출합니다. root\subscription 네임스페이스에 필터, 소비자와 이들 사이의 바인딩을 만듭니다.

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

instance of ActiveScriptEventConsumer as $Cons
{
    Name = "ASEC";
    ScriptingEngine = "VBScript";
    ScriptFileName = "c:\\asec2.vbs";
};

instance of __EventFilter as $Filt
{
    Name = "EF";
    Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
        "WHERE TargetInstance ISA \"Win32_Process\" "
        "AND TargetInstance.Name = \"calc.exe\"";
    QueryLanguage = "WQL";
    EventNamespace = "root\\cimv2";
};

instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};

인라인 스크립트 사용 예제

다음 절차에서는 인라인 스크립트 예제를 사용하는 방법을 설명합니다.

인라인 스크립트 예제를 사용하려면 다음을 따릅니다.

  1. 이 섹션의 MOF 목록을 텍스트 파일에 복사하고 .mof 확장명으로 저장합니다.

  2. 명령 프롬프트 창에서 다음 명령을 사용하여 MOF 파일을 컴파일합니다.

    Mofcompfilename**.mof**

다음 MOF 코드 예제에서는 필터, 소비자와 더불어 이들 간의 바인딩을 만들고 스크립트 인라인도 다룹니다.

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

instance of ActiveScriptEventConsumer as $Cons
{
    Name = "ASEC";
    ScriptingEngine = "VBScript";
    
    ScriptText =
        "Dim objFS, objFile\n"
        "Set objFS = CreateObject(\"Scripting.FileSystemObject\")\n"
        "Set objFile = objFS.OpenTextFile(\"C:\\ASEC.log\","
        " 8, true)\nobjFile.WriteLine \"Time: \" & Now & \";"
        " Entry made by: ASEC\"\nobjFile.WriteLine"
        " \"Application closed. UserModeTime:  \" & "
        "TargetEvent.TargetInstance.UserModeTime &_\n"
        "\"; KernelModeTime: \" & "
        "TargetEvent.TargetInstance.KernelModeTime "
        "& \" [hundreds of nanoseconds]\"\n"
        "objFile.Close\n";
};

instance of __EventFilter as $Filt
{
    Name = "EF";
    Query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 "
        "WHERE TargetInstance ISA \"Win32_Process\" "
        "AND TargetInstance.Name = \"calc.exe\"";
    QueryLanguage = "WQL";
    EventNamespace = "root\\cimv2";
};

instance of __FilterToConsumerBinding
{
    Filter = $Filt;
    Consumer = $Cons;
};

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