¿Por qué un trabajo del Programador de tareas no puede acceder a una unidad de red asignada?


27

Tengo un trabajo del Programador de tareas para ejecutar Robocopy para realizar copias de seguridad de archivos locales en un recurso compartido de red. Tengo que usar credenciales de dominio para acceder al recurso compartido de red, pero la computadora local no está en el dominio y el trabajo se ejecuta como administrador local. Esta soluciónde mapear y desasignar temporalmente el recurso compartido de red funciona, pero deja mi contraseña expuesta en texto sin formato para cualquiera que vea las acciones de trabajo del Programador de tareas. Preferiría asignar la unidad de red normalmente de forma semipermanente, por lo que el trabajo del Programador de tareas solo tiene que ejecutar Robocopy y consultar la letra de unidad correspondiente. Sin embargo, siempre aparece el error "El sistema no puede encontrar la ruta especificada". en el registro de Robocopy al ejecutar esto desde el Programador de tareas, aunque el comando funciona bien desde un símbolo del sistema elevado (el trabajo está configurado para ejecutarse con los privilegios más altos). También tenga en cuenta que he hecho este ajuste de registro para acceder a las unidades asignadas desde un símbolo del sistema elevado.

EDITAR: Para aclarar, conectado como administrador local, inicio Windows Explorer como administrador. Asigno el recurso compartido de red a la letra de unidad Y. Lanzo el símbolo del sistema como administrador y ejecuto

C:\Windows\System32\Robocopy.exe C:\temp Y:\temp

Funciona bien. Creo un trabajo del Programador de tareas para ejecutar exactamente el mismo comando, ya sea que el usuario haya iniciado sesión o no, con los más altos privilegios. Lo ejecuto y obtengo un error. Escribo en un registro y obtengo

ERROR 3 (0x00000003) Getting File System Type of Destination Y:\temp\
The system cannot find the path specified.

seguido por

ERROR 3 (0x00000003) Creating Destination Directory Y:\temp\
The system cannot find the path specified.

¿Su ruta local o ruta de red tiene espacios en ellas? Si es así, ¿está encapsulando la ruta con comillas dobles al principio y al final de la ruta?
Dom

@SunWKim No hay espacios en ninguna ruta.
Craig W

¿Cuál es la línea de comando que está utilizando para realizar la copia de seguridad de local a red? ¿A qué tipo de red compartida está respaldando? Me hace pensar que tal vez el recurso compartido de red no está disponible (no conectado) cuando realiza el comando de copia de seguridad.
Dom

¿Se está ejecutando como usuario o simplemente como "administrador"? Si es su usuario, ¿la unidad está asignada de manera persistente para su usuario?
Nick

@SunWKim Sí, la unidad se conecta después de la asignación. El administrador local no tiene derechos sobre el recurso compartido de red, por eso tengo que asignarlo como un usuario diferente antes de ejecutar Robocopy.
Craig W

Respuestas:


17

Las unidades asignadas son un concepto de interfaz de usuario y no están disponibles para tareas en segundo plano como esa. Acceda al objetivo a través de UNC y asegúrese de que el usuario que ejecuta la tarea tenga acceso al objetivo.


Imposible. La computadora no está en el dominio, así que tengo que ejecutar la tarea como un usuario que no pertenece al dominio, pero solo los usuarios del dominio tienen acceso al recurso compartido de red.
Craig W

Sé que esto es muy tarde para el juego, pero ¿has intentado separar tu trabajo en 2 tareas programadas, una para el recurso compartido de red con credenciales de dominio y luego otra que se ejecuta como administrador local con acceso a la unidad asignada? Solo tendría que escalonarlos o usar un mutex de archivo o algo para asegurarse de que estén en orden.
Dan Csharpster

7

En mi caso, todo lo que tenía que hacer era desmarcar la run with highest privilegesbandera pero estaba ejecutando la tarea en el mismo usuario que el usuario que asignó la unidad.


