Método Terminate de la clase Win32_Process

El método declase Terminate WMI finaliza un proceso y todos sus subprocesos.

En este tema se usa la sintaxis de Managed Object Format (MOF). Para obtener más información sobre el uso de este método, vea Llamar a un método.

Sintaxis

uint32 Terminate(
  [in] uint32 Reason
);

Parámetros

Motivo [in]

Código de salida para el proceso y para todos los subprocesos finalizados como resultado de esta llamada.

Valor devuelto

Devuelve un valor de 0 (cero) si el proceso finalizó correctamente y cualquier otro número para indicar un error. Para obtener códigos de error adicionales, consulte Constantes de error WMI o WbemErrorEnum. Para obtener valores HRESULT generales, consulte Códigos de error del sistema.

Finalización correcta (0)

Acceso denegado (2)

Privilegio insuficiente (3)

Error desconocido (8)

Ruta de acceso no encontrada (9)

Parámetro no válido (21)

Otros (22 4294967295)

Comentarios

Información general

Los problemas informáticos suelen deberse a un proceso que ya no funciona según lo previsto. Por ejemplo, el proceso podría estar filtrando memoria o podría haber dejado de responder a la entrada del usuario. Cuando se producen problemas como estos, el proceso debe finalizarse. Aunque esto puede parecer una tarea lo suficientemente sencilla, la terminación de un proceso puede ser complicada por varios factores:

  • El proceso puede estar bloqueado y, por tanto, ya no responde a los comandos de menú o teclado para cerrar la aplicación. Esto hace que sea todo pero imposible que el usuario típico descarte la aplicación y finalice el proceso.
  • Es posible que el proceso esté huérfano. Por ejemplo, un script podría crear una instancia de Word y, a continuación, salir sin destruir esa instancia. En efecto, Word sigue ejecutándose en el equipo, aunque no haya ninguna interfaz de usuario visible. Dado que no hay ninguna interfaz de usuario, no hay ningún menú ni comandos de teclado disponibles para finalizar el proceso.
  • Es posible que no sepa qué proceso debe finalizarse. Por ejemplo, es posible que desee finalizar todos los programas que superen una cantidad de memoria especificada.
  • Dado que el Administrador de tareas le permite finalizar solo los procesos que ha creado, es posible que no pueda finalizar un proceso, incluso si es administrador en el equipo.

Los scripts le permiten superar todos estos obstáculos potenciales, lo que le proporciona un control administrativo considerable sobre los equipos. Por ejemplo, si sospecha que los usuarios están jugando juegos prohibidos en su organización, puede escribir fácilmente un script para conectarse a cada equipo, identificar si el juego se está ejecutando y finalizar inmediatamente el proceso.

Usar el método Terminate

Para finalizar un proceso, haga lo siguiente:

  • Terminación de un proceso que se está ejecutando actualmente. Por ejemplo, es posible que tenga que finalizar un programa de diagnóstico que se ejecuta en un equipo remoto. Si no hay ninguna manera de controlar la aplicación de forma remota, simplemente puede finalizar el proceso de esa aplicación.
  • Impedir que un proceso se ejecute en primer lugar. Al supervisar continuamente la creación de procesos en un equipo, puede identificar e finalizar al instante cualquier proceso tan pronto como se inicie. Esto proporciona un método para garantizar que ciertas aplicaciones (como programas que descargan archivos multimedia grandes a través de Internet) nunca se ejecutan en determinados equipos.

Nota

directiva de grupo también se puede usar para restringir los programas que se ejecutan en un equipo. Sin embargo, directiva de grupo solo pueden restringir los programas que se ejecutan mediante el menú Inicio o el Explorador de Windows; no tiene ningún efecto en los programas que se inician con otros medios, como la línea de comandos. Por el contrario, WMI puede impedir que un proceso se ejecute independientemente de cómo se inició el proceso.

Terminación de un proceso que no posee

Para finalizar un proceso que no posee, habilite el privilegio SeDebugPrivilege . En VBScript, puede habilitar este privilegio con las siguientes líneas de código:

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

Para obtener más información sobre cómo habilitar este privilegio en C++, consulte Habilitación y deshabilitación de privilegios en C++.

Ejemplos

El ejemplo de código De finalización en ejecución en varios servidores de PowerShell en la Galería de TechNet finaliza un proceso que se ejecuta en uno o varios equipos.

El siguiente ejemplo de VBScript finaliza el proceso en el que la aplicación Diagnose.exe se está ejecutando actualmente.

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

En el ejemplo de VBScript siguiente se usa un consumidor de eventos temporales para finalizar un proceso en cuanto se inicia.

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

El siguiente ejemplo de código vbScript se conecta a un equipo remoto y finaliza Notepad.exe en ese equipo.

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

El siguiente código de C++ finaliza el proceso de Notepad.exe en el equipo local. Especifique un identificador de proceso o (id. de proceso) en el código para finalizar el proceso. Este valor se puede encontrar en la propiedad handle de la clase Win32_Process (la propiedad key de la clase ). Al especificar un valor para la propiedad Handle, se proporciona una ruta de acceso a la instancia de la clase que desea finalizar. Para obtener más información sobre cómo conectarse a un equipo remoto, vea Ejemplo: Obtener datos WMI de un equipo remoto.

#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;
}

Requisitos

Requisito Value
Cliente mínimo compatible
Windows Vista
Servidor mínimo compatible
Windows Server 2008
Espacio de nombres
Root\CIMV2
MOF
CIMWin32.mof
Archivo DLL
CIMWin32.dll

Consulte también

Clases de sistema operativo

Win32_Process

Tareas de WMI: Supervisión del rendimiento

Tareas de WMI: procesos