Inicie el programa al iniciar la computadora cuando nadie haya iniciado sesión y muestre la ventana cuando alguien inicie sesión (SO: Windows)

19

Tengo un programa que se inicia al iniciar el sistema usando el Programador de tareas en Windows Server 2012. El programa debe iniciarse incluso si la computadora se reinicia automáticamente.

Administrador es la cuenta utilizada para iniciar el programa, la opción "Ejecutar si el usuario ha iniciado sesión o no" está marcada para la tarea.

El problema con esto es que cuando alguien finalmente inicia sesión como Administrador usando Remote Desktop Connection, la interfaz (ventana del programa) está oculta.

Según tengo entendido, no hay forma de resolver esto usando el Programador de tareas.

¿Como puedo resolver esto?

Debería ser un problema bastante común, pero no puedo encontrar nada buscando en la red. Estoy bastante sorprendido de que Microsoft permita tal limitación en su programador. ¿Puedo hacer un VBScript o algo que se ejecute en el inicio y ejecute el programa que luego será visible cuando el usuario inicie sesión?

¿Otras ideas?

(Por cierto, no quiero tener que hacer un programa separado de solo GUI que se conecte al programa original. También preferiría que no tuviera que terminar el programa que ya se está ejecutando al iniciar sesión por el usuario y luego iniciarlo de nuevo.)

Marcus
fuente
2
Firedaemon, instale la aplicación como un servicio, cuando RDP se cambie a "Sesión 0" usando Firedaemon. Ver la aplicación
TheCleaner
Esto podría hacerse técnicamente si desarrolla su propio servicio.
Ryan Ries
1
Acabo de responder mi propia pregunta. Sin embargo, no puedo aceptar mi propia respuesta durante dos días, porque el sistema aquí en serverfault.com es extremadamente malo (la mayoría de las personas ahora abandonarían esta página sin esperar dos días y dejarían la pregunta marcada para siempre como no resuelta).
Marcus
2
@Marcus: Los límites sobre quién puede hacer qué y cuándo están destinados a detener ciertos abusos. Desafortunadamente, a veces causan inconvenientes por intentos genuinos de hacer las cosas bien, pero a veces es necesario hacer tales compromisos. Si tiene una sugerencia que podría mejorar la situación (al menos proteger el sitio al mismo tiempo pero incomodar menos a los usuarios genuinos), sería una mejor idea plantear la idea a través de un sitio "meta" relevante ( meta.serverfault.com , meta. stackoverflow.com ) en lugar de quejarse en un comentario que es muy poco probable que vean los corredores del sitio.
David Spillett
Como puede ver en la votación, la respuesta que desea aceptar no es la que la gente aprueba porque, para empezar, la forma en que intenta hacerlo es incorrecta.
JamesRyan

Respuestas:

28

Descubrí cómo hacerlo yo mismo. Es una solución alternativa, pero eso es lo que esperaba obtener.

¡Detener! No te avergüences todavía. Sigue leyendo ...

  • Ejecútelo, configúrelo para que el Administrador inicie sesión automáticamente.

  • Crear una tarea en el Programador de tareas. Configúrelo para que se ejecute solo cuando el usuario (Administrador) haya iniciado sesión. El activador está "al iniciar sesión" y especifique que es solo cuando el Administrador inicia sesión.

  • Crea una segunda tarea. Ejecutar solo cuando el usuario haya iniciado sesión, disparar al iniciar sesión como administrador. La acción debe ser "iniciar un programa" y el programa es "C: \ Windows \ System32 \ rundll32.exe" con el campo de argumento establecido en "user32.dll, LockWorkStation".

Lo que sucede ahora si reinicia la computadora es que el Administrador inicia sesión automáticamente, el programa que desea iniciar se inicia y la estación de trabajo se bloquea. Si inicio sesión a través de Remote Desktop Connection, puedo ver la ventana del programa y usar la GUI. Puedo bloquear / desbloquear la computadora sin problemas y desconectar / volver a conectar como me plazca. No hay problema si voy al servidor e inicio sesión en la estación de trabajo real. Dado que el administrador ya ha iniciado sesión, la tarea no se ejecutará nuevamente (no crea un bucle infinito de inicio de sesión que no se puede romper).

Simple como eso. De acuerdo, hay un segundo período de tiempo antes de que la computadora se bloquee después del inicio de sesión automático y supongo que un hacker profesional con acceso físico a la computadora podría hacer algo astuto durante este período de tiempo, pero en mi caso puedo pasar por alto ese riesgo de seguridad. Mientras no permita que ningún hacker profesional entre a mi casa y les muestre la computadora, el sistema debería ser relativamente seguro. Por encima de todo, no hay tanto valor en la computadora que necesita protección de súper bóveda, así que estoy bastante contento con esta solución.

