Por que um trabalho do Agendador de tarefas não pode acessar uma unidade de rede mapeada?


27

Eu tenho um trabalho do Agendador de tarefas para executar o Robocopy para fazer backup de arquivos locais em um compartilhamento de rede. Preciso usar credenciais de domínio para acessar o compartilhamento de rede, mas o computador local não está no domínio e o trabalho é executado como administrador local. Esta soluçãode mapear e remover o mapeamento temporariamente do compartilhamento de rede funciona, mas deixa minha senha exposta em texto sem formatação para quem observar as ações da tarefa do Agendador de Tarefas. Eu preferiria mapear a unidade de rede normalmente de forma semi-permanente, para que o trabalho do Agendador de tarefas apenas execute o Robocopy e consulte a letra da unidade apropriada. No entanto, sempre recebo o erro "O sistema não consegue encontrar o caminho especificado". no log do Robocopy ao executar isso no Agendador de tarefas, mesmo que o comando funcione bem em um prompt de comando elevado (o trabalho está definido para ser executado com os privilégios mais altos). Observe também que fiz esse ajuste no registro para acessar unidades mapeadas em um prompt de comando elevado.

EDIT: Para esclarecer, logado como administrador local, inicio o Windows Explorer como administrador. Mapeio o compartilhamento de rede para a letra da unidade Y. Ativo o prompt de comando como administrador e executo

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

Funciona bem. Eu crio um trabalho do Agendador de tarefas para executar exatamente o mesmo comando, esteja o usuário conectado ou não, com os privilégios mais altos. Eu corro e recebo um erro. Escrevo para um log e recebo

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.

O caminho local ou o caminho da rede possui espaços? Se sim, você está encapsulando o caminho com aspas duplas no início e no final do caminho?
Dom

@SunWKim Nenhum espaço em nenhum caminho.
Craig W

qual é a linha de comando que você está usando para executar o backup do local para a rede? Que tipo de compartilhamento de rede você está fazendo backup? Me faz pensar que talvez o compartilhamento de rede não esteja disponível (não conectado) quando você executar o comando backup.
Sun

Ele está sendo executado como seu usuário ou apenas "um administrador". Se for seu usuário, a unidade é mapeada persistentemente para ele?
Nick

@SunWKim Sim, a unidade é conectada após o mapeamento. O administrador local não tem direitos para o compartilhamento de rede, e é por isso que preciso mapeá-lo como um usuário diferente antes de executar o Robocopy.
Craig W

Respostas:


17

As unidades mapeadas são um conceito de interface do usuário e não estão disponíveis para tarefas em segundo plano como essa. Acesse o destino via UNC e verifique se o usuário que executa a tarefa tem acesso ao destino.


Não é possivel. O computador não está no domínio, portanto, tenho que executar a tarefa como um usuário que não seja do domínio, mas apenas os usuários do domínio terão acesso ao compartilhamento de rede.
Craig W

Sei que isso é muito tarde para o jogo, mas você tentou separar seu trabalho em duas tarefas agendadas, uma para o compartilhamento de rede com credenciais de domínio e outra para execução como administrador local com acesso à unidade mapeada? Você apenas teria que escaloná-los ou usar um arquivo mutex ou algo assim para garantir que eles fiquem em ordem.
precisa saber é o seguinte

7

No meu caso, tudo o que tive que fazer foi desmarcar a run with highest privilegesbandeira, mas estou executando a tarefa no mesmo usuário que o usuário que mapeou a unidade.


para mim, chega. Faz sentido.
precisa saber é o seguinte


1

Outra opção é apenas usar o caminho completo da rede, pois o Robocopy os suporta. ou seja, robocopy c: \ temp \\ servidor \ compartilhamento \ temp

Ou melhor ainda, execute o backup no próprio servidor. Crie uma conta de administrador de domínio apenas para o processo de backup. O feed copia a senha de um arquivo de texto que somente administradores de domínio podem acessar.

Anos atrás, criei vários scripts .cmd que faziam backup de arquivos essenciais para todos os sistemas da rede dessa maneira. O único programa externo que usei foi o comando Grep do Cgywin e um remetente de email smtp do prompt de comando.

Eu criei um script que varreria a rede em busca de sistemas. Ele criaria um arquivo de texto com todos os nomes do sistema e me alertaria por e-mail de todos os novos sistemas encontrados. (Eu tinha um arquivo de configuração que ele analisaria para os sistemas pularem.) Cada novo sistema tinha um diretório de backup criado para ele e um arquivo de configuração de backup nele. O usuário pode modificar esse arquivo e listar todos os diretórios necessários para o backup. Eles também poderiam especificar a hora de seus backups, para que isso não acontecesse quando eles estivessem no escritório. Executei esse script no servidor a cada 5 minutos, pois não demorou tempo de processamento e eu gosto do recurso de segurança de me alertar quando um novo sistema foi conectado à rede.

Outro script analisaria todos os arquivos de configuração de backup individuais e agendaria uma tarefa para executar um backup nesse sistema. Isso acontecia diariamente às 12h01.

Finalmente, o script de backup analisaria o arquivo de configuração que foi passado pelo planejador e o uso de robocopy copiaria todos os arquivos. Eu tive uma verificação de erro total nos arquivos de configuração, já que os usuários os editavam e recebia e-mails com problemas.

