python - Hvordan kan jeg finde en proces ved navn og dræb med ctypes?

Indlæg af Hanne Mølgaard Plasc

Problem



På Windows vil jeg finde en proces med navnet 'exename.exe', og så dræbe det.


Hvordan kan jeg gøre det ved ctypes ikke noget andet 3-party modul?

Bedste reference


Prøv dette:


import sys, os.path, ctypes, ctypes.wintypes

Psapi = ctypes.WinDLL('Psapi.dll')
EnumProcesses = Psapi.EnumProcesses
EnumProcesses.restype = ctypes.wintypes.BOOL
GetProcessImageFileName = Psapi.GetProcessImageFileNameA
GetProcessImageFileName.restype = ctypes.wintypes.DWORD

Kernel32 = ctypes.WinDLL('kernel32.dll')
OpenProcess = Kernel32.OpenProcess
OpenProcess.restype = ctypes.wintypes.HANDLE
TerminateProcess = Kernel32.TerminateProcess
TerminateProcess.restype = ctypes.wintypes.BOOL
CloseHandle = Kernel32.CloseHandle

MAX\_PATH = 260
PROCESS\_TERMINATE = 0x0001
PROCESS\_QUERY\_INFORMATION = 0x0400

count = 32
while True:
    ProcessIds = (ctypes.wintypes.DWORD*count)()
    cb = ctypes.sizeof(ProcessIds)
    BytesReturned = ctypes.wintypes.DWORD()
    if EnumProcesses(ctypes.byref(ProcessIds), cb, ctypes.byref(BytesReturned)):
        if BytesReturned.value<cb:
            break
        else:
            count *= 2
    else:
        sys.exit("Call to EnumProcesses failed")

for index in range(BytesReturned.value / ctypes.sizeof(ctypes.wintypes.DWORD)):
    ProcessId = ProcessIds[index]
    hProcess = OpenProcess(PROCESS\_TERMINATE | PROCESS\_QUERY\_INFORMATION, False, ProcessId)
    if hProcess:
        ImageFileName = (ctypes.c\_char*MAX\_PATH)()
        if GetProcessImageFileName(hProcess, ImageFileName, MAX\_PATH)>0:
            filename = os.path.basename(ImageFileName.value)
            if filename == 'notepad.exe':
                TerminateProcess(hProcess, 1)
        CloseHandle(hProcess)

Andre referencer 1


Dette kan være snydt, men det virker uden endda at få ctypes involveret.


import subprocess
subprocess.call("taskkill /IM exename.exe")


taskkill er en Windows-kommando; dette anvender bare det gennem python.