2009-08-16 13 views
5

Quiero escribir una pequeña aplicación que se encuentra en mi bandeja y que me permite seleccionar un ejecutable y evitar que se abra.Cómo detener una aplicación desde la apertura

La interfaz de usuario de la aplicación es fácil de usar con WinForms.

Lo que quiero saber es cómo detectar si se ejecutó un cierto exe y cómo evitar que se ejecute. Estoy bastante seguro de que tendré que profundizar en algunas cosas de Win32 pero no tengo experiencia en esa área, de ahí esta publicación.

Hay una aplicación existente similar a esta, pero no puedo recordar cómo se llama. Fue escrito en VB6 y también es de código abierto.

Cualquier ayuda es muy apreciada.

Gracias.

+2

¿Por qué desea detener la aplicación de la apertura? ¿Y no sería mejor simplemente restringir los permisos de los usuarios para que la aplicación no se pueda abrir? –

+0

Sí, analicé la configuración de las políticas de grupo, pero descubrí que todavía se pueden iniciar aplicaciones desde el CMD, así que también tengo que desactivarlo, lo que no quiero hacer. – Spidey

+1

No, puede configurar la ACL en los archivos para que no se puedan ejecutar. –

Respuesta

9

En lugar de tratar de matar el proceso cuando se ejecuta, ¿qué le parece dejar de funcionar en primer lugar?

Cambiar lo que ocurre cuando el shell intenta iniciar una aplicación es simple - añadir una nueva clave de registro a HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ archivos de imagen Opciones de ejecución

Para probar esta añadí una clave de registro llamada notepad.exe y dentro de este el valor de cadena Depurador con el valor calc.exe.Ahora, cada vez que intento ejecutar el Bloc de notas, se abre calc. La siguiente es la clave de registro exportada.

REGEDIT4 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe] 
"Debugger"="calc.exe" 

Al haber realizado este cambio aún no he logrado abrir el bloc de notas, no está mal para una solución sin código. Si necesita estar 100% seguro de que la aplicación nunca se ejecuta, siempre podría agregar una solución de "muerte" también como otros la detallaron.

+0

Este es un gran método Stephen. Puedo agregar esto a la aplicación, así que ahora, en lugar de sondear cada 10 segundos, solo cambia el registro una vez. Dulce. – Spidey

0

Recuerdo algunas funcionalidades de Win32 que ayudan a resolver tales situaciones. Si usa .Net de todos modos, probablemente sería un dolor implementarlo. Usaría algunos de los objetos de sincronización de proceso cruzado (no sé de qué tipo son los procesos cruzados) y establecería alguna señal. Al inicio, solo deja que tu aplicación verifique si la señal ya está configurada. Si es así, solo cierre la aplicación nuevamente.

0

Una de las ideas, pero no la mejor, es observar los procesos en ejecución y eliminar el proceso de ejecución necesario cuando se encuentra, esto se puede hacer con el código C# administrado normal.

+0

Sí, este es el método que estoy usando hasta ahora. Esto cerrará la aplicación después de que se haya abierto, por lo que me da un 90%. KillProcess private bool (string name) { foreach (clsProcess Proceso en Process.GetProcesses()) { si (clsProcess.ProcessName.ToLower(). StartsWith (name.ToLower())) { clsProcess. Matar(); return true; } } return false; } Me pregunto si vale la pena perder el tiempo investigando el gancho de Windows (del cual no sé nada) para la comodidad del bloqueo instantáneo de aplicaciones. – Spidey

+0

bien, ese código no formateó correctamente. – Spidey

1

Un gancho de Windows debería resolver su problema. Nunca he intentado esto ... pero tendrás que hacer un pinvoke a las API de Win32 para lograr esto. Gancho y ver de Google Win32.

0

en lugar de esperar a que se abra el ejecutable, para que pueda volver a cerrarlo, también puede paralizar el ejecutable.

simplemente cambie algunos de los bytes en el encabezado exe e impida que se inicie de esa manera.

Simplemente hágalo de manera que el efecto sea reversible.

0
private bool KillProcess(string name) 
    { 
     foreach (Process clsProcess in Process.GetProcesses()) 
     { 
      if (clsProcess.ProcessName.ToLower().StartsWith(name.ToLower())) 
      { 
       clsProcess.Kill(); 
       return true; 
      } 
     } 
     return false; 
    } 

Sí, este es el método que estoy utilizando hasta ahora. Esto cerrará la aplicación después de que se haya abierto, por lo que me da un 90%. Uso un temporizador que comprueba cada 10 segundos. Me pregunto si vale la pena invertir el tiempo investigando el gancho de Windows (del que no sé nada) para la comodidad del bloqueo instantáneo de aplicaciones. Aquellos de ustedes que conocen la API de Win32, ¿vale la pena el esfuerzo?

0
internal static class Program 
{ 
    private static Mutex m; 

    [STAThread] 
    private static void Main() 
    { 
     bool flag; 
     m = new Mutex(true, "ProgramName", out flag); 
     if (!flag) 
     { 
      MessageBox.Show("Another instance is already running."); 
     } 
     else 
     { 
      //start program 
     } 
    } 
} 

Estoy usando esto en un programa, y ​​funciona perfectamente, y debería ser capaz de cambiar esto para sus necesidades.

+0

Mi código hace efectivamente lo mismo. es decirEncuentre un proceso y trátelo. – Spidey

+0

sí, pero para aquellos que evalúan TODOS los procesos, con el mío, simplemente podría tener una lista de Mutexes y verificarla. Además, mi solución fue para otra cosa, evitando que su PROPIA aplicación abriera DOS VECES. Simplemente malentendí la pregunta en sí, al leerla demasiado rápido :) – Femaref

0

Puede escribir un gancho global.

Lo que se enganchará es menos importante que el hecho de que será global, y por lo tanto, implementado en una DLL separada. En esa biblioteca maneja adecuadamente la conexión a un nuevo módulo. Si detecta el proceso duplicado, mátalo.

5

Sólo una pequeña adición a lo demás excelente la respuesta de Stephen Nutt:

Si usted desea que el programa desaparezca para siempre, no sólo pop-up otra cosa en su lugar (calc.exe en el ejemplo de Esteban). Especificar la clave: "depurador" = "ntsd -cq"

Esto invocará NT es omnipresente de línea de comandos depurador ntsd para el programa con el argumento de línea de comandos -c decir "ejecutar el comando depurador especificado a continuación "; el comando del depurador es q (es decir, salga). Esto detendrá el depurador, que como efecto secundario matará al depurador, el programa que desea evitar que se ejecute también.

Limpio, agradable y fácil. El único efecto secundario que observé es que a veces una ventana de comando transitoria aparece brevemente con un indicador de depurador solo para desaparecer de nuevo en un momento.

+0

Gracias por eso, me preguntaba qué poner en lugar del calc.exe. – Spidey

1

Bien, acabo de encontrar la aplicación que estaba buscando originalmente.

Se llama Temptation Blocker y es available here

Se encontrará todos los archivos ejecutables y permitirá seleccionar qué bloque para sin embargo muchas horas.

No es perfecto, me gustaría que comenzaría automático así que no tengo que iniciar manualmente, pero aparte de eso es bastante bueno

Cuestiones relacionadas