Eso fue todo por mí. Tiene sentido.
Tom Haws


1

Otra opción es usar la ruta de red completa, ya que Robocopy los admite. es decir, robocopy c: \ temp \\ server \ share \ temp

O mejor aún, ejecute la copia de seguridad en el servidor. Cree una cuenta de administrador de dominio solo para el proceso de copia de seguridad. Alimente robocopy la contraseña de un archivo de texto al que solo los administradores de dominio pueden acceder.

Hace años, creé varios scripts .cmd que harían una copia de seguridad de los archivos esenciales para cada sistema de la red de esta manera. El único programa externo que utilicé fue el comando Grep de Cgywin y un remitente de correo smtp del símbolo del sistema.

Hice un script que escanearía la red en busca de sistemas. Crearía un archivo de texto con todos los nombres de los sistemas y me alertaría por correo electrónico de cualquier sistema nuevo que encontrara. (Tenía un archivo de configuración que analizaría para que los sistemas lo omitieran). Cada nuevo sistema tenía un directorio de respaldo creado y un archivo de configuración de respaldo colocado en él. El usuario podría modificar este archivo y enumerar los directorios que necesitaban copia de seguridad. También podrían especificar el tiempo para sus copias de seguridad para que no suceda cuando estaban en la oficina. Ejecuté este script en el servidor cada 5 minutos, ya que no tomó tiempo de procesamiento y me gusta la característica de seguridad de alertarme cuando se conectó un nuevo sistema a la red.

Otro script analizaría todos los archivos de configuración de respaldo individuales y programaría una tarea para ejecutar un respaldo en ese sistema. Esto se ejecutó diariamente a las 12:01 am.

Finalmente, el script de copia de seguridad analizaría el archivo de configuración que le pasó el planificador y el uso de robocopy copiaría todos los archivos. Tuve un error completo al verificar los archivos de configuración, ya que los usuarios los editarían, y recibiría correos electrónicos sobre cualquier problema.

Los usuarios podían leer sus archivos de respaldo, pero no podían eliminar el respaldo. Esto proporcionó cierta protección contra el daño de un posible empleado descontento.

Probablemente se podría haber hecho algo mucho más elegante en .vbs o powershell, pero en realidad no soy un programador. Mis clases de programación incluyeron Cobal y JCL. Recuerdo que copié los guiones cuando me fui, pero quién sabe dónde están ahora.


1

Superé el problema cambiando la opción "Ejecutar si el usuario inició sesión o no" a "Ejecutar solo cuando el usuario inició sesión". Prueba esto, puede ayudarte.


1
echo Get-Date >> c:\mount_nfs_log.txt
net use X: \\share\folder password /user:domain\user>> c:\mount_nfs_log.txt 2>&1

Crear este script de PowerShell, programar el trabajo como SYSTEM y configurarlo para que se ejecute al reiniciar me permitió usar letras de unidad en mis scripts, ya que UNC no es una opción debido a un dolor de cabeza por otros problemas.


¡Esto solucionó el problema para mí! ¡Tener este comando para iniciar sesión con autenticación para ejecutar antes de que el script hiciera maravillas! Esto resuelve el dolor de cabeza de tener que "reflejar las cuentas de usuario" con algo robusto.
Tschallacka

1
La primera vez que ayudé a alguien en el desbordamiento de pila, me alegro de poder ayudar. Además, use "echo Get-Date" en lugar de lo que tenía antes.
Ryan McGrath

No necesitaba el registro, así que solo agregué una cmd /c net useentrada de trabajo antes de la entrada del trabajo de copia en la tarea y eso solucionó mi problema. Su publicación fue la primera después de cuatro horas de encontrar cuentas espejo sugeridas que proporcionaron una solución fácil. ¡Sigan con el buen trabajo!
Tschallacka

