rasdial сообщает «подключено». Когда сеть действительно готова?
Код выхода 0 означает, что подключение завершилось, а не что файловая папка отвечает. Захватите собственный результат, затем проверьте ресурс, от которого зависит задача.
Сценарий, который открывает окно VPN и затем спит десять секунд, угадывает, и угадывает неверно в обе стороны: он начинает копирование до того, как туннель пригоден, или ждёт после того, как работа уже могла начаться. Ни один из исходов не говорит, завершилась ли аутентификация. Используйте результат самой команды, а затем задайте службе вопрос, на который она действительно может ответить. Порядок этих двух шагов и есть весь замысел.
Что на самом деле сообщает команда
Для собственного профиля Windows, который понимает установленная программа командной строки, rasdial.exe набирает именованную запись и возвращает код выхода процесса. Этот код описывает попытку подключения: ноль означает, что соединение для этого профиля установлено, а ненулевое значение — что оно не удалось на этапе, который код определяет. Читайте его как результат одного уровня, а не всей задачи.
Результат ничего не говорит о назначении адреса, частном DNS, добавленных маршрутах или о разрешении достучаться до конкретного сервера. Всё это происходит после успешного подключения, и любое из этого всё ещё может быть неверным. Именно из-за этого разрыва значок подключения и неудачное копирование так часто соседствуют.
Захватите результат до того, как запустится что-либо ещё
Начните с подтверждения, что профиль существует для учётной записи, которая будет выполнять задачу, а не только для той, с которой вы тестируете:
Get-VpnConnection -Name "Contoso-Office"
Get-VpnConnection -Name "Contoso-Office" -AllUserConnection
Затем подключитесь и сразу прочитайте код. PowerShell хранит собственный результат в $LASTEXITCODE только до запуска следующей внешней команды, поэтому случайный ping между подключением и проверкой уничтожает значение, которое вы собирались прочитать. Сначала присвойте его собственной переменной, а затем решайте, что делать.
& rasdial.exe "Contoso-Office"
$dial = $LASTEXITCODE
if ($dial -ne 0) { throw "rasdial failed with $dial" }
Записывайте код вместе с несекретным текстом ошибки, потому что отсутствующая запись, отклонённые учётные данные и тайм-аут требуют разных реакций. Таблица связывает типичные результаты со следующим действием.
| 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 |
Готовность — это ресурс, а не туннель
Как только подключение удалось, проверьте то, что нужно задаче. Сетевая папка, конечная точка API или порт базы данных — лучшая проверка готовности, чем публичный сайт, потому что публичный сайт отвечает через любой работающий путь и ничего не доказывает о частном. Выберите ту проверку, от которой зависит само приложение. Успешное TCP-соединение говорит, что маршрутизация и фильтрация открыты, а это большая часть того, что нужно первой записи:
Test-NetConnection -ComputerName files.contoso.example -Port 445
Ограничьте число попыток и зафиксируйте, на каком этапе произошёл сбой. Отклонённые учётные данные должны останавливать сценарий, а не кормить цикл повторов; имя DNS, которое ещё не появилось, заслуживает нескольких коротких повторов; порт, который никогда не открывается, — это проблема маршрутизации или политики выше клиента.
Там, где соединение уже существовало до начала задачи, не трогайте его. Отключение сеанса, который вы не открывали, прерывает другую работу пользователя, поэтому запишите, кому принадлежит сеанс и какое завершение уместно.
Ограничьте профиль учётной записью, которая выполняет задачу
Запланированная задача выполняется под собственным удостоверением и сеансом, и профиль, который работает на вашем рабочем столе, может быть там невидим. Повторно выполните проверку видимости и подключение под учётной записью задачи, прежде чем доверять расписанию. Держите пароль подальше от командной строки: аргументы видны другим процессам и часто попадают в журналы.
Если развёртывание требует запроса в браузере, прикосновения к смарт-карте или подтверждения MFA, это взаимодействие — часть замысла, и его нельзя автоматизировать, имитируя нажатия клавиш. Для такого случая используйте поддерживаемый клиент и дайте человеческому шагу произойти.
Форма итогового сценария остаётся короткой: проверьте профиль, подключитесь, прочитайте код, проверьте ресурс, затем начинайте работу. Каждый шаг отвечает на вопрос, на который не мог ответить предыдущий, и ни один из них не полагается на паузу.