waitforexit visual start processes proceso password net ejemplos asp c# .net-4.0 process pid

visual - processes c#



obtener un PID del proceso iniciado por Process.start() (4)

A continuación también se devuelve el PID de un proceso.

Process[] p = Process.GetProcessesByName("YourProcessName");

Ahora puede obtener la identificación del proceso usando p[i].Id;

Estoy iniciando un ejecutable usando este código:

Process proc = new Process(); proc.StartInfo.FileName = executablePath; proc.Start(); proc.WaitForInputIdle();

después de esta llamada proc.Id me da un número entero, que no es un ID de proceso real. En el administrador de tareas hay otra identificación para este proceso y también estoy usando MS UI Automation para acceder a esta aplicación, que también devuelve la misma identificación que en el administrador de tareas. Entonces, mi pregunta es ¿cómo puedo obtener la ID del proceso real del proceso iniciado?

ACTUALIZAR

Descubrí que en Windows 7 funciona bien y me devuelve la ID correcta, pero no en Windows XP. cual puede ser la razon?

GUIÓN

El escenario de la aplicación es el siguiente. Tengo un servidor HTTP incrustado en ejecución, que no está implementado por mí, ( here está la fuente). El cliente se conecta al servidor web y envía una solicitud para ejecutar un programa. En el controlador de solicitudes de mi servidor, solo estoy usando Process.start() para iniciar la aplicación solicitada. Como servidor web, el programa crea subprocesos para cada sesión de cliente conectada (supongo que sí, ya que no lo escribí). ¿Puede esto ayudar de alguna manera a identificar el problema ya que existe solo en Windows XP X86 Service Pack 3?



Solo estoy tratando de adivinar aquí, ya que es difícil entender lo que realmente sucede sin ver el código real. De todos modos, mencionaste Trhreads en uno de tus comentarios. ¿Es posible que tenga una sola variable proc de tipo Proceso que se inicialice en su hilo principal y luego el proceso se inicie en un Hilo diferente?

Si este es el caso, tal vez el proceso se inicie más de una vez y obtenga el PID de uno de ellos. La única forma en que pude reproducir su caso es esta:

private Process proc; private List<int> pids = new List<int>(); public void StartProc() { // this tries to simulate what you''re doing. Starts the process, then // wait to be sure that the second process starts, then kill proc proc.Start(); pids.Add(proc.Id); Thread.Sleep(300); try { proc.Kill(); } catch {} } // the method returns the PID of the process public int Test() { proc = new Process(); proc.StartInfo.FileName = @"notepad.exe"; for (int i = 0; i < 2; i++) { Thread t = new Thread(StartProc); t.Start(); Thread.Sleep(200); } Thread.Sleep(500); return proc.Id; }

Cuando ejecute Test, debería ver un único Bloc de notas activo, y el PID devuelto por el método es diferente al mostrado por el Administrador de tareas. Pero si echa un vistazo a la lista de pids, debería ver que el PID del Administrador de tareas es el primer elemento de la lista, y el que devuelve el método es el segundo.

¿Es posible que hayas hecho algo similar?


Un ejemplo de cómo lo hice:

bool started = false; var p = new Process(); p.StartInfo.FileName = "notepad.exe"; started = p.Start(); try { var procId = p.Id; Console.WriteLine("ID: " + procId); } catch(InvalidOperationException) { started = false; } catch(Exception ex) { started = false; }

De lo contrario, intente usar asas como esta:
Utilizando manejadores
Obteniendo manejador

hWnd = (int) process.MainWindowHandle; int processId; GetWindowThreadProcessId(hWnd, out processId); [DllImport("user32")] static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);

Nota al margen:
¿Qué sucede si obtienes una serie de procesos y los repites en iteración y comparas los PID?

Process[] p = Process.GetProcessesByName( "testprogram" ); foreach(var proc in p) Console.WriteLine("Found: "+proc.Id == myExpectedProcId);