Сценарій, який відкриває вікно 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" }

Записуйте код разом із несекретним текстом помилки, бо відсутній запис, відхилені облікові дані та тайм-аут потребують різних реакцій. Таблиця пов'язує типові результати з наступною дією.

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

Готовність — це ресурс, а не тунель

Щойно підключення вдалося, перевірте те, що потрібно роботі. Мережева тека, кінцева точка API або порт бази даних — краща перевірка готовності, ніж публічний сайт, бо публічний сайт відповідає через будь-який робочий шлях і нічого не доводить про приватний. Виберіть ту перевірку, від якої залежить сама програма. Успішне TCP-з'єднання каже, що маршрутизація й фільтрування відкриті, а це більша частина того, що потрібно першому запису:

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

Обмежте кількість спроб і зафіксуйте, на якому етапі стався збій. Відхилені облікові дані мають зупиняти сценарій, а не живити цикл повторів; ім'я DNS, яке ще не з'явилося, заслуговує на кілька коротких повторів; порт, який ніколи не відкривається, — це проблема маршрутизації або політики вище клієнта.

Там, де з'єднання вже існувало до початку роботи, не чіпайте його. Від'єднання сеансу, який ви не відкривали, перериває іншу роботу користувача, тому запишіть, кому належить сеанс і яке завершення доречне.

Обмежте профіль обліковим записом, який виконує роботу

Заплановане завдання виконується під власним удостовірженням і сеансом, і профіль, що працює на вашому робочому столі, може бути там невидимим. Повторно виконайте перевірку видимості й підключення під обліковим записом завдання, перш ніж довіряти розкладу. Тримайте пароль подалі від командного рядка: аргументи видно іншим процесам, і вони часто потрапляють у журнали.

Якщо розгортання потребує запиту в браузері, дотику до смарт-картки або підтвердження MFA, ця взаємодія є частиною задуму, і її не можна автоматизувати, імітуючи натискання клавіш. Для такого випадку використайте підтримуваний клієнт і дайте людському кроку відбутися.

Форма підсумкового сценарію залишається короткою: перевірте профіль, підключіться, прочитайте код, перевірте ресурс, а потім починайте роботу. Кожен крок відповідає на запитання, на яке не міг відповісти попередній, і жоден із них не покладається на паузу.

Схожі статті