Marcus
fuente
77
Sin faltar al respeto (o voto negativo), Marcus. Pero si este es realmente el tipo de respuesta que estaba buscando, esta pregunta habría sido más apropiada para SuperUser .
Ryan Bolger
2
No fue fácil decidir qué intercambio de pila publicar esto.
Marcus
Hola Marcus, seguí tu respuesta, pero tengo problemas para iniciar dos programas con GUI en lugar de solo uno. He publicado una pregunta en SuperUser. Si se pudiera responder a ella no será una gran ayuda - superuser.com/questions/902386/...
user2162550
1
En realidad, ahora también lo rechazo porque NO es una respuesta a la pregunta. La pregunta define explícitamente el inicio de sesión del mediodía, y su "solución" aquí hace un inicio de sesión automático (por lo que alguien está conectado). Tal vez no sea una formulación inteligente en la pregunta, pero la pregunta es como es.
TomTom
1
@TomTom Como una opción presentada a un usuario final "Ejecutar si el usuario ha iniciado sesión o no" ciertamente podría significar "No tendrá que estar aquí para cuidar a los niños para asegurarse de que comience".
Aryeh Leib Taurog
16

Tengo un programa que se inicia al iniciar el sistema usando el Programador de tareas en Windows Server 2012. El programa debe iniciarse incluso si la computadora se reinicia automáticamente.

Entonces, ¿por qué no lo convierte en un servicio del sistema, como lo definen las especificaciones de Windows?

¿Como puedo resolver esto?

No puedes. No se supone que los programas en segundo plano interactúen con la interfaz de usuario. O bien: la interfaz de usuario debe ejecutar su propio programa que luego se conecta al servicio. La IU que se ejecuta en el espacio de usuario del usuario conectado realiza la presentación, el servicio de Windows realiza el procesamiento. Así es como el modelo está diseñado para unos 15 años más o menos.

Estoy bastante sorprendido de que Microsoft permita tal limitación en su programador.

Me sorprende más que nunca te hayas molestado en preguntar por qué.

Hay múltiples problemas:

  • Cuando varias personas inician sesión, ¿quién obtiene la interfaz de usuario?
  • Cuando el usuario cierra sesión, ¿matas el programa? AY.
  • Seguridad. El programa en segundo plano puede ejecutarse con derechos limitados: exponer la IU al usuario significa que el usuario puede ejecutar código allí. El modelo de mensajería de Windows está, ah, lleno de problemas.

No quiero tener que hacer un programa GUI separado que se conecte al programa original por cierto.

Ni a mí ni a Microsoft nos importa en este momento lo que te gusta hacer. Existe un modelo establecido y admitido para vincular el procesamiento en segundo plano a una IU de usuario conectado; utilícelo o no. Pero cuando no, no se queje de los problemas de seguridad que haya presentado.

TomTom
fuente
3
Amén. Deseo que más proveedores de aplicaciones hayan captado este concepto.
Ryan Bolger
15
Wow, no eres presumido en tu actitud. Bueno, supongo que no tengo suerte. A menos que estés mal informado y alguien tenga alguna forma de resolver esto, todos no pueden saberlo todo, por lo que podrías estar equivocado con la parte absoluta de "no puedes" de tu publicación. Me gustaría dejar la pregunta abierta para obtener más respuestas durante un tiempo más, en caso de que alguien tenga una solución poco común para compartir. De lo contrario, aceptaré tu respuesta.
Marcus
En realidad, cada vez es más difícil dar una interfaz de usuario a un servicio en las versiones actuales de Windows, pero no es imposible.
MDMoore313
No se desea activamente debido principalmente a problemas de seguridad. El principal problema aquí es que, y realmente necesita obtenerlo, si muestra una ventana en mi interfaz de usuario, puedo ejecutar código en su proceso. Entonces puedo enviarte mensajes de Windows y eso tiene MUCHAS cosas que pueden explotarse. Normalmente no es un problema, porque si es una aplicación de usuario, solo puedo hacer cosas que yo como usuario podría ... pero si el servicio tiene mayores privilegios, aquí va la pesadilla de seguridad. Es por eso que esto se cerró hace muchos años y todos los que aprendieron programación y leyeron la documentación deberían haberlo leído
TomTom
1
Si realmente desea ir allí, puede probar los pasos en coretechnologies.com/WindowsServices/FAQ.html#GUIServices , no estoy seguro de que sigan funcionando en las ventanas actuales, pero hay formas de hacer que la interfaz de usuario sea accesible, y abrir todos los problemas de seguridad .
TomTom
0

Se trata de Sessionque su programa se ejecute. Si nadie ha iniciado sesión, no hay una sesión interactiva para mostrar, creo que se ejecuta bajo Session 0, que tiene una interfaz de usuario extraña que no se muestra como las demás.

Ahora, si su programa detecta cuándo se explorer.exeinicia (o alguna otra forma de detectar el inicio de sesión del usuario) y se reorientó mágicamente o generó algún proceso secundario en ese nuevo sessionid, cualquiera que inicie sesión verá felizmente lo que está haciendo.

MDMoore313
fuente