Menghentikan metode kelas Win32_Process
Metode hentikankelas WMI mengakhiri proses dan semua utasnya.
Topik ini menggunakan sintaksIs Managed Object Format (MOF). Untuk informasi selengkapnya tentang menggunakan metode ini, lihat Memanggil Metode.
Sintaks
uint32 Terminate(
[in] uint32 Reason
);
Parameter
-
Alasan [dalam]
-
Kode keluar untuk proses dan untuk semua utas dihentikan sebagai akibat dari panggilan ini.
Nilai hasil
Mengembalikan nilai 0 (nol) jika proses berhasil dihentikan, dan angka lainnya untuk menunjukkan kesalahan. Untuk kode kesalahan tambahan, lihat Konstanta Kesalahan WMI atau WbemErrorEnum. Untuk nilai HRESULT umum, lihat Kode Kesalahan Sistem.
-
Penyelesaian berhasil (0)
-
Akses ditolak (2)
-
Hak istimewa tidak memadai (3)
-
Kegagalan tidak diketahui (8)
-
Jalur tidak ditemukan (9)
-
Parameter tidak valid (21)
-
Lainnya (22 4294967295)
Keterangan
Gambaran Umum
Masalah komputer sering disebabkan oleh proses yang tidak lagi berfungsi seperti yang diharapkan. Misalnya, prosesnya mungkin membocorkan memori, atau mungkin berhenti merespons input pengguna. Ketika masalah seperti ini terjadi, proses harus dihentikan. Meskipun ini mungkin tampak seperti tugas yang cukup sederhana, mengakhiri proses dapat rumit oleh beberapa faktor:
- Proses mungkin digantung dan karena itu tidak lagi merespons perintah menu atau keyboard untuk menutup aplikasi. Ini membuat semuanya tetapi tidak mungkin bagi pengguna umum untuk menutup aplikasi dan mengakhiri proses.
- Prosesnya mungkin yatim piatu. Misalnya, skrip mungkin membuat instans Word lalu keluar tanpa menghancurkan instans tersebut. Akibatnya, Word tetap berjalan di komputer, meskipun tidak ada antarmuka pengguna yang terlihat. Karena tidak ada antarmuka pengguna, tidak ada menu atau perintah keyboard yang tersedia untuk mengakhiri proses.
- Anda mungkin tidak tahu proses mana yang perlu dihentikan. Misalnya, Anda mungkin ingin mengakhiri semua program yang melebihi jumlah memori tertentu.
- Karena Task Manager memungkinkan Anda untuk menghentikan hanya proses yang Anda buat, Anda mungkin tidak dapat mengakhiri proses, bahkan jika Anda adalah administrator di komputer.
Skrip memungkinkan Anda mengatasi semua rintangan potensial ini, memberi Anda kontrol administratif yang cukup besar atas komputer Anda. Misalnya, jika Anda mencurigai pengguna bermain game yang telah dilarang di organisasi Anda, Anda dapat dengan mudah menulis skrip untuk terhubung ke setiap komputer, mengidentifikasi apakah permainan berjalan, dan segera mengakhiri proses.
Menggunakan Metode Penghentian
Anda dapat mengakhiri proses dengan:
- Mengakhiri proses yang saat ini sedang berjalan. Misalnya, Anda mungkin perlu mengakhiri program diagnostik yang berjalan di komputer jarak jauh. Jika tidak ada cara untuk mengontrol aplikasi dari jarak jauh, Anda cukup menghentikan proses untuk aplikasi tersebut.
- Mencegah proses berjalan di tempat pertama. Dengan terus memantau pembuatan proses di komputer, Anda dapat mengidentifikasi dan langsung menghentikan proses apa pun segera setelah dimulai. Ini menyediakan satu metode untuk memastikan bahwa aplikasi tertentu (seperti program yang mengunduh file media besar melalui Internet) tidak pernah berjalan pada komputer tertentu.
Catatan
Kebijakan Grup juga dapat digunakan untuk membatasi program yang berjalan pada komputer. Namun, Kebijakan Grup hanya dapat membatasi program yang dijalankan menggunakan menu Mulai atau Windows Explorer; tidak berpengaruh pada program yang mulai menggunakan cara lain, seperti baris perintah. Sebaliknya, WMI dapat mencegah proses berjalan terlepas dari bagaimana proses dimulai.
Mengakhiri Proses yang Tidak Anda Miliki
Untuk mengakhiri proses yang tidak Anda miliki, aktifkan hak istimewa SeDebugPrivilege . Di VBScript, Anda dapat mengaktifkan hak istimewa ini dengan baris kode berikut:
Set objLoc = createobject("wbemscripting.swbemlocator")
objLoc.Security_.privileges.addasstring "sedebugprivilege", true
Untuk informasi selengkapnya tentang mengaktifkan hak istimewa ini di C++, lihat Mengaktifkan dan Menonaktifkan Hak Istimewa di C++.
Contoh
Sampel VBScript berikut mengakhiri proses di mana aplikasi Diagnose.exe saat ini berjalan.
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
Sampel VBScript berikut menggunakan konsumen peristiwa sementara untuk mengakhiri proses segera setelah dimulai.
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
Contoh kode VBScript berikut tersambung ke komputer jarak jauh dan mengakhiri Notepad.exe di komputer tersebut.
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
Kode C++ berikut mengakhiri proses Notepad.exe di komputer lokal. Tentukan handel proses atau (id proses) dalam kode untuk mengakhiri proses. Nilai ini dapat ditemukan di properti handle di kelas Win32_Process (properti kunci untuk kelas ). Dengan menentukan nilai untuk properti Handle, Anda menyediakan jalur ke instans kelas yang ingin Anda hentikan. Untuk informasi selengkapnya tentang menyambungkan ke komputer jarak jauh, lihat Contoh: Mendapatkan Data WMI Dari Komputer Jarak Jauh.
#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;
}
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung |
Windows Vista |
Server minimum yang didukung |
Windows Server 2008 |
Ruang nama |
Root\CIMV2 |
MOF |
|
DLL |
|