Página 1 de 1

Conocer la ruta del ejecutable de un proceso

Publicado: 31 Dic 2009, 14:50
por Jonny
Hola

Necesitaba saber la ruta del ejecutable de un proceso. Recordaba, que en "Scripts", había un script de Nahuel que hacía esto entre otras cosas, así que lo he buscado y aunque me ha costado un poquillo sacar solo el código que necesitaba, pues ese programa que, aunque no es el post adecuado... aprovecho para felicitar a Nahuel por él, da mucha info sobre los procesos, que no necesito por ahora.

Tras un rato, esto es lo que he montado para obtener la ruta de un proceso:

Código: Seleccionar todo

GetProcessPath("System")
Func GetProcessPath($ArgProc)
Local $N
$ArgProc=StringLower($ArgProc)
$WmiObj=ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy}!\\.\root\cimv2")
If IsObj($WmiObj) Then
$ColProcs=$WmiObj.ExecQuery("select * from win32_process")
If IsObj($ColProcs) Then
If $ColProcs.count=0 Then Return 0
For $OProc In $ColProcs
If StringLower($OProc.Name)==$ArgProc Then
Return $OProc.ExecutablePath
EndIf
$N+=1
Next
Return 0
Else
Return 0
EndIf
$ColProcs=0
EndIf
EndFunc
La duda es la siguiente:
En la función original donde está la mayoría del código anterior (GetProcessProperties()) dice que se necesitan pribilegios de administrador para que funcione. Yo, de los objetos aún ando pez, así que me he limitado a copiarlos y pegarlos, y creo que en ellos está el tema. Imagino, que concretamente en:

Código: Seleccionar todo

$WmiObj=ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy}!\\.\root\cimv2")
¿Puede modificarse esta función para que no sea necesario tener pribilegios de administrador para saber el path de un proceso?
Pue´s quizá el programa se ejecute en una máquina que no tenga estos pribilegios...
Si no se puede ¿Puede saberse el path de un proceso de otra forma que no implique ser administrador del equipo?
Gracias,

¡FELIZ AÑO!
Salu2!

Re: Conocer la ruta del ejecutable de un proceso

Publicado: 31 Dic 2009, 20:24
por Nahuel
Mm, en el foro inglés encontré este código:

http://www.autoitscript.com/forum/index ... ntry306485

Código: Seleccionar todo

MsgBox(0, '', _ProcessGetLocation(@AutoItPID))

Func _ProcessGetLocation($iPID)
    Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
    If $aProc[0] = 0 Then Return SetError(1, 0, '')
    Local $vStruct = DllStructCreate('int[1024]')
    DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
    Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
    If StringLen($aReturn[3]) = 0 Then Return SetError(2, 0, '')
    Return $aReturn[3]
EndFunc
Necesitás el PID de un proceso para saber su ruta (con ProcessExists() podés obtenerlo). Probala, puede que no necesites privilegios de administrador. Además es más rápida y sencilla que la otra.

Re: Conocer la ruta del ejecutable de un proceso

Publicado: 31 Dic 2009, 20:32
por Jonny
Hola

Gracias. Probaré ¿de verdad eso devuelve la ruta de un proceso? jejejeje.
Esque, me he quedao igual...

¿Como se obtiene el pid con ProcessExists()?

Salu2!

Re: Conocer la ruta del ejecutable de un proceso

Publicado: 31 Dic 2009, 20:43
por Nahuel
Te has quedado igual? No entendí.

Si, la función que está ahí devuelve la ruta de un proceso. La función ProcessExists() verifica si un proceso existe. De ser así, devuelve su PID.

Código: Seleccionar todo

$pid_notepad = ProcessExists("notepad.exe")

Re: Conocer la ruta del ejecutable de un proceso

Publicado: 01 Ene 2010, 12:32
por Jonny
jajaja
Se dice por aquí "Me he quedado igual", cuando no entiendes algo, que es lo que me ha pasado con la función... Cuando se tocan apis me pierdo...
La voy a reemplazar por la que hice basándome en tu programa ¡gracias!

Salu2!