O rasdial diz «ligado». Quando está a rede realmente pronta?
O código de saída 0 significa que a marcação terminou, não que a partilha de ficheiros responde. Capture o resultado nativo e depois teste o recurso de que o trabalho depende.
Um script que abre a janela da VPN e depois dorme dez segundos está a adivinhar, e o palpite falha nos dois sentidos: começa a cópia antes de o túnel estar utilizável, ou espera depois de o trabalho já poder ter começado. Nenhum dos resultados lhe diz se a autenticação terminou. Use o resultado do próprio comando e depois faça ao serviço uma pergunta a que ele consiga realmente responder. A ordem destes dois passos é todo o desenho.
O que o comando relata de facto
Para um perfil nativo do Windows que a ferramenta de linha de comandos instalada compreende, rasdial.exe marca uma entrada com nome e devolve um código de saída do processo. Esse código descreve a tentativa de marcação: zero significa que a ligação foi estabelecida para esse perfil, e um valor diferente de zero significa que falhou numa fase que o código identifica. Leia-o como o resultado de uma camada, não do trabalho.
O resultado não diz nada sobre a atribuição de endereço, DNS privado, rotas adicionadas ou a permissão para chegar a um servidor específico. Tudo isso acontece depois de uma marcação bem-sucedida, e qualquer destes pontos pode continuar errado. É por causa dessa lacuna que um ícone ligado e uma cópia falhada coexistem tantas vezes.
Capture o resultado antes de qualquer outra coisa correr
Comece por confirmar que o perfil existe para a conta que vai executar o trabalho, não apenas para a conta com que está a testar:
Get-VpnConnection -Name "Contoso-Office"
Get-VpnConnection -Name "Contoso-Office" -AllUserConnection
Depois marque e leia o código imediatamente. O PowerShell guarda o resultado nativo em $LASTEXITCODE apenas até ao próximo comando externo, pelo que um ping perdido entre a marcação e a verificação destrói o valor que pretendia ler. Atribua-o primeiro à sua própria variável e só depois decida o que fazer.
& rasdial.exe "Contoso-Office"
$dial = $LASTEXITCODE
if ($dial -ne 0) { throw "rasdial failed with $dial" }
Registe o código com o texto de erro não secreto, porque uma entrada em falta, credenciais rejeitadas e um tempo limite exigem respostas diferentes. A tabela associa os resultados comuns à ação seguinte.
| Result | What it indicates | Next step |
|---|---|---|
| 0 | The dial completed | Probe the resource, do not start writing yet |
| 691 | The credential or authentication method was rejected | Fix the account or method, do not retry in a loop |
| 623 | The named entry was not found | Fix the profile name or its scope |
| Other non-zero | Transport, timeout or adapter failure | Read the message, then check the path |
A prontidão é o recurso, não o túnel
Assim que a marcação for bem-sucedida, teste aquilo de que o trabalho precisa. Uma partilha, um endpoint de API ou uma porta de base de dados são uma melhor prova de prontidão do que um site público, porque um site público responde por qualquer caminho que funcione e não prova nada sobre o privado. Escolha a prova de que a própria aplicação depende. Uma ligação TCP bem-sucedida diz-lhe que o encaminhamento e a filtragem estão abertos, e é disso que a primeira escrita mais precisa:
Test-NetConnection -ComputerName files.contoso.example -Port 445
Limite as tentativas e registe que fase falhou. Credenciais rejeitadas devem parar o script em vez de alimentar um ciclo de novas tentativas; um nome DNS que ainda não apareceu merece algumas tentativas curtas; uma porta que nunca abre é um problema de encaminhamento ou de política acima do cliente.
Onde a ligação já existia antes de o trabalho começar, deixe-a em paz. Desligar uma sessão que não abriu interrompe o outro trabalho do utilizador, por isso registe quem é o dono da sessão e que encerramento é adequado.
Limite o perfil à conta que executa o trabalho
Uma tarefa agendada é executada com a sua própria identidade e sessão, e um perfil que funciona no seu ambiente de trabalho pode estar invisível ali. Volte a executar a verificação de visibilidade e a marcação com a conta da tarefa antes de confiar no agendamento. Mantenha também a palavra-passe fora da linha de comandos: os argumentos são visíveis para outros processos e muitas vezes acabam nos registos.
Se a implementação exigir um pedido no navegador, um toque de cartão inteligente ou uma aprovação MFA, essa interação faz parte do desenho e não pode ser automatizada simulando teclas. Use o cliente suportado para esse caso e deixe acontecer o passo humano.
A forma do script final mantém-se curta: verifique o perfil, marque, leia o código, teste o recurso e só então comece o trabalho. Cada passo responde a uma pergunta que o anterior não conseguia, e nenhum deles depende de uma pausa.