Un script que abre la ventana de la VPN y luego duerme diez segundos está adivinando, y la conjetura falla en ambas direcciones: empieza a copiar antes de que el túnel sea utilizable o espera cuando el trabajo ya podría haber comenzado. Ninguno de los dos resultados dice si la autenticación terminó. Use el resultado propio del comando y después haga al servicio una pregunta que de verdad pueda responder. El orden de esos dos pasos es todo el diseño.

Qué informa realmente el comando

Para un perfil nativo de Windows que la herramienta de línea de comandos instalada entiende, rasdial.exe marca una entrada con nombre y devuelve un código de salida del proceso. Ese código describe el intento de marcado: cero significa que la conexión se estableció para ese perfil, y distinto de cero que falló en una etapa que el código identifica. Léalo como el resultado de una capa, no del trabajo.

El resultado no dice nada sobre la asignación de dirección, el DNS privado, las rutas añadidas ni el permiso para llegar a un servidor concreto. Todo eso ocurre después de un marcado correcto, y cualquiera de esos elementos todavía puede estar mal. Esa brecha es la razón por la que un icono de conectado y una copia fallida coexisten tan a menudo.

Guarde el resultado antes de que se ejecute nada más

Empiece confirmando que el perfil existe para la cuenta que ejecutará el trabajo, no solo para la cuenta con la que prueba:

Get-VpnConnection -Name "Contoso-Office"
Get-VpnConnection -Name "Contoso-Office" -AllUserConnection

Luego marque y lea el código de inmediato. PowerShell conserva el resultado nativo en $LASTEXITCODE solo hasta que se ejecute el siguiente comando externo, así que un ping perdido entre el marcado y la comprobación destruye el valor que pretendía leer. Asígnelo primero a su propia variable y después decida qué hacer.

& rasdial.exe "Contoso-Office"
$dial = $LASTEXITCODE
if ($dial -ne 0) { throw "rasdial failed with $dial" }

Registre el código junto con el texto de error no secreto, porque una entrada ausente, unas credenciales rechazadas y un tiempo de espera agotado necesitan respuestas distintas. La tabla relaciona los resultados habituales con el paso siguiente.

ResultWhat it indicatesNext step
0The dial completedProbe the resource, do not start writing yet
691The credential or authentication method was rejectedFix the account or method, do not retry in a loop
623The named entry was not foundFix the profile name or its scope
Other non-zeroTransport, timeout or adapter failureRead the message, then check the path

La preparación es el recurso, no el túnel

Cuando el marcado funcione, pruebe lo que el trabajo necesita. Un recurso compartido, un extremo de API o un puerto de base de datos es una prueba de disponibilidad mejor que un sitio web público, porque un sitio público responde por cualquier ruta que funcione y no demuestra nada sobre la privada. Elija la prueba de la que depende la propia aplicación. Una conexión TCP correcta le dice que el enrutamiento y el filtrado están abiertos, y eso es la mayor parte de lo que necesita la primera escritura:

Test-NetConnection -ComputerName files.contoso.example -Port 445

Limite los intentos y registre qué etapa falló. Unas credenciales rechazadas deberían detener el script en lugar de alimentar un bucle de reintentos; un nombre DNS que aún no ha aparecido merece unos cuantos reintentos cortos; un puerto que nunca se abre es un problema de enrutamiento o de política por encima del cliente.

Cuando la conexión ya existía antes de que empezara el trabajo, déjela en paz. Desconectar una sesión que no abrió interrumpe el otro trabajo del usuario, así que registre a quién pertenece la sesión y qué cierre es adecuado.

Limite el perfil a la cuenta que ejecuta el trabajo

Una tarea programada se ejecuta con su propia identidad y sesión, y un perfil que funciona en su escritorio puede ser invisible allí. Repita la comprobación de visibilidad y el marcado con la cuenta de la tarea antes de confiar en la programación. Mantenga también la contraseña fuera de la línea de comandos: los argumentos son visibles para otros procesos y a menudo acaban en los registros.

Si el despliegue requiere un aviso del navegador, un toque de tarjeta inteligente o una aprobación de MFA, esa interacción forma parte del diseño y no puede automatizarse simulando pulsaciones. Use el cliente compatible para ese caso y deje que ocurra el paso humano.

La forma del script final sigue siendo corta: compruebe el perfil, marque, lea el código, pruebe el recurso y luego empiece el trabajo. Cada paso responde una pregunta que el anterior no podía, y ninguno depende de dormir.

Artículos relacionados