Localizar processo por ID de thread

1

Um dos meus programas gera seu ID de thread para fins de depuração. Por motivos de teste, gostaria de eliminar o processo ao qual o ID de encadeamento pertence.

Como faço para obter o ID do processo se eu tiver o ID do encadeamento para que eu possa usá-lo com taskkill ?

Eu tentei

  • tasklist , mas parece que não há um interruptor para os IDs do grupo.
  • SysInternals O recurso "Localizar identificador" do Process Explorer , que funciona, mas eu precisaria algo que pode ser automatizado em um arquivo de lote
  • SysInternals Manuseie -a Thread , mas isso parece não funcionar. handle -a | find "Thread" funciona melhor, mas perco as informações do processo
por Thomas Weller 21.09.2015 / 11:37

2 respostas

3

Você pode fazer isso com um arquivo em lotes:

Batchfile killprocess.bat:

@echo off
set processhandle=
set description=
set handle=%1
IF "%handle%." == "." (
  echo Usage: killprocess threadID
  exit/b
)

FOR /F "tokens=*" %%A IN ('WMIC PATH Win32_thread WHERE handle^=%handle% GET Processhandle /VALUE ^| find "="') DO set "%%A"
FOR /F "tokens=*" %%A IN ('WMIC PATH Win32_process WHERE handle^=%processhandle% GET Description /VALUE ^| find "="') DO set "%%A"

IF "%ProcessHandle%." == "." (
  echo ThreadID not found
  exit/b
)

echo I'm going to kill %Description% (Processhandle = %processhandle%) if you don't press Q in 5 seconds
echo (or you can press Y to continue)
choice /N /T 5 /C yq /D y
if "%errorlevel%"=="2" goto :eof

echo Killing %Description% (Processhandle = %processhandle%)
Taskkill /PID %processhandle% /T /F

O uso seria algo assim:
killprocess 13008

Edit: Eu também adicionei uma opção de aborto (escolha) e uma descrição do processo que está sendo morto. Você pode excluir isso se não quiser.

    
por 21.09.2015 / 13:49
0

Aqui está a minha solução C ++, caso alguém queira usá-la, licencie-a como CC0 / domínio público. Eu raramente implemento em C ++, então perdoe erros.

#include "stdafx.h"
#include <sstream>
#include <windows.h>
#include <stdio.h>
#include <iostream>
int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        std::cout << "Usage: " << argv[0] << " <Thread ID>" << std::endl;
        std::cout << "Returns the process ID of a thread." << std::endl;
        std::cout << "Errorlevels:" << std::endl;
        std::cout << "   0 success" << std::endl;
        std::cout << "   1 too few arguments" << std::endl;
        std::cout << "   2 error parsing thread ID" << std::endl;
        std::cout << "   3 error opening thread" << std::endl;
        return 1;
    }

    std::istringstream iss(argv[1]);
    int threadId;

    if (iss >> threadId)
    {
        std::cout << threadId << std::endl;
        HANDLE threadHandle = OpenThread(THREAD_QUERY_INFORMATION, false, (DWORD)threadId);
        if (threadHandle)
        {
            DWORD pid = GetProcessIdOfThread(threadHandle);
            CloseHandle(threadHandle);
            std::cout << pid << std::endl;
            return 0;
        }
        std::cerr << "Error opening thread. Perhaps run as admin or thread does not exist?";
        return 3;
    }
    std::cerr << "Error parsing thread ID. Use decimal, not hex?";
    return 2;
}
    
por 21.09.2015 / 14:32