Метод Terminate класса Win32_Process

Метод класса TerminateWMI завершает процесс и все его потоки.

В этом разделе используется синтаксис формата управляемого объекта (MOF). Дополнительные сведения об использовании этого метода см. в разделе Вызов метода.

Синтаксис

uint32 Terminate(
  [in] uint32 Reason
);

Параметры

Причина [в]

Код выхода для процесса и для всех потоков, завершенных в результате этого вызова.

Возвращаемое значение

Возвращает значение 0 (ноль), если процесс был успешно завершен, и любое другое число, указывающее на ошибку. Дополнительные коды ошибок см. в разделе WMI Error Constants или 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++.

Примеры

Пример кода PowerShell для завершения выполнения процесса на нескольких серверах в коллекции TechNet завершает процесс, выполняемый на одном или нескольких компьютерах.

Следующий пример VBScript завершает процесс, в котором в настоящее время выполняется 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 выполняется подключение к удаленному компьютеру и завершение Notepad.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++ завершает процесс Notepad.exe на локальном компьютере. Укажите дескриптор или (идентификатор процесса) в коде, чтобы завершить процесс. Это значение можно найти в свойстве handle класса Win32_Process (свойство key для класса ). Указывая значение для свойства 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: процессы