Windows 10: tareas programadas con bloqueo / desbloqueo de estación de trabajo que no se activan

Estoy ejecutando Windows 10, y tratando de conseguir un par de tareas programadas trabajando. Estas tareas se configuran para ejecutarse en bloqueo de estación de trabajo y desbloqueo de estación de trabajo y ejecutar un script que bloquea o desbloquea remotamente una estación de trabajo adjunta de arch-linux. Esto se logra a través de la interfaz de línea de comandos WinSCP, WinSCP.com, y su capacidad de secuencias de comandos incorporada. Estos scrips están funcionando muy bien – Puedo invocarlos manualmente al efecto deseado. Incluso puedo hacer clic con el botón derecho en las tareas que he configurado y hacer clic en 'Ejecutar', y observar el efecto deseado. El problema es que los eventos de bloqueo de estación de trabajo y desbloqueo de estación de trabajo no parecen ser activados, al bloquear y desbloquear la estación de trabajo. Este mismo conjunto de tareas programadas funcionó como se esperaba en Windows 7.

Descripción general de las tareas de bloqueo / desbloqueo

Ventana del Programador de tareas

Con base en las respuestas hasta ahora, puedo conseguir que las tareas se ejecuten como esperaba si compruebo la casilla "Ejecutar sólo cuando el usuario ha iniciado sesión", pero esto tiene el efecto secundario no deseado de hacer que aparezca una ventana de comandos visible cuando se activan las tareas. .

OS es Windows 10 Enterprise LTSB 2016 (x64). Cualquier idea o ideas serían apreciadas.

Cosas que ya he probado:

  • Uso de GPO para permitir la auditoría de eventos de bloqueo / desbloqueo de estaciones de trabajo – sin efecto. (Los eventos de bloqueo / desbloqueo aparecen en el visor de eventos como se esperaba)

  • Creación de un usuario alternativo de Windows y establecimiento de la tarea para que se ejecute como principal.

  • Envolviendo la llamada a WinSCP.com en un script por lotes.

  • Modificación del GPO local para garantizar que se habilite el inicio de sesión como lote.

Otra información relevante: Otras tareas programadas (por ejemplo, las que se ejecutan en un tiempo o intervalo establecido) están funcionando bien. Sólo estas dos tareas fallan.

Edit: El comentario de Twisty, activé el historial de tareas y recibí un mensaje de error real: Mensaje de error del programador de tareas

Por lo tanto, parece que la tarea se desencadena, pero no se lanza. Curiosamente, esto no actualiza la propiedad "Last Run Time" para la tarea.

Un poco de búsqueda superficial indica que este error puede estar relacionado con la información de inicio de sesión / contraseña. He verificado que la contraseña almacenada es correcta, pero el mismo problema persiste. Aquí hay una captura de pantalla de la pestaña 'General' como se solicita. Pestaña General

Aquí está el script WINSCP que se está ejecutando (clave censurada):

# Connect open sftp://charles@192.168.0.1:2222/ -hostkey="ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" call cinnamon-screensaver-command -d close exit 

Acabo de intentar envolver esto en un archivo por lotes muy simple:

 @ECHO ON SET prgwinscp="C:\Program Files (x86)\WinSCP\WinSCP.com" %prgwinscp% /script=lock-arch.winscp 

Puedo ejecutar esto a mano, y como una tarea programada que funciona cuando compruebo "Ejecutar sólo cuando el usuario ha iniciado sesión". Por desgracia, como antes, una vez que establezca la tarea a "Ejecutar si el usuario está conectado o no", me sale el fracaso habitual.

Como se solicita, aquí hay una captura de pantalla de la pestaña acciones: Panel de acciones

El texto oscurecido es el siguiente:

 Add Arguments (Optional): /script=unlock-arch.winscp Start in (Optional): C:\Program Files (x86)\WinSCP 

Siga los siguientes pasos para solucionar y resolver su problema

Propiedades del Programador de tareas. . .

Desde Task Scheduler Windows en las propiedades del trabajo (consulte la parte inferior de la mayoría de las capturas de pantalla) . . .

  • 1. Ficha General , asegúrese de que las siguientes opciones están seleccionadas / marcadas o desmarcadas tal y como se muestra en la pantalla de impresión A

    • Desactive la opción Run only when user is logged on
    • Compruebe Run whether user is logged on or not
    • Compruebe Run with the highest privileges
  • 2. Ficha Condiciones , asegúrese de que las opciones siguientes estén seleccionadas , seleccionadas o desmarcadas tal y como se muestra en la Pantalla de Impresión B

    • Compruebe Wake the computer to run this task
  • 3. En la pestaña Acciones , haga clic en Editar y enurezca que el Start in (optional) se establece justo como se muestra en el ejemplo siguiente ( NO poner marcas de comillas dobles a su alrededor) para la trayectoria completa que apunta donde se encuentra el script de lote SIN una final Barra invertida " \ " Pantalla de impresión C


