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
CIMWin32.mof
DLL
CIMWin32.dll

Baca juga

Kelas Sistem Operasi

Win32_Process

Tugas WMI: Pemantauan Performa

Tugas WMI: Proses