Тема: AHK: Получить полный список запущенных процессов.
Привет народ. Как можно получить полный список запущенных процессов?
Желательно не обращаться к командной строке.
Полная информация о процессах тоже лишней не будет. (Эту тему видел)
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Привет народ. Как можно получить полный список запущенных процессов?
Желательно не обращаться к командной строке.
Полная информация о процессах тоже лишней не будет. (Эту тему видел)
Molotok, почитайте для начала справку по команде Process.
Так можно получить список, путь к процессам, и кое-какую информацию о процессах:
#NoEnv
#SingleInstance Force
SetBatchLines -1
AccessRights_EnableSeDebug()
OUT_LIST := "", COUNT_NO_PATHS := 0
for i, v in WTSEnumerateProcessesEx()
{
FullEXEPath := GetModuleFileNameEx( v.ProsessID )
OUT_LIST := OUT_LIST . "Name: " . v.ProcessName . "`nPath: " . FullEXEPath . "`nLegal: " . FileGetInfo( FullEXEPath ).LegalCopyright . "`n`n"
}
Clipboard := OUT_LIST
msgbox % OUT_LIST
return
; ==============================================================
; WTSEnumerateProcessesEx() By JNIZM - https://autohotkey.com/boards/viewtopic.php?t=19323
;==============================================================
Return
WTSEnumerateProcessesEx()
{
static hWTSAPI := DllCall("LoadLibrary", "str", "wtsapi32.dll", "ptr")
if !(DllCall("wtsapi32\WTSEnumerateProcessesEx", "ptr", 0, "uint*", 0, "uint", -2, "ptr*", buf, "uint*", TTL))
throw Exception("WTSEnumerateProcessesEx failed", -1)
addr := buf, WTS_PROCESS_INFO := []
loop % TTL
{
WTS_PROCESS_INFO[A_Index, "SessionID"] := NumGet(addr+0, "uint")
WTS_PROCESS_INFO[A_Index, "ProsessID"] := NumGet(addr+4, "uint")
WTS_PROCESS_INFO[A_Index, "ProcessName"] := StrGet(NumGet(addr+8, "ptr"))
WTS_PROCESS_INFO[A_Index, "UserSID"] := NumGet(addr+8+A_PtrSize, "ptr")
addr += 8 + (A_PtrSize * 2)
}
if !(DllCall("wtsapi32\WTSFreeMemoryEx", "int", 0, "ptr", buf, "uint", TTL))
throw Exception("WTSFreeMemoryEx failed", -1)
return WTS_PROCESS_INFO
}
Return
; ==================================================
; FileGetInfo() By Lexikos - https://autohotkey.com/boards/viewtopic.php?t=4282
;===================================================
FileGetInfo( lptstrFilename) {
List := "Comments InternalName ProductName CompanyName LegalCopyright ProductVersion"
. " FileDescription LegalTrademarks PrivateBuild FileVersion OriginalFilename SpecialBuild"
dwLen := DllCall("Version.dll\GetFileVersionInfoSize", "Str", lptstrFilename, "Ptr", 0)
dwLen := VarSetCapacity( lpData, dwLen + A_PtrSize)
DllCall("Version.dll\GetFileVersionInfo", "Str", lptstrFilename, "UInt", 0, "UInt", dwLen, "Ptr", &lpData)
DllCall("Version.dll\VerQueryValue", "Ptr", &lpData, "Str", "\VarFileInfo\Translation", "PtrP", lplpBuffer, "PtrP", puLen )
sLangCP := Format("{:04X}{:04X}", NumGet(lplpBuffer+0, "UShort"), NumGet(lplpBuffer+2, "UShort"))
i := {}
Loop, Parse, % List, %A_Space%
DllCall("Version.dll\VerQueryValue", "Ptr", &lpData, "Str", "\StringFileInfo\" sLangCp "\" A_LoopField, "PtrP", lplpBuffer, "PtrP", puLen )
? i[A_LoopField] := StrGet(lplpBuffer, puLen) : ""
return i
}
Return
; =================================================================================================
; GetModuleFileNameEx() By Shimanov as cited by SKAN - https://autohotkey.com/board/topic/41197-getting-a-full-executable-path-from-a-running-process/
; Modified to use GetModuleFileNameExW if A_IsUnicode - By Gio - 03-11-17
;=================================================================================================
GetModuleFileNameEx( p_pid ) ; by shimanov - www.autohotkey.com/forum/viewtopic.php?t=9000
{
if A_OSVersion in WIN_95,WIN_98,WIN_ME
{
MsgBox, This Windows version (%A_OSVersion%) is not supported.
return
}
h_process := DllCall( "OpenProcess", "uint", 0x10|0x400, "int", false, "uint", p_pid )
if ( ErrorLevel or h_process = 0 )
return
name_size = 255
VarSetCapacity( name, name_size )
If A_IsUnicode
result := DllCall( "psapi.dll\GetModuleFileNameExW", "uint", h_process, "uint", 0, "str" , name, "uint", name_size )
Else
result := DllCall( "psapi.dll\GetModuleFileNameExA", "uint", h_process, "uint", 0, "str" , name, "uint", name_size )
DllCall( "CloseHandle", h_process )
return, name
}
; =================================================================================================
; AccessRights_EnableSeDebug() By Cyruz - https://autohotkey.com/boards/viewtopic.php?t=2039
;=================================================================================================
; ----------------------------------------------------------------------------------------------------------------------
; Function .....: AccessRights_EnableSeDebug
; Description ..: Enable the SE_DEBUG_PRIVILEGE on the current script instance.
; AHK Version ..: AHK_L x32/64 Unicode
; Author .......: Cyruz - http://ciroprincipe.info
; License ......: WTFPL - http://www.wtfpl.net/txt/copying/
; Changelog ....: Feb. 5, 2014 - v0.1 - First version.
; ----------------------------------------------------------------------------------------------------------------------
AccessRights_EnableSeDebug() {
hProc := DllCall( "OpenProcess", UInt,0x0400, Int,0, UInt,DllCall("GetCurrentProcessId"), "Ptr" )
DllCall( "Advapi32.dll\OpenProcessToken", Ptr,hProc, UInt,0x0020|0x0008, PtrP,hToken )
VarSetCapacity(LUID, 8, 0)
DllCall( "Advapi32.dll\LookupPrivilegeValue", Ptr,0, Str,"SeDebugPrivilege", Ptr,&LUID )
VarSetCapacity( TOKPRIV, 16, 0 ) ; TOKEN_PRIVILEGES structure: http://goo.gl/AGXeAp.
NumPut( 1, &TOKPRIV, 0, "UInt" ) ; TOKEN_PRIVILEGES > PrivilegeCount.
NumPut( NumGet( &LUID, 0, "UInt" ), &TOKPRIV, 4, "UInt" ) ; TOKEN_PRIVILEGES > LUID_AND_ATTRIBUTES > LUID > LoPart.
NumPut( NumGet( &LUID, 4, "UInt" ), &TOKPRIV, 8, "UInt" ) ; TOKEN_PRIVILEGES > LUID_AND_ATTRIBUTES > LUID > HiPart.
NumPut( 2, &TOKPRIV, 12, "UInt" ) ; TOKEN_PRIVILEGES > LUID_AND_ATTRIBUTES > Attributes.
; SE_PRIVILEGE_ENABLED = 2.
DllCall( "Advapi32.dll\AdjustTokenPrivileges", Ptr,hToken, Int,0, Ptr,&TOKPRIV, UInt,0, Ptr,0, Ptr,0 )
DllCall( "CloseHandle", Ptr,hToken )
DllCall( "CloseHandle", Ptr,hProc )
}
Правда, в Msgbox все процессы не вмещаются, но они копируются в буфер обмена.
И чтобы отображались пути к системные процессам, от администратора запускайте скрипт.
Вот.
#NoEnv
#SingleInstance Force
SetBatchLines -1
MsgBox % WTSEnumProcesses( Mode := 2 ) ; Mode 0 - только PID, 1 PID + имя процесса, 2 только имя процесса
WTSEnumProcesses( Mode := 1 ) { ; By SKAN, http://goo.gl/6Zwnwu, CD:24/Aug/2014 | MD:25/Aug/2014
Local tPtr := 0, pPtr := 0, nTTL := 0, LIST := ""
If not DllCall( "Wtsapi32\WTSEnumerateProcesses", "Ptr",0, "Int",0, "Int",1, "PtrP",pPtr, "PtrP",nTTL )
Return "", DllCall( "SetLastError", "Int",-1 )
tPtr := pPtr
Loop % ( nTTL )
LIST .= ( Mode < 2 ? NumGet( tPtr + 4, "UInt" ) : "" ) ; PID
. ( Mode = 1 ? A_Tab : "" )
. ( Mode > 0 ? StrGet( NumGet( tPtr + 8 ) ) "`n" : "," ) ; Process name
, tPtr += ( A_PtrSize = 4 ? 16 : 24 ) ; sizeof( WTS_PROCESS_INFO )
StringTrimRight, LIST, LIST, 1
DllCall( "Wtsapi32\WTSFreeMemory", "Ptr",pPtr )
Return LIST, DllCall( "SetLastError", "UInt",nTTL )
}
Molotok, почитайте для начала справку по команде Process.
Читал и использовал. Команда Process много чего не умеет.
svoboden, powercat - спасибо за код. Особенно полезен первый скрипт. С его помощью можно вытащить PID каждого процесса в списке. Даже когда много процессов с одним именем.
Читал и использовал
Ну, если бы читали до конца, то либо такой вопрос не задали бы, либо иначе сформулировали, т. к. аккурат в конце этой статьи данная тема и рассматривается.
Хотя приведённый выше код даже лучше, вроде бы.
В общем, вот, переделал немного, так можно отобразить все процессы в GUI с их информацией.
#SingleInstance Ignore
full_command_line := DllCall("GetCommandLine", "str")
if not (A_IsAdmin or RegExMatch(full_command_line, " /restart(?!\S)"))
{
try
{
if A_IsCompiled
RunWait *RunAs "%A_ScriptFullPath%" /restart
else
RunWait *RunAs "%A_AhkPath%" /restart "%A_ScriptFullPath%"
}
}
if not A_IsAdmin
{
MsgBox,Administrator rights not found, the program might not work correctly.
}
Gui, New, -DPIScale
Gui, Add, ListView, x0 y0 w%A_ScreenWidth% h480, CreationClassName|Caption|CommandLine|CreationDate|CSCreationClassName|CSName|Description|ExecutablePath|ExecutionState|Handle|HandleCount|InstallDate|KernelModeTime|MaximumWorkingSetSize|MinimumWorkingSetSize|Name|OSCreationClassName|OSName|OtherOperationCount|OtherTransferCount|PageFaults|PageFileUsage|ParentProcessId|PeakPageFileUsage|PeakVirtualSize|PeakWorkingSetSize|Priority|PrivatePageCount|ProcessId|QuotaNonPagedPoolUsage|QuotaPagedPoolUsage|QuotaPeakNonPagedPoolUsage|QuotaPeakPagedPoolUsage|ReadOperationCount|ReadTransferCount|SessionId|Status|TerminationDate|ThreadCount|UserModeTime|VirtualSize|WindowsVersion|WorkingSetSize|WriteOperationCount|WriteTransferCount|Legal Info
for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
LV_Add("", process.Handle, process.Caption, process.CommandLine, process.CreationDate, process.CSCreationClassName, process.CSName, process.Description, process.ExecutablePath, process.ExecutionState, process.Handle, process.HandleCount, process.InstallDate, process.KernelModeTime, process.MaximumWorkingSetSize, process.MinimumWorkingSetSize, process.Name, process.OSCreationClassName, process.OSName, process.OtherOperationCount, process.OtherTransferCount, process.PageFaults, process.PageFileUsage, process.ParentProcessId, process.PeakPageFileUsage, process.PeakVirtualSize, process.PeakWorkingSetSize, process.Priority, process.PrivatePageCount, process.ProcessId, process.QuotaNonPagedPoolUsage, process.QuotaPagedPoolUsage, process.QuotaPeakNonPagedPoolUsage, process.QuotaPeakPagedPoolUsage, process.ReadOperationCount, process.ReadTransferCount, process.SessionId, process.Status, process.TerminationDate, process.ThreadCount, process.UserModeTime, process.VirtualSize, process.WindowsVersion, process.WorkingSetSize, process.WriteOperationCount, process.WriteTransferCount)
LV_ModifyCol()
Gui, Show,, Process List
return
GuiClose:
ExitApp
svoboden - супер! Почти готовый диспетчер задач, или Process Explorer!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться