usar usa switch que programacion for else condiciones como codigo clausula c# windows-vista process kill

usa - matar mediante programación un proceso en vista/windows 7 en C#



programacion c if else (2)

Quiero matar un proceso programáticamente en vista / windows 7 (no estoy seguro si hay problemas significativos en la implementación del UAC entre los dos para hacer la diferencia).

En este momento, mi código se ve así:

if(killProcess){ System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("MyProcessName"); // Before starting the new process make sure no other MyProcessName is running. foreach (System.Diagnostics.Process p in process) { p.Kill(); } myProcess = System.Diagnostics.Process.Start(psi); }

Tengo que hacer esto porque necesito asegurarme de que si el usuario bloquea el programa o sale abruptamente, este proceso secundario se reinicia cuando se reinicia la aplicación, o si el usuario desea cambiar los parámetros para este proceso secundario.

El código funciona bien en XP, pero falla en Windows 7 (y supongo que en Vista) con un mensaje de "acceso denegado". Por lo que el Todopoderoso Google me ha dicho, necesito ejecutar mi programa de asesinatos como administrador para evitar este problema, pero eso es solo una salsa débil. La otra posible respuesta es usar LinkDemand, pero no entiendo la página msdn para LinkDemand en lo que respecta a los procesos.

Podría mover el código a un hilo, pero eso tiene una serie de otras dificultades inherentes que realmente no quiero descubrir.


Agregaré el código para la sugerencia de Simon Buchan. Tiene sentido y debería funcionar también, suponiendo que su forma de Windows es lo que lanzó el proceso en primer lugar.

Aquí es donde creas el proceso. Observe la variable myProc. Ese es tu punto de vista:

System.Diagnostics.Process myProc = new System.Diagnostics.Process(); myProc.EnableRaisingEvents=false; myProc.StartInfo.FileName="PATH_TO_EXE"; myProc.Start();

Más tarde, simplemente mátalo con:

myProc.Kill();


Tiene razón en que es porque no tiene privilegios administrativos. Puede resolver esto instalando un servicio bajo el usuario del sistema local y ejecutando un comando personalizado contra él según sea necesario.

En su aplicación de formulario de Windows:

private enum SimpleServiceCustomCommands { KillProcess = 128 }; ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, Environment.MachineName, "SERVICE_NAME"); scp.Assert(); System.ServiceProcess.ServiceController serviceCon = new System.ServiceProcess.ServiceController("SERVICE_NAME", Environment.MachineName); serviceCon.ExecuteCommand((int)SimpleServiceCustomCommands.KillProcess); myProcess = System.Diagnostics.Process.Start(psi);

En su servicio:

private enum SimpleServiceCustomCommands { KillProcess = 128 }; protected override void OnCustomCommand(int command) { switch (command) { case (int)SimpleServiceCustomCommands.KillProcess: if(killProcess) { System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("MyProcessName"); // Before starting the new process make sure no other MyProcessName is running. foreach (System.Diagnostics.Process p in process) { p.Kill(); } } break; default: break; } }