다음을 통해 공유


Win32_Process 클래스의 terminate 메서드

TerminateWMI 클래스 메서드는 프로세스와 모든 스레드를 종료합니다.

이 항목에서는 MOF(Managed Object Format) 구문을 사용합니다. 이 메서드를 사용하는 방법에 대한 자세한 내용은 메서드 호출을 참조 하세요.

구문

uint32 Terminate(
  [in] uint32 Reason
);

매개 변수

이유 [in]

이 호출의 결과로 종료된 프로세스 및 모든 스레드에 대한 종료 코드입니다.

반환 값

프로세스가 성공적으로 종료된 경우 0의 값을 반환하고 오류를 나타내는 다른 숫자를 반환합니다. 추가 오류 코드는 WMI 오류 상수 또는 WbemErrorEnum을 참조하세요. 일반적인 HRESULT 값은 시스템 오류 코드를 참조 하세요.

성공적인 완료 (0)

액세스 거부됨 (2)

권한 부족(3)

알 수 없는 오류 (8)

경로를 찾을 수 없음(9)

잘못된 매개 변수 (21)

기타 (22 4294967295)

설명

개요

컴퓨터 문제는 더 이상 예상대로 작동하지 않는 프로세스로 인해 발생하는 경우가 많습니다. 예를 들어 프로세스가 메모리를 누출하거나 사용자 입력에 대한 응답을 중지했을 수 있습니다. 이와 같은 문제가 발생하면 프로세스를 종료해야 합니다. 이 작업은 충분히 간단한 작업처럼 보일 수 있지만 프로세스를 종료하는 작업은 여러 가지 요인으로 인해 복잡할 수 있습니다.

  • 프로세스가 중단되어 애플리케이션을 닫기 위한 메뉴 또는 키보드 명령에 더 이상 응답하지 않을 수 있습니다. 따라서 일반 사용자가 애플리케이션을 해제하고 프로세스를 종료하는 것은 불가능합니다.
  • 프로세스가 분리될 수 있습니다. 예를 들어 스크립트는 Word 인스턴스를 만든 다음 해당 인스턴스를 삭제하지 않고 종료할 수 있습니다. 실제로 사용자 인터페이스가 표시되지 않더라도 컴퓨터에서 Word가 다시 실행되고 기본. 사용자 인터페이스가 없으므로 프로세스를 종료하는 데 사용할 수 있는 메뉴 또는 키보드 명령이 없습니다.
  • 종료해야 하는 프로세스를 모를 수도 있습니다. 예를 들어 지정된 메모리 양을 초과하는 모든 프로그램을 종료할 수 있습니다.
  • 작업 관리자를 사용하면 만든 프로세스만 종료할 수 있으므로 컴퓨터의 관리자인 경우에도 프로세스를 종료하지 못할 수 있습니다.

스크립트를 사용하면 이러한 잠재적인 장애물을 모두 극복하여 컴퓨터에 대한 상당한 관리 제어를 제공할 수 있습니다. 예를 들어 사용자가 조직에서 금지된 게임을 플레이하고 있다고 의심되는 경우 스크립트를 쉽게 작성하여 각 컴퓨터에 연결하고, 게임이 실행 중인지 여부를 식별하고, 프로세스를 즉시 종료할 수 있습니다.

Terminate 메서드 사용

다음을 통해 프로세스를 종료할 수 있습니다.

  • 현재 실행 중인 프로세스를 종료합니다. 예를 들어 원격 컴퓨터에서 실행되는 진단 프로그램을 종료해야 할 수 있습니다. 애플리케이션을 원격으로 제어할 방법이 없는 경우 해당 애플리케이션에 대한 프로세스를 종료하기만 하면 됩니다.
  • 처음부터 프로세스가 실행되지 않도록 합니다. 컴퓨터에서 프로세스 생성을 지속적으로 모니터링하여 시작하자마자 모든 프로세스를 식별하고 즉시 종료할 수 있습니다. 이렇게 하면 특정 애플리케이션(예: 인터넷을 통해 큰 미디어 파일을 다운로드하는 프로그램)이 특정 컴퓨터에서 실행되지 않도록 하는 한 가지 방법이 제공됩니다.