Os usuários puderam ler seus arquivos de backup, mas não puderam excluir o backup. Isso forneceu alguma proteção contra danos de um possível funcionário insatisfeito.

Provavelmente algo muito mais elegante poderia ter sido feito em .vbs ou powershell, mas eu não sou realmente um programador. Minhas aulas de programação incluíam Cobal e JCL. Lembro que copiei os scripts quando saí, mas quem sabe onde eles estão agora.


1

Eu superei o problema alterando a opção "Executar se o usuário está conectado ou não" para "Executar apenas quando o usuário está conectado". Tente isso, pode ajudá-lo.


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

Criar esse script do PowerShell, agendar o trabalho como SYSTEM e configurá-lo para ser executado na reinicialização me permitiu usar letras de unidade em meus scripts, pois o UNC não é uma opção devido a uma dor de cabeça de outros problemas.


Isso corrigiu o problema para mim! ter esse comando para fazer login com autenticação para executar antes que o script fizesse maravilhas! Isso resolve a dor de cabeça de ter que "espelhar contas de usuário" com algo robusto.
Tschallacka 01/06/19

1
Primeira vez que ajudei alguém no estouro de pilha, feliz por poder ajudar. Além disso, use "echo Get-Date" em vez do que eu tinha antes.
Ryan McGrath

Eu não precisava do log, então acabei de adicionar uma cmd /c net useentrada de trabalho antes da entrada de trabalho de cópia na tarefa e isso corrigiu meu problema. Sua postagem foi a primeira após quatro horas a encontrar contas-espelho sugeridas que forneciam uma solução fácil. Mantenha o bom trabalho!
Tschallacka

Você ainda está mantendo os caminhos UNC com este script para que você saiba. Só porque você está atribuindo uma letra de unidade a um caminho UNC e depois se referindo a essa letra de unidade, você ainda precisa manter \\ServerName\ShareNameesse tipo de lógica. Além disso, isso não precisa necessariamente ser o PowerShell, já que NET USEé executado via lote e até o agendamento com o Agendador de tarefas como a conta SYSTEM, você pode fazer isso independentemente do tipo de script, lógica etc. que você planeja executar via Tarefa Agendador.
Pimp Juice IT

Além disso, apenas para esclarecer, observe que você também pode usar NET USE \\<ServerName>\<ShareName> <password> /user:<domain>\<username>assim e não precisar especificar uma letra de unidade se a autenticação apenas para o compartilhamento for o que é necessário e não a letra da unidade real.
Pimp Juice IT

0

Tente alterar o local "iniciar em" para "c: \". Isso pareceu corrigi-lo, então talvez o sistema esteja impedindo a execução do cmd.exe a partir do \ windows \ system32 \ como um recurso de segurança.


0

Eu tive o mesmo problema ao tentar acessar r: /xxxfilename.txt com uma unidade mapeada do Windows r: \ server \ share ao chamar um script do agendador de tarefas do Windows. Resolvi

usando //server/share/xxxfilename.txt
Observe a barra invertida convertida em barra invertida.
Agora, meu script bash cygwin é executado no agendador de tarefas do Windows e no shell cygwin.
Nota: o comando " net use " pode acessar as unidades de mapa no shell, mas mostra Indisponível R: quando executo esse comando no Agendador de tarefas do Windows.


Bem-vindo ao Super Usuário! Por favor, leia a pergunta novamente com atenção. Sua resposta não responde à pergunta original. O OP não menciona o uso do Cygwin ou do bash.
DavidPostill

0

Como outro usuário observou, definir a opção "Executar se o usuário está conectado ou não" para "Executar apenas quando o usuário estiver conectado" parece funcionar. Você pode usar o caminho mapeado (por exemplo, Z :) ou o caminho do servidor (por exemplo, \\ ServerName \ Path).

Obviamente, se você usar esta opção, precisará fazer o que está escrito e garantir que fez login no servidor como um usuário com acesso à unidade relevante. Lembro-me de estar em uma empresa mais antiga, com vários trabalhos configurados como este. Um dia alguém "desconectou" o servidor principal de tarefas, sem esperar que isso tivesse algum impacto, pois não desligaria a máquina de forma alguma ...

Além disso, atualmente, o Windows gosta de fazer muitas reinicializações auto-invocadas do sistema. Portanto, use esta solução por sua conta e risco.


0

Observe também que, se você fizer o mapeamento no script e a senha contiver%, será necessário gravar %% para que o script funcione a partir do agendador de tarefas, mas% funcione a partir do prompt de comando


0

pode-se usar os seguintes comandos, a serem adicionados no próprio script em lote, para executar o script em lote da tarefa de agendamento do Windows para obter dir, arquivo copiado no sistema local usando a tarefa de agendamento do Windows; uso líquido Y: "\\ xxx \ xxx \ xxx cd / d Y: usuário líquido / d Y: / Y


-2

Obrigado, acho que usando "start in c: \" resolveu o meu problema, rastreamos esse problema para confirmar que foi resolvido.

Eu estava tendo o mesmo problema, se eu clicasse diretamente no lote, ele funcionava perfeitamente, mas não na tarefa agendada.


Isso não responde à pergunta do autor. Por favor, não deixe comentários como respostas.
precisa saber é o seguinte

Por favor, não adicione "obrigado" como respostas. Invista algum tempo no site e você obterá privilégios suficientes para votar de imediato as respostas que desejar, que é a maneira do Superusuário de dizer obrigado.
DavidPostill
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.