2010-11-24 13 views
5

Tenemos un producto que es una aplicación de consola C#. ¿Es posible restringir que se ejecute solo desde la línea de comando? En otras palabras, los usuarios no podrían llamarlo desde un script u otra aplicación.C#: Restringir cómo se puede llamar a una aplicación de consola

Si lo es, un código de ejemplo sería muy apreciado. Gracias.

+0

¿Realmente quiere decir la línea de comandos de DOS (command.com), o la línea de comandos NT (cmd.exe)? ¿O está bien cualquier aplicación de consola? – CodesInChaos

+0

¿Y qué estás tratando de lograr? ¿Por qué quiere evitar que otros programas inicien su programa? – CodesInChaos

+0

@CodeInChaos: buenos puntos. Cualquier aplicación de consola está bien. Me gustaría evitar que la aplicación se use como parte de otro producto o servicio. – FunLovinCoder

Respuesta

3

Puede comprobar el proceso que creó la aplicación mediante el código dado aquí: http://msdn.microsoft.com/en-us/netframework/aa569609.aspx#Question3. Para iniciarse en la línea de comandos de DOS, el proceso principal debe ser cmd.exe. Sin embargo, tenga en cuenta que, como señala Colin, esto se puede evitar fácilmente mediante un script por lotes. También puede deshabilitarlo asegurándose de que los argumentos del símbolo del sistema para cmd.exe son nulos. Para esto, necesitará usar WMI:
http://skysanders.net/subtext/archive/2010/04/11/using-wmi-to-fetch-the-command-line-that-started-all.aspx
También debe verificar que la imagen cmd.exe sea de la carpeta system32.

+0

¿Cuál es el proceso principal si la aplicación se inició desde un script por lotes? –

+0

@Colin: servidor de secuencias de comandos, supongo. ¿No es así? p.ej. WSH – abatishchev

+0

No, acabo de probarlo, es cmd.exe –

3

No creo que sea posible notar la diferencia.

Ciertamente, el proceso principal no es un indicador útil. Esto es lo que se obtiene en el proceso padre:

1. type app name into Command Prompt:  cmd.exe 
2. call app from batch script:   cmd.exe 
3. Double click on app or shortcut:  explorer.exe 
4. type app name into Run dialog box:  explorer.exe 

Si tiene la intención de 1. a ser una forma válida para iniciar su programa, entonces no creo que se pueda detener 2. que significa que su aplicación puede ser llamada desde cualquier script o cualquier programa (ya que es simple para otro programa para crear un archivo por lotes de 1 línea y ejecutarlo)

(por cierto, ¿alguien sabe una manera de conseguir una mesa en StackOverflow?)

+0

¿Hay algún error? de todos modos de encontrar al abuelo? Entonces, ¿podría comprobar si cmd.exe fue generado por algo que espera en lugar de un script o proceso desconocido? – FunLovinCoder

+0

Hay más formas de comenzar un proceso, el Administrador de tareas -> Archivo -> Ejecutar me viene a la mente, estoy seguro de que hay más que no vienen a la mente. – Tergiver

+0

Oh sí, estos fueron solo como ejemplos. Programador de tareas sería otro. –

1

@ Swisston si inicia su aplicación de consola desde su otra aplicación propia, entonces quiero recomendarle "objetos kernel con nombre". Por ejemplo mutex. Puede crear un mutex con nombre en su aplicación principal. Luego, en el hilo principal de la aplicación de la consola de tu hijo, intenta abrir este mutex. Si no estuviese abierto mutex (no encontrado): aplicación de consola no tiene permisos para continuar y deben estar cerradas;) espera, voy a hacer algo de código para usted;)

Editar: lo que es muy fácil táctica. En aplicación de los padres crear un mutex llamado:

Mutex mutex = new Mutex(true, "MyPermissions"); 

Luego, en su cheque de aplicación de consola niño si existe el mutex:

static bool CheckPermissions() 
    { 
     try 
     { 
      Mutex mutex = Mutex.OpenExisting("MyPermissions"); 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 

     return true; 
    } 

Si su aplicación de consola se llevó a cabo sin su método CheckPermissions solicitud principal devolverá falso y la consola debe estar cerrada;)

+1

Esto no ayuda, ya que la aplicación primaria se puede invocar desde cualquier lugar. Acabas de mover el problema un nivel sin resolver nada. – Tergiver

0

No estoy de acuerdo con lo que está tratando de hacer, pero esta es una idea que podría funcionar: requerir algún tipo de entrada del usuario al comienzo del programa, tal vez algún tipo de CAPTCHA (difícil de hacer en la línea de comando, pero teóricamente posible. Piensa en el arte ASCII).

Cuestiones relacionadas