1 (изменено: OmTatSat, 2017-12-23 13:02:08)

Тема: AHK: найти PID процесса по CommandLine

Есть chrome, он имеет много процессов на время нужно останавливать процесс у которого известно комманду запуска.


chrome.exe	"C:\Users\Sat\AppData\Local\Chromium\Application\chrome.exe" --type=nacl-loader --service-request-channel-token=15AF08ACA73CB3C66A31E74BB7FF1500 --mojo-platform-channel-handle=6196 --ignored=" --type=renderer " /prefetch:8
nacl-loader

- константа, по ней и думаю искать процесс.

Потом при клике на окно chrome нужно восстанавливать процесс.

Gui, Add, ListView, x2 y0 w400 h500, Process Name|Command Line
for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
    LV_Add("", process.ProcessId, process.CommandLine)
Gui, Show,, Process List

Вот таким кодом получается увидеть и PID и команду запуска, но как найти строку с константой и использовать PID с неё?

Вот так думаю останавливать и запускать процесс

Process_Resume("5884")

;============================== Working on WinXP+

Process_Suspend(PID_or_Name){

    PID := (InStr(PID_or_Name,".")) ? ProcExist(PID_or_Name) : PID_or_Name

    h:=DllCall("OpenProcess", "uInt", 0x1F0FFF, "Int", 0, "Int", pid)

    If !h   

        Return -1

    DllCall("ntdll.dll\NtSuspendProcess", "Int", h)

    DllCall("CloseHandle", "Int", h)

}

Process_Resume(PID_or_Name){

    PID := (InStr(PID_or_Name,".")) ? ProcExist(PID_or_Name) : PID_or_Name

    h:=DllCall("OpenProcess", "uInt", 0x1F0FFF, "Int", 0, "Int", pid)

    If !h   

        Return -1

    DllCall("ntdll.dll\NtResumeProcess", "Int", h)

    DllCall("CloseHandle", "Int", h)

}

ProcExist(PID_or_Name=""){

    Process, Exist, % (PID_or_Name="") ? DllCall("GetCurrentProcessID") : PID_or_Name

    Return Errorlevel

}

2 (изменено: OmTatSat, 2017-12-23 13:02:36)

Re: AHK: найти PID процесса по CommandLine

Вот такое нашлось

for k in ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery("Select * from Win32_Process Where Name = 'chrome.exe'")

If k.CommandLine("nacl")
{
  MsgBox % k.ProcessId "`n" k.CommandLine
}

Только почему-то msgbox выводит все процессы chrome.exe а не только тот в котором команда nacl. Как это можно исправить?

3

Re: AHK: найти PID процесса по CommandLine

for k in ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery("Select * from Win32_Process Where CommandLine = '--type=nacl-loader'")


  MsgBox % k.ProcessId "`n" k.CommandLine

- не работает

Но

for k in ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery("Select * from Win32_Process Where ProcessId = '5884'")


  MsgBox % k.ProcessId "`n" k.CommandLine

Работает, как можно сделать чтобы работало с CommandLine?

4 (изменено: OmTatSat, 2017-12-23 16:26:16)

Re: AHK: найти PID процесса по CommandLine

Нашлось решение

for k in ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery("Select * from Win32_Process Where CommandLine like '%--type=nacl-loader --service-request-channel-token%'")


  MsgBox % k.ProcessId "`n" k.CommandLine

Помогла статья https://blogs.technet.microsoft.com/heyscriptingguy/2012/07/13/use-the-like-operator-to-simplify-your-wql-queries/