El programa no se ejecuta correctamente como tarea programada


12

Situación

Tengo un script por lotes que prepara algunos archivos, ejecuta un programa ( .exe) y luego elimina dichos archivos.

Esta tarea debería ejecutarse cada hora, así que estoy tratando de configurar esto usando Tareas programadas. El problema es que el programa mencionado anteriormente no se ejecuta correctamente cuando se invoca desde la tarea (ni a través del .batscript ni cuando se llama .exedirectamente), pero no recibo ningún mensaje de advertencia o error en los registros.

Preparar

La tarea está configurada para ejecutarse como una cuenta de servicio de Windows que tiene todos los privilegios configurados correctamente. Cuando uso esta cuenta para iniciar sesión a través de RDP, puedo ejecutar .baty .exedirectamente sin problemas, pero aún así la tarea parece no hacer nada. Esto se observa fácilmente porque el programa siempre modifica un archivo y la modificación en la marca de tiempo no cambia a través de la tarea.

En los registros de tareas programadas, recibo los mensajes de información para la tarea que inicia un proceso, sale, etc. Sin embargo, el "código de resultado" es 111(intenté buscarlo en Google sin suerte, la única asociación que obtengo es "el nombre del archivo es demasiado largo" ", que es completamente irrelevante AFAIK). En los registros de la aplicación, no obtengo absolutamente nada.

Lo que sospecho es el problema.

El programa es una vieja monstruosidad que genera algún tipo de pantalla de bienvenida (en realidad es una ventana normal), aunque la GUI no es necesaria porque no requiere interacción y se cierra después de las operaciones. La ventana aparece durante unos 2 segundos.

Sospecho que este requisito para una GUI tiene algo que ver con la falla de la tarea, pero no estoy seguro. Cuando inicio sesión con el usuario con el que se ejecuta la tarea (a través de RDP), no aparece ninguna ventana cuando inicio la tarea programada.


Editar sobre la GUI

He creado un ejecutable C # muy pequeño que inicia el programa sin la ventana principal (usando ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden). Incluso de esta manera, la tarea programada aún no puede iniciar el programa correctamente, pero el código de retorno es ahora 0.


Actualizar

Cuando configuro la tarea para que diga "ejecutar si el usuario inició sesión o no", y la run with highest privilegesopción no está marcada , el valor de error es 2147943859.


¿Qué puedo hacer para solucionar problemas?

SO = Windows Server 2008 R2 SP1

Si necesita más información, hágamelo saber en los comentarios.


¿Su script y "programa" toman alguna entrada, como opciones o parámetros? ¿Has intentado usar PowerShell en lugar de lote? Cuando se inicia un .exe"programa" con parámetros desde un script, la entrada debe proporcionarse adecuadamente como argumento.
slybloty

1
¿Has probado el programador con un programa diferente? Simplemente reemplace el programa por uno diferente y vea qué resultados obtiene.
slybloty

2
@ out-null No creo que el programador de tareas use la ventana para saber cuándo el programa ha terminado de ejecutarse, debería esperar el proceso, lo que sea que haga con Windows. Pero si el programa intenta buscar algo específico para crear su pantalla de inicio (digamos la barra de tareas) y no lo encuentra (porque se ejecuta en una estación de escritorio / ventana separada), es posible que se detenga ...
Ale

1
OKAY. ¿Has intentado ejecutarlo con la cuenta LocalSystem? Además, ¿ha intentado monitorear el evento de inicio del proceso con Process Monitor de Sysinternals?
Lucky Luke

1
@BradBouchard Aunque es posible que su respuesta no resuelva la pregunta de los OP en este caso específico, es una respuesta válida y podría ser útil para futuros visitantes de SF, por lo que le animo a que no la elimine.
Digo reinstalar a Mónica el

Respuestas:


6

Creo que su problema tiene que ver con los permisos de la cuenta que se está utilizando para ejecutar la tarea o con el contexto de la cuenta que existe al intentar ejecutar la tarea.

Prueba de requisito de sesión de consola

Es posible que su .EXE se ejecute en Consolesesión (también conocido como Sesión 0) en la computadora. Para probar esto:

  1. Configure la tarea para que se ejecute solo cuando el usuario haya iniciado sesión y especifique un tiempo de inicio de la tarea de 2 minutos en el futuro
  2. Inicie sesión en la máquina con la misma cuenta de usuario utilizada para ejecutar la tarea (preferiblemente inicie sesión en la sesión de la consola, ya sea físicamente en la consola o utilizando un programa de acceso remoto que le da acceso a la consola. Para confirmar que está utilizando el sesión de consola, desde una ejecución del símbolo del sistema QWINSTA, observe la SESSIONNAMEcolumna y confirme que el >indicador está al lado console, en otras palabras, debería aparecer como >console)
  3. Espera a que se ejecute la tarea

Si la tarea se ejecuta correctamente, intente programar la tarea con SCHTASKS.EXEel /ITparámetro. De lo contrario, es posible que no tenga más remedio que configurar la computadora para iniciar sesión automáticamente como su cuenta de usuario de servicio y ejecutar la tarea como un programa de inicio.

Verificar permisos

Además, como ya he sugerido, verifique lo siguiente para confirmar que la cuenta utilizada para ejecutar la tarea está autorizada correctamente:

  1. Otorgue a la cuenta el derecho de usuario Iniciar sesión como trabajo por lotes (Se encuentra en la Política de grupo local en Computer Configuration/Windows Settings/Security Settings/Local Policies/User Rights Assignments)
  2. Confirme que la tarea está configurada para ejecutarse con los privilegios más altos
  3. Confirme que el usuario tiene permisos NTFS completos para todas las carpetas y archivos con los que debe interactuar. No hacer suposiciones; en su lugar, confirme navegando a tales ubicaciones de archivos y usando la Effective Permissionspestaña en las Propiedades del archivo / carpeta enSecurity > Advanced

Cosas adicionales para verificar / probar

  • ¿La tarea requiere acceso para acceder a los recursos de la red? Cosas como las unidades mapeadas pueden estar presentes cuando inicia sesión con la cuenta de usuario, pero dependiendo de la configuración del servidor puede no estar presente en el contexto de la cuenta de usuario cuando se ejecuta desde el Programador de tareas.
  • Agregue un poco de registro a su archivo por lotes. Después de cada línea que se ejecuta, haga que escriba algo de salida en un archivo de registro para que sepa dónde se está atascando. Por ejemplo:

    @echo off
    echo Line 1 >> "C:\MyLog.txt"
    "C:\My Folder\myOldProgram.exe"
    echo Line 2 >> "C:\MyLog.txt"
    DEL somefile.dat
    echo Line 3 >> "C:\MyLog.txt"
    
  • Intente ejecutar su .EXE con START, por ejemploSTART "myTitle" "C:\full\path\to\my.EXE"


2

Estoy respondiendo a una publicación anterior en caso de que ayude a alguien más. Tuve el mismo problema. El registro de eventos decía que el programa se completaba normalmente, pero ni siquiera la primera línea de código escribiría en el registro por mí. Terminó siendo la opción "Iniciar en" en el Programador de tareas. Se me ocurrió que el programa funcionaba bien desde la línea de comandos cuando estaba en el directorio actual. Hay archivos de manifiesto y otras dependencias en el mismo directorio. Entonces, si le dice al trabajo programado que comience en el mismo directorio que el EXE, puede obtener resultados favorables. Fue la solución para mí.


Esta fue la solución para ejecutar una aplicación de consola personalizada desarrollada en Visual Studio con archivos de configuración compatibles.
billfredtom

1

tal vez esto te ayuda?

/programming/6939548/a-workaround-for-the-fact-that-a-scheduled-task-in-windows-requires-a-user-to-be

Tuvimos un problema similar y su única solución fue que hicimos una cuenta especial en el servidor con inicio de sesión automático. Entonces, si la tarea se ejecutó bajo el usuario ya registrado, nuestro .exe funcionó bien ...

Sé que esta no es una solución muy buena, pero para nosotros fue lo único que funcionó. No sé si esto funciona para usted ... (Pero con esta solución, debe verificar si el usuario realmente ha iniciado sesión todo el tiempo ...)


La tarea ni siquiera se ejecuta correctamente cuando el usuario con el que se ejecuta está conectado de manera efectiva (a través de RDP). Uso la cuenta de servicio para iniciar sesión a través de RDP, inicio la tarea manualmente y no veo que aparezca una ventana.
MarioDS

2
¿Desmarcó la opción "ejecutar con los privilegios más altos"? Creo que cuando haya marcado esta opción, se producirá una sucesión de derechos (UAC) y no verá una ventana incluso cuando el usuario haya iniciado sesión (se llamará en una sesión separada sin ventana y fallará). También intente seleccionar la opción "configurado para" -> "Windows Server 2003, Windows XP o Windows 2000".
frupfrup

Eso parece hacer ninguna diferencia, salvo que ahora me puse "ejecutar si el usuario está conectado o no" Me código de error 2147943859. sólo puedo establecer "Configurado para" a cualquiera Windows Vista/Windows Server 2008o Windows 7/Windows Server 2008 R2. Parece que no hay diferencia.
MarioDS

Okay. una última prueba: cree una nueva tarea con "crear nueva tarea" en lugar de "crear tarea fácil" (no sé qué texto se muestra realmente, mis servidores son alemanes, pero espero que sepa lo que quiero decir) y luego Creo que puede seleccionar "Windows Server 2003, ...". y luego intenta una vez más con las otras opciones ...
frupfrup

1

Los muchachos de la compañía que administra los servidores de nuestros clientes dijeron que un programa GUI no se ejecutaría a través de tareas programadas de ninguna manera.

Usan un sistema de monitoreo que también tiene características de programación de tareas. Lo han configurado a través de eso y parece funcionar.

Lamento no haber tenido la oportunidad de evaluar más sugerencias aquí, pero gracias por intentar ayudar de todos modos. Espero que pueda ayudar a otros en el futuro, lo cual creo que ciertamente ayudará.


1

Estaba intentando iniciar un viejo programa VB6 usando el programador de tareas en un servidor Windows 2008 R2. La aplicación se ejecutaría desde el exe, a través de un archivo por lotes o haciendo clic en un acceso directo, pero no se ejecutaría desde el programador de tareas. Encontré que cuando los archivos de configuración para la aplicación, que estaban almacenados en la carpeta de aplicaciones en el directorio C: \ archivos de programa (x86), se copiaron a la carpeta de la aplicación en c: \ programdata. El planificador trabajó. parece que cmd.exe aplica la configuración desde una ubicación diferente a la utilizada por el programador de tareas. Si su aplicación tiene archivos de configuración, puede intentar moverlos a la carpeta c: \ programdata \ application.


0

¿Está haciendo referencia a alguna unidad de red asignada en su script o programa? Tuve un problema similar hace un tiempo donde mi tarea programada no se ejecutaría, y no podía entender por qué. Cambiar las rutas a rutas UNC lo resolvió para mí.

Cambiar T:\Apps\MyProgram.exea\\MyServer\MyShare\Apps\MyProgram.exe


No, el programa está en el C:disco local .
MarioDS

0

Cuando configuro la tarea para que diga "ejecutar si el usuario ha iniciado sesión o no", y la opción ejecutar con los privilegios más altos está desmarcada, el valor de error es 2147943859.

2147943859 convertido a Hex es 800705b3, que un viaje rápido a Google me dice que significa "No se pudo iniciar el programa de instalación en la computadora. Esta operación requiere una estación de ventana interactiva".

Ahora, puede haber alguna forma de hacer que se ejecute de forma interactiva sin usar PSEXEC (de Sysinternals), pero dado que ya sé cómo hacerlo a través de PSEXEC, eso es lo que usaría.

PSExec: http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

Por lo tanto, cambie su acción para anteponer todo con psexec.exe -i (y -h si lo necesita elevado) y debería funcionar.

He intentado esto en Windows Server 2008 R2 SP1 con lo siguiente en mi 'acción':

c:\windows\system32\cmd.exe

y luego los parámetros:

/c psexec.exe -h -i notepad.exe

Cuando ejecuto manualmente la tarea (ya que no tengo programada), obtengo un bloc de notas elevado ejecutándose en mi sesión actual.


0

¿Quizás la respuesta a esta pregunta ayudará a alguien más a leer este hilo?

/programming/32589381/

Resumen: Las tareas programadas de Windows 2012 no ven las variables de entorno correctas, incluida PATHla cuenta en la que la tarea está configurada para ejecutarse.

Leí todo esto bastante tiempo antes de resolver lo anterior. (Cuál fue mi propio problema que me llevó a la misma pregunta del OP).

Una vez que (¡por fin!) Sepa esto, es bastante fácil probarlo (según la respuesta de stackoverflow), verlo sucediendo y solucionarlo ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.