web-dev-qa-db-ja.com

スレッドIDでプロセスを検索

私のプログラムの1つは、デバッグ目的でスレッドIDを出力します。テスト上の理由から、スレッドIDが属するプロセスを強制終了したいと思います。

スレッドIDを持っている場合、taskkillで使用できるようにプロセスIDを取得するにはどうすればよいですか?

私は試した

  • tasklistですが、広告IDのスイッチがないようです。
  • SysInternals Process Explorer の「ハンドルの検索」機能。これは機能しますが、バッチファイルで自動化できるものが必要です。
  • SysInternals ハンドル-a Thread、しかしそれはうまくいかないようです。 handle -a | find "Thread"うまく機能しますが、プロセス情報が失われます
2
Thomas Weller

あなたはバッチファイルでこのようにそれをすることができます:

バッチファイル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

使用法は次のようになります。
killprocess 13008

編集:中止オプション(選択)と強制終了されるプロセスの説明も追加しました。不要な場合は削除できます。

3
Rik

これが私のC++ソリューションです。誰かがそれを使用したい場合に備えて、私はそれをCC0 /パブリックドメインとしてライセンスします。私はめったにC++で実装しないので、間違いを許してください。

#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;
}
0
Thomas Weller