2011-08-04 7 views
6

Estoy ejecutando un pequeño ejecutable creado por un tercero que necesita ejecutarse a intervalos regulares en un servidor de Windows 2008. Este ejecutable efectivamente informa ETL de un sistema a otro y necesita ejecutarse cada hora más o menos durante todo el día. Como parte de su procesamiento, el ejecutable lanza una pequeña interfaz de usuario tipo Windows Forms.Una solución para el hecho de que una tarea programada en Windows requiere que un usuario inicie sesión en

He configurado una tarea programada para llamar al archivo y esto SÓLO funciona si el usuario bajo el cual la tarea está configurada para ejecutarse se registra en la máquina (ya sea localmente o a través de Escritorio remoto). Si configuro la tarea para que se ejecute como otro usuario, o configuro la tarea para que se ejecute cuando el usuario no está conectado, en la tarea programada se ejecuta y se producen errores. He intentado ejecutar como usuarios diferentes, incluidos el usuario administrador y el usuario del sistema. ¿Hay alguna solución posible (sin cambiar el código de terceros al que no tengo acceso) que permitiría que este código se ejecute sin un usuario específico conectado.

+0

Es extraño que una cuenta de sistema ni siquiera pueda ejecutar los trabajos. Estoy usando una cuenta del sistema para ejecutar múltiples tareas programadas en varios intervalos sin ningún problema. También debe haber una opción para "Ejecutar solo si está conectado" que puede activar o desactivar. – RobB

Respuesta

5

La aplicación GUI necesita un escritorio y solo obtiene uno de aquellos para un usuario conectado.

+0

Entonces, ¿cómo es que algunas aplicaciones de GUI como el OSK pueden ejecutarse desde la pantalla de inicio de sesión? – Synetech

+0

No sé mucho sobre la pantalla de inicio de sesión. Estaba contrastando las tareas programadas ejecutadas como usuario conectado en un escritorio interactivo con las que se ejecutan sin un escritorio. –

1

Parece que de la investigación que he realizado (y la respuesta de David Heffernan), sin afectar el código fuente, esto no es posible.

Hay algunos pensamientos útiles en How can I run a Windows GUI application on as a service? que se refieren a esto, pero ninguno proporciona una solución viable a este problema.

2

Creo que he encontrado una solución para esta situación. Necesita tener dos cuentas de usuario en el servidor (Usuario1 y Usuario2). RMD en el servidor bajo User1. Dentro de este RMD, cree su tarea programada y configúrela para que se ejecute en la cuenta de Usuario2. Luego, desde dentro de este RMD, necesita RMD en el servidor usando credenciales de User2 (algo así como el sueño de Inception dentro de un sueño). Es importante no minimizar esta nueva ventana de RMD; puedes hacerlo pequeño, pero debe estar abierto. Luego puede cerrar la sesión RMD original y la tarea se ejecutará en la cuenta de Usuario2, porque el Usuario2 tiene un escritorio abierto desde su 2ª sesión de RMD.

Prototipo: no destrabe los manejadores de la ventana de RMD en la parte superior de la ventana de RMD; puede ser complicado cerrar la RMD correcta en ese momento. Si lo hace, deberá usar la opción Inicio> Cerrar sesión para salir de sus RMD.

+1

¡Creativo! Pero qué dolor! – Chloe

4

En este artículo se muestra cómo crear una tarea que no requiere ninguna entrada: https://www.scriptjunkie.us/2013/01/running-code-from-a-non-elevated-account-at-any-time/

El procedimiento descrito es el siguiente:

primer lugar, crear una tarea programada para ejecutar su comando con las opciones predeterminadas como el usuario actual (esto por defecto crear una tarea programada que sólo funciona cuando está conectado):

schtasks /create /tn mytask /SC HOURLY /TR "calc"

A continuación, exportar la tarea como XML:

schtasks /query /XML /tn mytask > temp.xml

y eliminar la tarea:

schtasks /delete /tn mytask /f

continuación, abra el archivo XML, y reemplazar la línea <LogonType>InteractiveToken</LogonType> con <LogonType>S4U</LogonType>

Esto se puede hacer con los siguientes comandos asumiendo powershell está en el sistema: powershell -Command "Get-Content '.\temp.xml' | foreach {$_ -replace 'InteractiveToken', 'S4U' }" > new.xml move /y new.xml temp.xml

Ahora vuelva a crear la tarea desde el archivo XML modificado:

schtasks /create /xml temp.xml /tn mytasks

y extraer de su archivo temporal:

del /f /q temp.xml

+0

La parte donde reemplaza InteractivoToken con S4U funcionó excelente para mí. Me pregunto por qué esto no es una opción en el Programador de tareas. (usando Windows 10) – User0

3

que podría estar tarde en responder, pero no podemos usar al comando, sin/interactivo ...

https://support.microsoft.com/en-us/kb/313565

Según Microsoft:/interactivo: Utilice este parámetro para permitir la tarea de interactuar con el escritorio del usuario que ha iniciado sesión en el momento se ejecuta la tarea.

0

Hay una solución simple. Cambia el grupo a "usuarios" del grupo local y no se te pedirá una contraseña. (Tarea programada - General - Opciones de seguridad - Cambiar usuario o grupo).

Cuestiones relacionadas