참고 항목

그룹 정책을 사용하여 컴퓨터에서 실행되는 프로그램을 제한할 수도 있습니다. 그러나 그룹 정책은 시작 메뉴 또는 Windows 탐색기를 사용하여 실행되는 프로그램만 제한할 수 있습니다. 명령줄과 같은 다른 방법을 사용하여 시작된 프로그램에는 영향을 주지 않습니다. 반면, WMI는 프로세스가 시작된 방법에 관계없이 프로세스가 실행되지 않도록 방지할 수 있습니다.

소유하지 않은 프로세스 종료

소유하지 않은 프로세스를 종료하려면 SeDebugPrivilege 권한을 사용하도록 설정합니다. VBScript에서 다음 코드 줄을 사용하여 이 권한을 사용하도록 설정할 수 있습니다.

Set objLoc = createobject("wbemscripting.swbemlocator")
objLoc.Security_.privileges.addasstring "sedebugprivilege", true

C++에서 이 권한을 사용하도록 설정하는 방법에 대한 자세한 내용은 C++에서 권한 사용 및 비활성화를 참조하세요.

예제

다음 VBScript 샘플은 Application Diagnose.exe가 현재 실행 중인 프로세스를 종료합니다.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'Diagnose.exe'")
For Each objProcess in colProcessList
 objProcess.Terminate()
Next

다음 VBScript 샘플에서는 임시 이벤트 소비자를 사용하여 프로세스를 시작하는 즉시 종료합니다.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colMonitoredProcesses = objWMIService.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent " _
 & " WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
i = 0
Do While i = 0
 Set objLatestProcess = colMonitoredProcesses.NextEvent
 If objLatestProcess.TargetInstance.Name = "Download.exe" Then
 objLatestProcess.TargetInstance.Terminate()
 End If
Loop

다음 VBScript 코드 예제에서는 원격 컴퓨터에 연결 하 고 해당 컴퓨터에서 메모장.exe를 종료 합니다.

strComputer = "FullComputerName" 
strDomain = "DOMAIN" 
strUser = InputBox("Enter user name") 
strPassword = InputBox("Enter password") 
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") 
Set objWMIService = objSWbemLocator.ConnectServer(strComputer, _ 
    "root\CIMV2", _ 
    strUser, _ 
    strPassword, _ 
    "MS_409", _ 
    "ntlmdomain:" + strDomain) 
Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad.exe'")
For Each objProcess in colProcessList
    objProcess.Terminate()
Next

다음 C++ 코드는 로컬 컴퓨터에서 메모장.exe 프로세스를 종료합니다. 프로세스 종료를 위해 코드에서 프로세스 핸들(프로세스 ID)을 지정합니다. 이 값은 Win32_Process 클래스의 핸들 속성(클래스의 키 속성)에서 찾을 수 있습니다. Handle 속성에 대한 값을 지정하여 종료하려는 클래스의 인스턴스에 대한 경로를 제공합니다. 원격 컴퓨터에 연결하는 방법에 대한 자세한 내용은 예제: 원격 컴퓨터 에서 WMI 데이터 가져오기를 참조하세요.

#define _WIN32_DCOM

#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>

#pragma comment(lib, "wbemuuid.lib")

