As unidades mapeadas só estão disponíveis para uma sessão interativa. Você não pode mapear uma unidade durante a execução como um serviço, você precisa usar caminhos UNC.
Eu preciso mapear para um espaço de rede uma unidade mapeada como S: para alguns outros trabalhos. Minha caixa é o Windows Server 2008. No Windows Server 2008, posso criar uma tarefa agendada com um trabalho de morcego e posso especificar que ela seja executada quando o Windows for reinicializado ou faça logon sem o usuário especificado. É como um serviço com sistema local. O morcego contém cmd net para mapear a unidade:
net use S: \netdrive1\space1 pwd /user:oneUser
Então eu reinicio a caixa. Parece que o trabalho agendado foi executado. Eu posso verificar no histórico do trabalho do Agendador de Tarefas. No entanto, a unidade S: não pode ser mapeada. Se eu apenas executar o morcego na linha de comando. Funciona bem. Parece que eu tenho que fazer logon na caixa para fazer a unidade mapeada. Não tem certeza se é possível deixar o Windows executar o trabalho como sistema local quando ele é reinicializado para disponibilizar a unidade?
No meu caso, a unidade de rede está em uma caixa Unix.
Como mencionei acima, tenho alguns outros trabalhos agendados de dependência no sistema local do Windows. Portanto, tenho que disponibilizar o espaço de rede sem nenhum logon de usuário.
As unidades mapeadas só estão disponíveis para uma sessão interativa. Você não pode mapear uma unidade durante a execução como um serviço, você precisa usar caminhos UNC.
Eu enfrentei um problema semelhante. Quando eu estava tentando agendar uma tarefa e procurar o script como ação, a unidade mapeada não estava sendo exibida. Eu remapeei a unidade na janela que abriu enquanto navega no arquivo no sistema de arquivos. Depois disso, funcionou bem para mim.
Passos que segui:
Abra o Agendador de Tarefas
Crie uma nova tarefa com todos os detalhes, gatilhos, etc. necessários.
Ir para ações - > Selecione a ação na lista suspensa - > Clique em "Browse"
(Isso abriu a janela de navegação)
Clique com o botão direito em Computador - > Mapear unidades de rede - > Mapeie a unidade necessária
Anexe o arquivo ao trabalho
Concluído
Felicidades !!
Você está preso em um dilema ... o agendador está executando seu arquivo bat em "modo de administrador", o que não afeta realmente o ambiente de modo de usuário. Eu sei que isso soa estranho, mas meus próprios testes mostram que pode ser também dois ambientes de usuário separados. Você pode querer tentar executar um & vbs script sujo na pasta de inicialização do perfil do usuário ... e veja se isso faz o que você quer.
set WshShell = WScript.CreateObject("WScript.Shell")
Set objNetwork = CreateObject("WScript.Network")
do while true
objNetwork.MapNetworkDrive "S:", "\netdrive1\space1", false, "oneUser", "pwd"
WScript.Sleep(12000)
loop
Se a unidade não for desmapeada ... isso gerará um erro no próximo loop quando tentar mapear a unidade ... a menos que você detecte o erro ... ou faça um & sujo
On Error Resume Next
antes do loop.
Você pode ajustar o tempo de espera conforme necessário ... ou fazer um mecanismo de verificação de data / hora mais avançado ... mas isso deve lhe dar a ideia.
net use S: \netdrive1\space1 pwd /user:oneUser /persistent:yes
Isso pode acabar com a necessidade da tarefa agendada, mas não tenho certeza se ela manterá a conexão sem o logon do usuário.
Os caminhos UNC em sua aplicação são uma maneira muito melhor do que mapear a unidade, então, se possível, você deve fazer isso.
EDITAR
Isso não é muito elegante, mas pode funcionar (completamente não testado)
NET USE \netdrive1\space1 /USER:oneUser pwd && PUSHD \netdrive1\space1
COPY C:\path\to\files\*.dat Z:\
POPD && NET USE \netdrive1\space1 /DELETE
Tente isso como seu arquivo em lotes. O que está acontecendo é que o NET USE autentica o usuário contra o compartilhamento, o PUSHD monta automaticamente a unidade em uma letra de unidade (na ordem inversa, portanto, assumindo que nenhuma outra unidade esteja montada, o que não é neste caso, será Z :). Copie os arquivos e mate a conexão ao compartilhamento. Não tenho ideia se isso funcionará sem uma sessão de login interativa, mas vale a pena tentar.
Já pensou em usar um caminho UNC em vez de tentar mapear uma letra de unidade? Em 98% dos casos, usando \\ server \ share \ onde quer que você encontre um s: não causa problemas.
Consegui executar minha tarefa agendada como meu usuário desejado e use apenas NET USE Q: \192.168.7.1\space
como a primeira linha do script em lote que foi executado.
Infelizmente, não tive a opção de usar os caminhos UNC diretamente, devido à maneira como as bibliotecas de terceiros tratavam os caminhos UNC.