Win32 进程类的 Terminate 方法 _

终止 WMI 类方法终止进程及其所有线程。

本主题使用托管对象格式 (MOF) 语法。 有关使用此方法的详细信息,请参阅 调用方法

语法

uint32 Terminate(
  [in] uint32 Reason
);

参数

原因 [中]

此调用的结果和所有线程终止的进程的退出代码。

返回值

如果进程已成功终止,则返回值 0 (零) ,并返回任何其他数字来指示错误。 有关其他错误代码,请参阅 WMI 错误常量WbemErrorEnum。 有关常规 HRESULT 值,请参阅 系统错误代码

成功完成 (0)

拒绝访问 (2)

权限不足 (3)

未知故障 (8)

(9) 找不到路径

参数 (21) 无效

其他 (22 4294967295)

备注

概述

计算机问题通常是因为某个进程不再按预期方式工作。 例如,进程可能正在泄漏内存,或者它可能已停止响应用户输入。 如果出现这样的问题,则必须终止该过程。 尽管这可能看起来像是一项简单的任务,但终止进程可能会很复杂,原因如下:

  • 进程可能已挂起,因此不再响应菜单或用于关闭应用程序的键盘命令。 这使得典型用户无法关闭应用程序并终止进程。
  • 此过程可能是孤立的。 例如,脚本可以创建一个 Word 实例,然后在不销毁该实例的情况下退出。 实际上,即使没有用户界面可见,Word 仍仍在计算机上运行。 由于没有用户界面,因此没有可用于终止进程的菜单或键盘命令。
  • 您可能不知道需要终止哪个进程。 例如,你可能希望终止超过指定内存量的所有程序。
  • 由于任务管理器允许您仅终止您创建的进程,因此您可能无法终止进程,即使您是计算机上的管理员。

使用脚本可以克服所有这些潜在障碍,为你提供对计算机的相当大的管理控制。 例如,如果您怀疑用户正在玩组织中禁止的游戏,则可以轻松编写一个脚本来连接到每台计算机,确定游戏是否正在运行,并立即终止该过程。

使用 Terminate 方法

可以通过以下方法终止进程:

  • 正在终止当前正在运行的进程。 例如,你可能需要终止在远程计算机上运行的诊断程序。 如果没有办法远程控制应用程序,只需终止该应用程序的进程。
  • 阻止进程首次运行。 通过持续监视计算机上的进程创建,可以在启动进程后立即识别并立即终止进程。 这提供了一种方法来确保某些应用程序 (例如,通过 Internet 下载大型媒体文件的程序) 从不在某些计算机上运行。

备注

组策略还可以用于限制在计算机上运行的程序。 但组策略只能限制使用 "开始" 菜单或 Windows 资源管理器运行的程序;它不会影响使用其他方法(例如命令行)启动的程序。 相反,无论进程的启动方式如何,WMI 都可以阻止进程运行。

终止您不拥有的进程

若要终止非自己的进程,请启用 " SeDebugPrivilege " 特权。 在 VBScript 中,可以使用以下代码行启用此权限:

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

有关在 c + + 中启用此特权的详细信息,请参阅 启用和禁用 c + + 中的权限

示例

TechNet 库中的 " 在多个服务器上终止正在运行的进程 " PowerShell 代码示例终止在一台或多台计算机上运行的进程。

以下 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 进程。 指定或进程句柄 (进程 id 在代码中) 终止进程。 此值可以在) 的类的 key 属性 (Win32 _ 进程 类的 handle 属性中找到。 通过为 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
命名空间
根 \ CIMV2
MOF
CIMWin32
DLL
CIMWin32.dll

另请参阅

操作系统类

Win32 _ 进程

WMI 任务:性能监视

WMI 任务:进程