CONSIDERACIONES DE SEGURIDAD

  • Una vez que presione OK ( 2. arriba), debe pedirle que la credencial ejecute esto como, y esa credencial es lo que necesitará acceso para EXECUTE el archivo por lotes donde exista, y también necesitará acceso para hacer lo que sea el archivo por lotes Está ejecutando que usted ha escrito.

  • Puede ser mejor configurar una cuenta de servicio estático / proxy para este proceso y luego utilizar sus credenciales para ejecutar el proceso. Usted necesitaría asegurarse de que su contraseña es fuerte y se fijó para nunca expirar-y necesita el acceso a EXECUTE el lote y funcionar lo que el proceso por lotes scripted está funcionando y cualquier comando y recursos, ect. Que utiliza también.

  • Parece que la opción Run whether user is logged on or not , DEBE marcar la opción Run with highest privileges para que se ejecute realmente como se espera desde el Programador de tareas.

Comprobación de errores

  • Si hay un problema con la secuencia de comandos de lotes real, pero el planificador de tareas de Windows realmente lo ejecuta para ejecutarlo, pero los errores de lógica de secuencia de comandos por lotes, etc por cualquier razón, el programador de tareas no puede ver este error en este nivel. Desde su perspectiva (por defecto la mayor parte del tiempo), está ejecutando el archivo por lotes, siempre y cuando pueda ejecutarlo y tenga acceso para hacerlo, su trabajo se realiza correctamente.

  • Agregar comprobación de errores o registro a la lógica de secuencia de comandos de lotes para detectar problemas en este nivel, incluyendo la garantía de que el contexto de seguridad que ejecuta el planificador de lotes tiene acceso adecuado a comandos, recursos, etc.


Consideraciones sobre la directiva de grupo

COMPRUEBE LA POLÍTICA DE GRUPO Y CONÉCTASE COMO PERMISO DE TRABAJO DE LOTE

Respuesta: En Windows, este privilegio se otorga a través de la Política de seguridad local o de dominio . Para ello utilizando la directiva de seguridad local , siga estos pasos.

  1. En el Panel de control , abra Herramientas administrativas y , a continuación , Directiva de seguridad local .
  2. Debajo de la configuración de seguridad , abra Directivas locales y resalte la asignación de derechos de usuario .
  3. Localice Iniciar sesión como un trabajo por lotes . Abra las propiedades y añada cualquier usuario que necesite este derecho.
  4. Cuando haya terminado, guarde los cambios y cierre la ventana Configuración de seguridad local .

Sus cambios deben tener efecto inmediatamente. Para realizar cambios en la directiva de seguridad de dominio, en un controlador de dominio, utilice la utilidad Directiva de seguridad de dominio en el Panel de control


Batch Script Logic con unidades mapeadas o ruta UNC completa y problemas. . .

Si su secuencia de comandos hace referencia a una unidad de red asignada, pero desea que Run whether the user is logged on or not , en este contexto, la asignación de unidad no puede estar allí para que el proceso por lotes para hacer lo que se espera.

Si es posible, use rutas UNC en su lógica de secuencia de comandos de lotes en lugar de una letra de unidad asignada para evitar problemas. De lo contrario, puede necesitar utilizar PUSHD \\ServerName\ShareName al principio del proceso por lotes y, a continuación, utilizar POPD al final del proceso por lotes. Puede asignar la unidad con NET USE X: \\ServerName\ShareName al principio del proceso por lotes y, a continuación, desconecte la unidad con NET USE X: /DELETE al final del proceso por lotes.

  • Uso NETO
  • PUSHD
  • POPD

Pantallas de impresión

Pantalla de impresión A

Introduzca aquí la descripción de la imagen

Pantalla de impresión B

Introduzca aquí la descripción de la imagen

Pantalla de impresión C

Introduzca aquí la descripción de la imagen


Ejemplos de secuencias de comandos de lotes WinSCP

A continuación se presentan dos ejemplos muy básicos y dumbed-down de un script FTP para cargar y un script FTP para descargar desde un servidor FTP usando WinSCP.com . Asegúrese de que la variable SET winscplogin= esté definida como el nombre de la conexión FTP que ha definido desde la interfaz gráfica de usuario de WinSCP.

De esta manera se construye la secuencia de comandos de forma dinámica y se construyen los comandos FTP desde dentro de la secuencia de comandos por lotes, sino que también puede simplemente apuntar a un script WinSCP estática con los comandos de FTP en ellos también lo que es fácil de configurar.

Subir a un servidor FTP

 @ECHO ON SET logfile=C:\folder\path\log.log ::SET WinSCP variables, etc. SET prgwinscp="C:\Program Files\WinSCP3\WinSCP.com" SET winscplogin="ABC Company" SET winscpfile=C:\folder\path\ABCompany_FTP_OUT_WinSCP.txt IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%" :ftpout ECHO. >> "%logfile%" ECHO *******************FTP OUT******************* >> "%logfile%" ECHO Delivering file(s) to ABC Company FTP server >> "%logfile%" SET ftpdir="ToABC" ECHO option batch on >> %winscpfile% ECHO option confirm off >> %winscpfile% ECHO option transfer binary >> %winscpfile% ECHO open %winscplogin% >> %winscpfile% ECHO cd %ftpdir% >> %winscpfile% ECHO put "C:\Folder\Path\*.*" >> %winscpfile% ECHO dir >> %winscpfile% ECHO close >> %winscpfile% ECHO exit >> %winscpfile% ECHO %winscpfile% >> "%logfile%" TYPE %winscpfile% >> "%logfile%" ECHO - - - - - - - - - - - - - - - - - - - - - - >> "%logfile%" %prgwinscp% /script=%winscpfile% >> "%logfile%" ECHO - - - - - - - - - - - - - - - - - - - - - - >> "%logfile%" IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%" ECHO Transmission complete >> "%logfile%" 

Descargar desde un servidor FTP

 @ECHO ON SET logfile=C:\folder\path\log.log ::SET WinSCP variables, etc. SET prgwinscp="C:\Program Files\WinSCP3\WinSCP.com" SET winscplogin="ABC Company" SET winscpfile=C:\folder\path\ABCompany_FTP_IN_WinSCP.txt IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%" :ftpin ECHO. >> %logfile% ECHO *******************FTP IN******************* >> %logfile% ECHO Retrieving files from ABC Company server >> %logfile% SET ftpdir="FromABC" ECHO option batch on >> %winscpfile% ECHO option confirm off >> %winscpfile% ECHO option transfer binary >> %winscpfile% ECHO open %winscplogin% >> %winscpfile% ECHO cd %ftpdir% >> %winscpfile% ECHO ls >> %winscpfile% ECHO get "*.*" "C:\Folder\path\" >> %winscpfile% ECHO close >> %winscpfile% ECHO exit >> %winscpfile% ECHO %winscpfile% >> %logfile% TYPE %winscpfile% >> %logfile% ECHO ------------------------------------------- >> %logfile% %prgwinscp% /script=%winscpfile% >> %logfile% ECHO ------------------------------------------- >> %logfile% IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%" ECHO FTP Downloading Complete >> %logfile% ECHO Transmission complete >> %logfile% 

Scripts de ejemplo personalizados

Asegúrese de utilizar ambas opciones de Run whether user is logged on or not y Run with the highest privileges al programar la secuencia de comandos de lote. Una vez que aplique estos cambios necesitará poner credenciales para ejecutar la tarea de forma explícita. Asegúrese de usar una cuenta que tenga acceso de ejecución al archivo C:\Program Files (x86)\WinSCP\WinSCP.com y que también cumpla con los otros requisitos previos generales enumerados anteriormente.

Si todavía tiene problemas y desea confirmar que no está relacionada con la seguridad del sistema operativo, cree una nueva cuenta local en la máquina y déle una contraseña segura, establezca que no caduque nunca y que se ejecute como permisos por lotes. También puede hacer que sea un administrador local y la prueba sólo para ser exhaustivo para ver si dar la cuenta de acceso de administrador local en la máquina hace cualquier diferencia.

Esto significa que usted tiene dos archivos: un script por lotes y un WinSCP. La secuencia de comandos por lotes pasará la secuencia de comandos WinSCP a WinSCP.com y sólo puede ejecutarla para ejecutar el proceso. Asegúrese de que este script funciona como el mismo usuario mientras inicia sesión simplemente ejecutándolo para probar y luego probar con esa misma cuenta mientras se registra en la sesión de la máquina con la opción Run only when user is logged on para confirmar que funciona desde el Programador de tareas Antes de configurarlo para que se ejecute si ha iniciado sesión o no, etc.

La pestaña Actions Programador de tareas sólo utilizará el campo Program/Script: con todos los demás campos en blanco pero el campo Program/Script: tendrá un valor de C:\folder\path\yourbatchscript.cmd .

Batch Script

 @ECHO ON SET prgwinscp="C:\Program Files (x86)\WinSCP\WinSCP.com" %prgwinscp% /script=lock-arch.winscp EXIT 

Script de WinSCP

 open sftp://charles@192.168.0.1:2222/ -hostkey="ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" call cinnamon-screensaver-command -d close exit