Conocer la ruta del ejecutable de un proceso

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Conocer la ruta del ejecutable de un proceso

Mensaje 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!
Avatar de Usuario
Nahuel
Hacker del Foro
Mensajes: 194
Registrado: 27 Jun 2007, 23:32
Ubicación: Argentina
Contactar:

Re: Conocer la ruta del ejecutable de un proceso

Mensaje 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.
No soy un hombre de plegarias, pero si estás en el cielo sálvame por favor Superman!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Conocer la ruta del ejecutable de un proceso

Mensaje 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!
Avatar de Usuario
Nahuel
Hacker del Foro
Mensajes: 194
Registrado: 27 Jun 2007, 23:32
Ubicación: Argentina
Contactar:

Re: Conocer la ruta del ejecutable de un proceso

Mensaje 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")
No soy un hombre de plegarias, pero si estás en el cielo sálvame por favor Superman!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Conocer la ruta del ejecutable de un proceso

Mensaje 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!
Responder