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
¿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":
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 (https://msdn.microsoft.com/en-us/library/aa394372%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396)
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 (https://msdn.microsoft.com/en-us/library/ms684887%28v=VS.85%29.aspx)
➢ PSAPI Functions - MSDN (https://msdn.microsoft.com/en-us/library/ms684894%28v=vs.85%29.aspx)
(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!
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?
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.
ListBox1.Items.AddRange(pPaths.ToArray)
Ya que me dice lo siquiente
(http://1.bp.blogspot.com/-xKmAeekfU70/VXPdKHjzqnI/AAAAAAAAA9M/jRm0RtjKWLk/s1600/errorDuda.png)
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.
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?
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 AMListBox1.Items.AddRange(pPaths.ToArray)
me dice lo siquiente
(http://1.bp.blogspot.com/-xKmAeekfU70/VXPdKHjzqnI/AAAAAAAAA9M/jRm0RtjKWLk/s1600/errorDuda.png)
Fíjate bien, estás utilizando un ListView, no un ListBox.
Debes pasarle cómo argumento un array de
ListViewItem, o un
ListViewItemcollection:
With ListView1
.View = View.Details
.Columns.Add("ExecutablePath")
.Items.AddRange((From path As String In pPaths Select New ListViewItem({path})).ToArray)
End With
Saludos!