Listar procesos y rutas en ListBox

Iniciado por dust564, 6 Junio 2015, 23:54 PM

0 Miembros y 1 Visitante están viendo este tema.

dust564

Se me ha ocurrido una idea, pero buscando en internet solo he encontrado información aplicable a versiones bastante antiguas de visual basic o código inservible.

Idea:
Al activarse un evento (pulsar un botón o por el tiempo de un timer, por ejemplo) el programa carga en un ListBox la ruta de todos los archivos en ejecución. Luego genera un hash de cada archivo y busca si el hash existe en otro ListBox. Si existe, cierra el proceso.

Es decir, que compruebe si un ejecutable está en una "lista negra"

Lo que no se hacer:
-> Listar los procesos y sus rutas en un ListBox

--
Salu2

Eleкtro

#1
¿Estás compilando la app bajo x86, x64, o neutral?.

¿Alguna limitación en la versión objetivo de .Net framework? (-LINQ)

¿C#, Vb.Net, o cualquiera de los dos?, no somos adivinos.

Puedes utilizar la Class "Process":

Código (vbnet) [Seleccionar]
Dim blacklisted As IEnumerable(Of String) =
   {
       "audiodg",
       "csrss",
       "Idle",
       "services",
       "smss",
       "System"
   }

Dim processes As IEnumerable(Of Process) =
   System.Diagnostics.Process.GetProcesses

Dim pNames As IEnumerable(Of String) =
   From p As Process In processes
   Where Not blacklisted.Contains(p.ProcessName)
   Order By p.ProcessName Ascending
   Select String.Format("{0}.exe", p.ProcessName).ToLower
   Distinct

Dim pPaths As IEnumerable(Of String) =
   From p As Process In processes
   Where Not blacklisted.Contains(p.ProcessName)
   Order By p.MainModule.FileName Ascending
   Select p.MainModule.FileName.ToLower
   Distinct

ListBox1.Items.AddRange(pPaths.ToArray)


Y, si estás desarrollando la app para arquitectura x86, para comunicarte con los procesos x64 puedes realizar una consulta a WMI (Windows Management Instrumentation):

Win32_Process class (Windows) - MSDN

Código (vbnet) [Seleccionar]
Public Shared Function GetProcesses() As ManagementObjectCollection

   Using searcher As New ManagementObjectSearcher(queryString:="SELECT * FROM Win32_Process")

       Return searcher.Get

   End Using

End Function

Dim processes As ManagementObjectCollection =
   GetProcesses()

Dim pNames As IEnumerable(Of String) =
   From mo As ManagementObject In processes.Cast(Of ManagementObject)()
   Order By DirectCast(mo.Properties("Name").Value, String) Ascending
   Select DirectCast(mo.Properties("Name").Value, String).ToLower
   Distinct

Dim pPaths As IEnumerable(Of String) =
   From mo As ManagementObject In processes.Cast(Of ManagementObject)()
   Where Not mo.Properties("ExecutablePath").Value Is Nothing
   Order By DirectCast(mo.Properties("ExecutablePath").Value, String).ToLower Ascending
   Select DirectCast(mo.Properties("ExecutablePath").Value, String).ToLower
   Distinct

ListBox1.Items.AddRange(pPaths.ToArray)


Nota: Recuerda que la Class "ManagementObjectCollection" es Disposable.

También puedes utilizar las funciones de la API de Windows:
Process Walking - MSDN
PSAPI Functions - MSDN

(de esto no pongo un ejemplo ya que no tengo ...pero por Google debe haber; y elaborarlo me costaría el esfuerzo de escribir aproximadamente +1.000 lineas de P/Invoking)

Saludos!








nolasco281

#2
Hola como estan se que no es mi hilo pero queria hacer unas pregunta en estas partes.

Este trozo de codigo  son los procesos que no deberian ejecutarse y en caso que desee mostrar todos los procesos deberia de agregarlos al array?
Código (vbnet) [Seleccionar]

Dim blacklisted As IEnumerable(Of String) =
   {
       "audiodg",
       "csrss",
       "Idle",
       "services",
       "smss",
       "System"
   }


y esta parte por que solo muestra la ruta del  proceso pero no el nombre o la ruta ya contiene el nombre del proceso? por que declara pNames.

Código (vbnet) [Seleccionar]
ListBox1.Items.AddRange(pPaths.ToArray)

Ya que me dice lo siquiente



Saludos.

Pd: Disculpas por comentar pero tengo esas peque~nas curiosidades




Hola gracias por responder las dudas.

Leere un poco mas las clase process para poder manejar, efectivamente cambien los procesos de la lista lo probe tanto con listview como con listbox cambie algunas cositas, y ya muestra su ruta.

Muchas gracias : )

Saludos.
Lo que se puede imaginar... se puede programar.

Eleкtro

#3
Cita de: nolasco281 en  7 Junio 2015, 07:58 AMEste trozo de codigo  son los procesos que no deberian ejecutarse y en caso que desee mostrar todos los procesos deberia de agregarlos al array?
Código (vbnet) [Seleccionar]

Dim blacklisted As IEnumerable(Of String) =
   {
       "audiodg",
       "csrss",
       "Idle",
       "services",
       "smss",
       "System"
   }

Son los procesos de la lista negra, procesos excluidos de la query de LINQ.

Idle y System son pseudo-procesos (y por lo tanto, daría error la query al intentar obtener una ruta que no existe), y los otros son procesos protegidos.

De todas formas ten en cuenta que lo que escribí es un ejemplo básico que se puede extender para adaptarlo a "X" necesidades, si quieres hacer una buena réplica entonces deberías mostrar lo mismo que muestra el administrador de tareas de Windows.




Cita de: nolasco281 en  7 Junio 2015, 07:58 AMy esta parte por que solo muestra la ruta del  proceso pero no el nombre o la ruta ya contiene el nombre del proceso? por que declara pNames.

Obviamente la ruta del archivo contiene el nombre del archivo.

¿Por qué declaré pNames y pPaths por separado?, para mostrar dos ejemplos distintos, uno para obtener solo el nombre, y el otro para obtener la ruta completa.




Cita de: nolasco281 en  7 Junio 2015, 07:58 AM
Código (vbnet) [Seleccionar]
ListBox1.Items.AddRange(pPaths.ToArray)

me dice lo siquiente


Fíjate bien, estás utilizando un ListView, no un ListBox.

Debes pasarle cómo argumento un array de ListViewItem, o un ListViewItemcollection:

Código (vbnet) [Seleccionar]
With ListView1

   .View = View.Details
   .Columns.Add("ExecutablePath")
   .Items.AddRange((From path As String In pPaths Select New ListViewItem({path})).ToArray)

End With


Saludos!