Win32_Process 类的 Terminate 方法
TerminateWMI 类方法终止进程及其所有线程。
本主题使用托管对象格式 (MOF) 语法。 有关使用此方法的详细信息,请参阅 调用方法。
语法
uint32 Terminate(
[in] uint32 Reason
);
参数
-
原因 [in]
-
进程和由于此调用而终止的所有线程的退出代码。
返回值
如果成功终止进程,则返回 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) 以终止进程。 此值可以在 Win32_Process 类的 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 |
命名空间 |
Root\CIMV2 |
MOF |
|
DLL |
|