Todavía está manteniendo las rutas UNC con este script para que lo sepa. Solo porque está asignando una letra de unidad a una ruta UNC y luego refiriéndose a esa letra de unidad, aún debe mantenerla \\ServerName\ShareNameen este tipo de lógica. Además, esto no necesariamente tiene que ser PowerShell, ya que también se NET USEejecuta por lotes y en cuanto a la programación con el Programador de tareas como la cuenta del SISTEMA, puede hacerlo independientemente del tipo de script, lógica, etc. que programe para ejecutar a través de la Tarea Programador
Pimp Juice IT

Además, solo para aclarar, tenga en cuenta que también puede usar NET USE \\<ServerName>\<ShareName> <password> /user:<domain>\<username>así y no tener que especificar una letra de unidad si la autenticación solo para el recurso compartido es lo que se necesita en lugar de la letra de unidad real.
Pimp Juice IT

0

Intente cambiar la ubicación "inicio en" a "c: \". Esto pareció solucionarlo para mí, por lo que tal vez el sistema estaba impidiendo que cmd.exe se ejecute desde el predeterminado \ windows \ system32 \ como una característica de seguridad.


0

Tuve el mismo problema al intentar acceder a r: /xxxfilename.txt con una unidad asignada de Windows r: \ server \ share al llamar a un script desde el programador de tareas de Windows.

Lo resolví usando //server/share/xxxfilename.txt
Tenga en cuenta que la barra diagonal inversa se convirtió en barra diagonal.
Ahora mi script bash cygwin se ejecuta en el programador de tareas de Windows y el shell cygwin.
Nota: el comando " net use " puede acceder a las unidades de mapa en el shell pero muestra R no disponible: cuando ejecuto este comando en el Programador de tareas de Windows.


¡Bienvenido a Super User! Por favor lea la pregunta otra vez cuidadosamente. Su respuesta no responde a la pregunta original. OP no menciona el uso de Cygwin o bash.
DavidPostill

0

Como señaló otro usuario, parece que funciona la opción "Ejecutar si el usuario inició sesión o no" en "Ejecutar solo cuando el usuario inició sesión". Luego puede usar la ruta asignada (por ejemplo, Z :) o la ruta del servidor (por ejemplo, \\ ServerName \ Path).

Por supuesto, si usa esta opción, debe hacer lo que dice y asegurarse de haber iniciado sesión en el servidor como usuario con acceso a la unidad correspondiente. Recuerdo estar en una empresa más antigua con una serie de trabajos configurados como este. Un día alguien "cerró sesión" en el servidor de trabajos principal, sin esperar que eso tuviera algún tipo de impacto ya que no estaban apagando la máquina de ninguna manera ...

Además, en estos días, a Windows le gusta hacer muchos reinicios del sistema auto invocados. Por lo tanto, use esta solución bajo su propio riesgo.


0

También tenga en cuenta que si realiza la asignación en el script y la contraseña contiene%, entonces debe escribirse %% para que el script funcione desde el programador de tareas, pero% para trabajar desde el comando


0

uno puede usar los siguientes comandos, que se agregarán en la secuencia de comandos por lotes en sí, para ejecutar la secuencia de comandos Batch desde la tarea de programación de Windows para obtener dir, archivo copiado en el sistema local usando la tarea de programación de Windows; uso neto Y: "\\ xxx \ xxx \ xxx cd / d Y: usuario neto / d Y: / Y


-2

Gracias, creo que el uso de "iniciar en c: \" resolvió mi problema. Seguiré este problema para confirmar que está resuelto.

Estaba teniendo el mismo problema, si hacía clic directamente en el lote, se ejecutó sin problemas pero no bajo la tarea programada.


Esto no responde a la pregunta del autor. Por favor no deje comentarios como respuestas.
Ramhound

Por favor no agregue "gracias" como respuestas. Invierta algo de tiempo en el sitio y obtendrá los privilegios suficientes para votar las respuestas que le gusten, que es la forma de Súper Usuario de decir gracias.
DavidPostill
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.