Tema destacado: Suscripción al boletín mensual de elhacker.net
Autor
|
Tema: [Solucionado] Obtener la ruta de todos los procesos en ejecución (Leído 2,742 veces)
|
Segurida
Desconectado
Mensajes: 61
|
Hola, necesito saber el método para conocer la ruta de todos los procesos en ejecucción, es decir, obtener una lista de todos los procesos, y después obtener la ruta de cada uno de ellos en un String (para luego poder continuar con mi código) Si alguien conoce cómo hacerlo, se lo agradezco. saludos.
|
|
|
|
« Última modificación: 26 Mayo 2011, 13:33 por Segurida »
|
En línea
|
|
|
|
|
seba123neo
|
Hola, la forma basica en .NET es esta: For Each p As Process In Process.GetProcesses() Debug.WriteLine(p.Modules(0).FileName) Next creo que algunos te pueden tirar un error de acceso denegado, es cuestion de poner un Try Catch y controlar el error, o ver otra forma de sacar el path. saludos.
|
|
|
|
|
En línea
|
Mucha gente, especialmente la ignorante desea castigarte por decir la verdad, por ser correcto, por ser tú. Nunca te disculpes por ser correcto, o por estar años delante de tu tiempo. Si estas en lo cierto, y lo sabes, que hable tu razón. Incluso si eres una minoria de uno solo, la verdad sigue siendo la verdad. M. Gandhi
|
|
|
Segurida
Desconectado
Mensajes: 61
|
Muchas gracias de nuevo, pongo el código completo por si le sirve a alguien: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try For Each p As Process In Process.GetProcesses() Debug.WriteLine(p.Modules(0).FileName) Next p Catch p As Exception MsgBox(p.ToString) End Try End Sub Mil gracias 
|
|
|
|
|
En línea
|
|
|
|
Segurida
Desconectado
Mensajes: 61
|
¿se puede hacer sin que devuelva error de ningún proceso? es decir sacar la ruta de todos los procesos, de esta manera me da la ruta de algunos, como dijiste algunos da acceso denegado, ¿se puede saber de todos, sin excepciones?
|
|
|
|
|
En línea
|
|
|
|
.mokk.
Desconectado
Mensajes: 177
|
Talves si pones que el programa corra como administrador.
|
|
|
|
|
En línea
|
|
|
|
Segurida
Desconectado
Mensajes: 61
|
lo estoy probando en xp, que da menos problemas que en vista/7, pero aun asi, ¿no se puede desde código? si la aplicación la pongo al inicio de windows no se abriría como administrador, por eso necesito por código... saludos.
|
|
|
|
|
En línea
|
|
|
|
Krähne
Desconectado
Mensajes: 51
It can't rain all the time...
|
lo estoy probando en xp, que da menos problemas que en vista/7, pero aun asi, ¿no se puede desde código? si la aplicación la pongo al inicio de windows no se abriría como administrador, por eso necesito por código... saludos.
Trata de elevar tus privilegios, con AdjustTokenPrivileges. Aquí un ejemplo.
|
|
|
|
« Última modificación: 22 Mayo 2011, 22:31 por Krähne »
|
En línea
|
Yo soy más sabio que este hombre; es posible que ninguno de los dos sepamos cosa que valga la pena, pero él cree que sabe algo, pese a no saberlo, mientras que yo, así como no sé nada, tampoco creo saberlo. Yo no tengo conciencia de saber nada.
|
|
|
Segurida
Desconectado
Mensajes: 61
|
Jeje , no me aclaro  , he puesto la funcion pero no sé cómo utilizarla para dar permisos de administrador a mi aplicación, si me puedes ayudar, muchas gracias. saludos.
|
|
|
|
|
En línea
|
|
|
|
Krähne
Desconectado
Mensajes: 51
It can't rain all the time...
|
¿se puede hacer sin que devuelva error de ningún proceso? es decir sacar la ruta de todos los procesos, de esta manera me da la ruta de algunos, como dijiste algunos da acceso denegado, ¿se puede saber de todos, sin excepciones?
NO, no puedes sacar la ruta de TODOS los procesos en ejecución, como te he dicho en temas anteriores, son procesos críticos y protegidos, por más que intentes no lo lograrás en modo usuario, y no sé si puedas en modo kernel. Jeje , no me aclaro  , he puesto la funcion pero no sé cómo utilizarla para dar permisos de administrador a mi aplicación, si me puedes ayudar, muchas gracias. saludos. Por tal, de nada te va a servir elevar privilegios.
|
|
|
|
|
En línea
|
Yo soy más sabio que este hombre; es posible que ninguno de los dos sepamos cosa que valga la pena, pero él cree que sabe algo, pese a no saberlo, mientras que yo, así como no sé nada, tampoco creo saberlo. Yo no tengo conciencia de saber nada.
|
|
|
Segurida
Desconectado
Mensajes: 61
|
el TuneUp (sin ejecutar como administrador) me da la ruta de cada proceso ejecutado, incluidos de sistema y antivirus, por eso pregunté como poder hacerlo, porque se que se puede, ¿sabes utilizar AdjustTokenPrivileges? si sabes y me puedes decir cómo utilizarlo, te los agradezco mucho, no se cómo utilizarla. saludos
|
|
|
|
|
En línea
|
|
|
|
Krähne
Desconectado
Mensajes: 51
It can't rain all the time...
|
el TuneUp (sin ejecutar como administrador) me da la ruta de cada proceso ejecutado, incluidos de sistema y antivirus, por eso pregunté como poder hacerlo, porque se que se puede, ¿sabes utilizar AdjustTokenPrivileges? si sabes y me puedes decir cómo utilizarlo, te los agradezco mucho, no se cómo utilizarla. saludos
Antes que nada, se me viene una duda muy grande a al cabeza, y es... ¿Cuál es la ruta de los procesos "System", "System Idle Process" y "winlogon.exe"?. Luego que me respondas esto, te digo cómo he logrado obtener la ruta de todos los demás procesos. Exceptuando esos que te nombro, se me hace imposible conseguirla.
|
|
|
|
|
En línea
|
Yo soy más sabio que este hombre; es posible que ninguno de los dos sepamos cosa que valga la pena, pero él cree que sabe algo, pese a no saberlo, mientras que yo, así como no sé nada, tampoco creo saberlo. Yo no tengo conciencia de saber nada.
|
|
|
Segurida
Desconectado
Mensajes: 61
|
Lo de System e Idle, no se a qué proceso te refieres, si te instalas TuneUp 2011, hay una parte que se llama TuneUp Process Manager, ahí te da el nombre, ruta, nombre de archivo, etc... el unico que encuentro en winlogon.exe, esta en c:\windows\system32 en esto del tuneup se llama "aplicación de inicio de sesion de windows", le das un clic y abajo te pone el resto y si le das dos clics te da más info  de verdad, que se puede sacar la ruta de todos los rocesos, pero yo no se cómo hacerlo, si no me crees, instalate el tuneup, y lo compruebas por ti mismo. saludos.
|
|
|
|
|
En línea
|
|
|
|
Krähne
Desconectado
Mensajes: 51
It can't rain all the time...
|
Lo de System e Idle, no se a qué proceso te refieres, si te instalas TuneUp 2011, hay una parte que se llama TuneUp Process Manager, ahí te da el nombre, ruta, nombre de archivo, etc... el unico que encuentro en winlogon.exe, esta en c:\windows\system32 en esto del tuneup se llama "aplicación de inicio de sesion de windows", le das un clic y abajo te pone el resto y si le das dos clics te da más info  de verdad, que se puede sacar la ruta de todos los rocesos, pero yo no se cómo hacerlo, si no me crees, instalate el tuneup, y lo compruebas por ti mismo. saludos. Bueno... luego de pensarlo bien, he terminado por bajarme el TuneUP (Vaya que lo detesto) para nada. Al abrir el TuneUP y llegar a donde me dices, me encuentro con que el cutre software tampoco logra obtener la ruta de los procesos que te dije, exceptuando winlogon.exe (proceso del cual ya logré obtener su ruta). Los procesos son llamados así en el administrador de tareas: System Proceso inactivo del sistema Y en el TuneUP tan sólo les cambian el nombre a: System -> Proceso del sistema Proceso inactivo del sistema -> El mismo nombre Estos tienen por ID: System -> 4 Proceso inactivo del sistema -> 0 Y son procesos con archivos cuya locación no existe, no sé el porqué, a lo mejor son creados por el kernel virtualmente, lo único que sé es que System inicia el Proceso inactivo del sistema (He allí el porqué de sus IDs tan bajos) y en adelante se cargará el resto, luego explorer.exe hace lo demás supongo... Finalmente he logrado obtener la ruta de todos los procesos, con excepción de esos 2, al igual que el TuneUP, así que... por mi lado no obtendrás más ayuda que ésta, y sinceramente dudo que encuentres otro tipo de ayuda ya que, ni si quiera el "grandioso" TuneUP logra obtener esas rutas. La manera en que obtuve la ruta de cada proceso, no fue elevando mis privilegios, fue con el uso de APIS, dejándo de lado las clases Process, y demás que tiene la plataforma .NET, sin embargo y en contraposición con lo que acabé de decir, usé la clase Process para obtener cada ID de proceso y su nombre, para así mediante APIS obtener sus directorios. El código es el siguiente: Imports System.Text 'Importación necesaria para el StringBuilder. Imports System.Diagnostics 'Importacion obligatoria para obtener los IDs y Nombres de cada proceso. Imports System.Runtime.InteropServices 'Importación más que obligatoria para poder declarar las APIS a usar. Public Class Formulario <DllImport("kernel32.dll")> _ Private Shared Function OpenProcess(ByVal dwDesiredAccess As Integer, <MarshalAs(UnmanagedType.Bool)> ByVal bInheritHandle As Boolean, ByVal dwProcessId As Integer) As IntPtr End Function 'Declaramos la API OpenProcess para abrir el handle del proceso al que queremos obtener su directorio, le pasamos como primer parámetro el número de acceso correspondiente al procedimiento a realizar, con ésto ya nos evitamos el hecho de "elevar" privilegios. <DllImport("psapi.dll")> _ Public Shared Function GetModuleFileNameEx(ByVal hProcess As IntPtr, ByVal hModule As IntPtr, <Out()> ByVal lpBaseName As StringBuilder, <[In]()> <MarshalAs(UnmanagedType.U4)> ByVal nSize As Integer) As UInteger End Function 'Declaramos la API GetModuleFileNameEx para obtener el directorio del módulo que se le pase como parámetro, pero... como no pasarémos ningún parámetro al momento de elegir un módulo, el elegirá el primer módulo del proceso, justo lo que necesitamos. <DllImport("kernel32.dll", SetLastError:=True)> _ Public Shared Function CloseHandle(ByVal hObject As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean End Function 'Finalmente se declara la API CloseHandle para cerrar el handle abierto por OpenProcess. Private Sub ObtenerDatos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click ObtenerDatosProcesos() 'Realizamos el proceso para la obtención de datos de cada proceso. End Sub Public Sub ObtenerDatosProcesos() 'Creamos la función que no devuelve datos para agregar la información al ListView. Dim DirectorioActual As New StringBuilder(1024) 'Declaramos el StringBuilder de tamaño 1024 que nos pide como tercer parámetro GetModuleFileNameEx para guardar allí la ruta del proceso. Dim Procesos As Process() = Process.GetProcesses() 'Enlistamos los procesos en ejecución. ListaProcesos.Items.Clear() 'Eliminamos todos los items para agregar los nuevos. For i As Integer = 0 To Procesos.Length - 1 'Iniciamos un búcle para pasear por cada proceso eligiéndo su ID y Nombre de la clase Process. Dim hProceso As IntPtr = OpenProcess(1048, False, Procesos(i).Id) 'Declaramos una variable de tipo puntero para almacenar el handle obtenido por OpenProcess al cual le pasamos como parámetros el tipo de acceso, el cual en este caso es 1048 para poder leer la ubicación del módulo base, segundo parámetro False ya que no deseamos heredar el handle, y finalmente el ID del proceso actual. GetModuleFileNameEx(hProceso, IntPtr.Zero, DirectorioActual, 1024) 'Finalmente obtenemos la ruta del proceso actual, los parámetros dados son el handle del proceos, IntPtr.Zero para que elija el módulo base, y 1024 como máximo para el tamaño de la ruta (texto). Dim Datos As String() = {Procesos(i).ProcessName, String.Format("{0:D5}", Procesos(i).Id), DirectorioActual.ToString()} 'Creamos una matriz para insertar los datos que vamos a agregar luego a el ListView, como notas son: El nombre del proceso, el ID en un formato decimal de 5 dígitos y el directorio del proceso. Dim Item As ListViewItem = New ListViewItem(Datos) 'Creamos un Item para el ListView y le agregamos los datos obtenidos en la matriz. ListaProcesos.Items.Add(Item) 'Finalmente agregamos el Item creado al ListView. CloseHandle(hProceso) 'Y cerramos el handle del proceso actual Next 'Vamos al siguiente proceso, y así hasta finalizar. End Sub End Class Como notas, obtiene el nombre del proceso, el ID y la ruta; Los agrega a un ListView que me tocó aplicar a un formulario, quedando de ésta manera:  A clara vista, no puede obtener la ruta de los procesos nombrados arriba por motivos que desconozco, o tal vez ya dejé claros. El código está bien explicado en comentarios, espero te haya servido mi respuesta, cualquier duda posteala que con gusto se te ayudará.
|
|
|
|
« Última modificación: 28 Mayo 2011, 06:18 por Krähne »
|
En línea
|
Yo soy más sabio que este hombre; es posible que ninguno de los dos sepamos cosa que valga la pena, pero él cree que sabe algo, pese a no saberlo, mientras que yo, así como no sé nada, tampoco creo saberlo. Yo no tengo conciencia de saber nada.
|
|
|
Segurida
Desconectado
Mensajes: 61
|
Me sirve, muchas gracias, eres un crack  muchisimas gracias, saludos.
|
|
|
|
|
En línea
|
|
|
|
|
seba123neo
|
es que "el proceso inactivo del sistema" no es un proceso en si, es un simple hilo del kernel que calcula el uso de la cpu, para que quede claro aca te dejo una explicación de internet: (System Idle Process). En sistemas operativos basados en Windows NT, el Proceso inactivo de sistema, es un hilo de ejecución del kernel que mide cuanta capacidad de la CPU está sin uso en un determinado período de tiempo.
El Proceso inactivo del sistema siempre se ejecuta de fondo en Windows NT, Windows XP y Vista y se encuentra bajo ese nombre o bajo el nombre de SYSTEM en el Administrador de Tareas de Windows. Es una tarea que no puede ser terminada.
Funcionamiento del proceso inactivo del sistema
Por ejemplo, en general, si dice 95 en la columna CPU del Administrador de Tareas de Windows, significa que hay un 5% de la CPU que está en uso en ese instante y el restante sin uso. Esos ciclos de CPU sin uso son tomados por el Proceso inactivo del sistema.
Por lo tanto es normal, cuando en la computadora no estamos haciendo nada importante, que esta tarea tome del 95% al 99% del CPU.
El Proceso inactivo del sistema es utilizado en Windows para ahorar energía del CPU. El ahorro de energía depende de las características del hardware y del firmware del sistema. Por ejemplo, en los procesadores x86, este proceso ejecutará un búcle de comandos HLT (un comando de lenguaje asembler), que causa que la CPU apague muchos componentes internos y espere hasta que arribe un IRQ.
El Proceso inactivo del sistema mide la utilización del CPU en el sistema, lo cual puede ser visto a través del Administrador de Tareas de Windows en la solapa Procesos. De todas maneras es más fácil de entenderlo desde la solapa Rendimiento (Performance) en la misma herramienta, donde se muestra gráficamente el uso del CPU en todo momento, el uso histórico del CPU, entre otros datos.
Hay que destacar, de todas maneras, que esa información que se muestra no es calculada a través del Proceso inactivo del sistema, sino que se toma de contadores de rendimiento globales del sistema.
PD:yo no usaria apis en .NET, lo podes hacer con la clase Process o hasta con WMI muy facilmente sin recurrir a las apis para obtener el path.
|
|
|
|
« Última modificación: 27 Mayo 2011, 02:04 por seba123neo »
|
En línea
|
Mucha gente, especialmente la ignorante desea castigarte por decir la verdad, por ser correcto, por ser tú. Nunca te disculpes por ser correcto, o por estar años delante de tu tiempo. Si estas en lo cierto, y lo sabes, que hable tu razón. Incluso si eres una minoria de uno solo, la verdad sigue siendo la verdad. M. Gandhi
|
|
|
|
|