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 |
|
DLL |
|