int main(int iArgCnt, char ** argv)
{
    HRESULT hres;

    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------

    hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
    if (FAILED(hres))
    {
        cout << "Failed to initialize COM library. Error code = 0x" 
             << hex << hres << endl;
        return 1;                  // Program has failed.
    }

    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------
    // Note: If you are using Windows 2000, specify -
    // the default authentication credentials for a user by using
    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
    // parameter of CoInitializeSecurity ------------------------

    hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM negotiates service
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );

                      
    if (FAILED(hres))
    {
        cout << "Failed to initialize security. Error code = 0x" 
             << hex << hres << endl;
        CoUninitialize();
        return 1;                      // Program has failed.
    }
    
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------

    IWbemLocator *pLoc = NULL;

    hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres))
    {
        cout << "Failed to create IWbemLocator object. "
             << "Err code = 0x"
             << hex << hres << endl;
        CoUninitialize();
        return 1;                 // Program has failed.
    }

    // Step 4: ---------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method

    IWbemServices *pSvc = NULL;
 
    // Connect to the local root\cimv2 namespace
    // and obtain pointer pSvc to make IWbemServices calls.
    hres = pLoc->ConnectServer(
        _bstr_t(L"ROOT\\CIMV2"), 
        NULL,
        NULL, 
        0, 
        NULL, 
        0, 
        0, 
        &pSvc
    );
     
    if (FAILED(hres))
    {
        cout << "Could not connect. Error code = 0x" 
             << hex << hres << endl;
        pLoc->Release();
        pSvc->Release();     
        CoUninitialize();
        return 1;                // Program has failed.
    }

    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;


    // Step 5: --------------------------------------------------
    // Set security levels for the proxy ------------------------

    hres = CoSetProxyBlanket(
        pSvc,                        // Indicates the proxy to set
        RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx 
        RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx 
        NULL,                        // Server principal name 
        RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
        RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
        NULL,                        // client identity
        EOAC_NONE                    // proxy capabilities 
    );

    if (FAILED(hres))
    {
        cout << "Could not set proxy blanket. Error code = 0x" 
             << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();     
        CoUninitialize();
        return 1;               // Program has failed.
    }

    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----

    // Set up to call the Win32_Process::Create method
    BSTR ClassName = SysAllocString(L"Win32_Process");

    /* YOU NEED TO CHANGE THE NUMBER VALUE OF THE HANDLE 
       (PROCESS ID) TO THE CORRECT VALUE OF THE PROCESS YOU 
       ARE TRYING TO TERMINATE (this provides a path to
       the class instance you are tying to terminate). */
    BSTR ClassNameInstance = SysAllocString(
        L"Win32_Process.Handle=\"3168\"");

    _bstr_t MethodName = (L"Terminate");
    BSTR ParameterName = SysAllocString(L"Reason");

    IWbemClassObject* pClass = NULL;
    hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);

    IWbemClassObject* pInParamsDefinition = NULL;
    IWbemClassObject* pOutMethod = NULL;
    hres = pClass->GetMethod(MethodName, 0, 
        &pInParamsDefinition, &pOutMethod);

    if (FAILED(hres))
    {
        cout << "Could not get the method. Error code = 0x" 
             << hex << hres << endl;
    }

    IWbemClassObject* pClassInstance = NULL;
    hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance);

    // Create the values for the in parameters
    VARIANT pcVal;
    VariantInit(&pcVal);
    V_VT(&pcVal) = VT_I4;

    // Store the value for the in parameters
    hres = pClassInstance->Put(L"Reason", 0,
        &pcVal, 0);

    // Execute Method
    hres = pSvc->ExecMethod(ClassNameInstance, MethodName, 0,
    NULL, pClassInstance, NULL, NULL);

    if (FAILED(hres))
    {
        cout << "Could not execute method. Error code = 0x" 
             << hex << hres << endl;
        VariantClear(&pcVal);
        SysFreeString(ClassName);
        SysFreeString(MethodName);
        pClass->Release();
        pInParamsDefinition->Release();
        pSvc->Release();
        pLoc->Release();     
        CoUninitialize();
        return 1;           // Program has failed.
    }


    // Clean up
    //--------------------------
    VariantClear(&pcVal);
    SysFreeString(ClassName);
    SysFreeString(MethodName);
    pClass->Release();
    pInParamsDefinition->Release();
    pLoc->Release();
    pSvc->Release();
    CoUninitialize();
    return 0;
}

요구 사항

요구 사항
지원되는 최소 클라이언트
Windows Vista
지원되는 최소 서버
Windows Server 2008
네임스페이스
Root\CIMV2
MOF
CIMWin32.mof
DLL
CIMWin32.dll

참고 항목

운영 체제 클래스

Win32_Process

WMI 작업: 성능 모니터링

WMI 작업: 프로세스