Получаем ключи запуска процесса по его идентификатору (PID). Получить их можно только у процесса соответствующей разрядности. То есть, 32-битная программа, не сможет получить эту информацию у 64-битного процесса и наоброт. Чтобы получить доступ к процессам запущенным от имени другого пользователя, нужно дать своему процессу привилегию SeDebugPrivilege [Установить привилегии процессу на выполнение системных операций].
1 2 3 4 5 6 7 |
var pid: Integer; cmdLine : array[0..255] of Char; begin pid:= 4708; if getProcessCommandLine(pid, cmdLine, 255) = true then ShowMessage(cmdLine); end; |
Параметры
pid - идентификатор процесса
cmdLine - переменная, которая будет содержать строку состоящую из пути к файлу процесса и ключей его запуска. Если ключей нет, только путь к файлу процесса.
Результат
True если операция успешна, False - если нет.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
function getProcessCommandLine(dwProcessID : Cardinal; szBuffer : PChar; cbBuffer : Cardinal): Bool; var hProcess, hThread : DWORD; pGetCommandLine : Pointer; pCommandLine : PChar; dwTID : DWORD; dwRead: SIZE_T; begin Result := FALSE; hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID); if (hProcess <> 0) then try pGetCommandLine := GetProcAddress(GetModuleHandle('kernel32.dll'), 'GetCommandLineW'); if (pGetCommandLine <> nil) then begin hThread := CreateRemoteThread(hProcess, NIL, 0, pGetCommandLine, nil, 0, dwTID); if (hThread <> 0) then try if WAIT_OBJECT_0 = WaitForSingleObject(hThread, 10000) then begin if GetExitCodeThread(hThread, PDWord(@pCommandLine)^) then begin if ReadProcessMemory(hProcess, pCommandLine, szBuffer, cbBuffer, dwRead) then begin szBuffer[dwRead] := #0; Result := TRUE end end end finally CloseHandle(hThread) end end finally CloseHandle(hProcess); end end; |