¿Cómo puedo enumerar todos los procesos que se ejecutan en Windows?

Me gustaría encontrar una forma de recorrer todos los procesos activos y hacer comprobaciones de diagnóstico en ellos (uso de mem, tiempo de CPU, etc.), de forma similar al administrador de tareas.

El problema se divide en dos partes:

  1. Encontrar todos los procesos
  2. Encontrar atributos de diagnóstico sobre ellos

No estoy seguro incluso en qué espacio de nombres ir a buscarlo. Cualquier ayuda / sugerencias / enlaces es agradecida.

Encontrar todos los procesos

Puedes hacerlo a través de la clase Process

using System.Diagnostics; ... var allProcesses = Process.GetProcesses(); 

Ejecución de diagnósticos

¿Puede darnos más información aquí? No está claro lo que quieres hacer.

La clase Process proporciona un poco de información que podría ayudarte. Es posible consultar esta clase para

  • Todos los temas
  • Manija de ventana principal
  • Todos los módulos cargados
  • Diversa información de diagnóstico sobre la memoria (buscada, virtual, conjunto de trabajo, etc.)
  • Información básica del proceso (id, nombre, ubicación del disco)

EDITAR

OP mencionó que quieren obtener información de memoria y CPU. Estas propiedades están disponibles en la clase Process (devuelta por GetProcesses ()). A continuación se muestra la página de MSDN que enumera todas las propiedades compatibles. Hay varios módulos de memoria y CPU disponibles que se adaptarán a sus necesidades.

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

Código:

Agregue esta línea a su lista de uso:

 using System.Diagnostics; 

Ahora puede obtener una lista de los procesos con el método Process.GetProcesses (), como se ve en este ejemplo:

 Process[] processlist = Process.GetProcesses(); foreach (Process theprocess in processlist) { Console.WriteLine("Process: {0} ID: {1}", theprocess.ProcessName, theprocess.Id); } 

Encontrar todos los procesos es bastante fácil en realidad:

 using System.Diagnostics; Process[] processes = Process.GetProcesses(); foreach (Process process in processes) { //Get whatever attribute for process } 

JaredPar ya señaló la clase Process , por lo que solo agregaré que debe tener en cuenta que la clase toma una instantánea de la información del proceso cuando se crea la instancia. No es una vista en vivo. Para actualizarlo, debe llamar a Refresh() en la instancia.

También tenga en cuenta que el proceso puede cerrarse mientras lo está inspeccionando, por lo que debe estar preparado para detectar excepciones y manejarlas en consecuencia.

Y finalmente, si llama a Process.GetProcesses() , también obtendrá los pseudoprocesos “inactivo” y “sistema”. IIRC tienen identificadores de procesos específicos para que pueda filtrarlos fácilmente.

Qué sistema operativo estás usando? ¿De su etiqueta C # tomo que son ventanas?

Si es así, consulte WMI, especialmente la clase Win32_Process. Aquí está la referencia de MSDN: http://msdn.microsoft.com/en-us/library/aa394372(VS.85).aspx

Además de un par de escenarios de uso aquí (como obtener una lista de procesos): http://msdn.microsoft.com/en-us/library/aa394599(VS.85).aspx

Bueno, puedes hacer esto en Powershell

1. Encontrar todos los procesos

 get-Process 

2. Encontrar atributos de diagnóstico sobre ellos

 get-Process | where-object { $_.Handles -gt 200 } 

El código anterior devolverá todos los procesos con más de 200 identificadores, puede especificar sus atributos de diagnóstico de esta manera fácilmente.

Para obtener más información sobre cómo manejar procesos usando powershell, vea esto

 using System.Diagnostics; class Program { static void Main() { Process[] processlist = Process.GetProcesses();` } } 

aquí el proceso arrray contiene todo el número de procesos presentes en él.