Від'єднайте один профіль OpenVPN GUI, а не всі тунелі
Тунель під керуванням GUI потребує команди GUI, а тунель під керуванням служби — керування службою. Визначте, яка програма володіє профілем, перш ніж писати скрипт.
Скрипт від'єднання зазвичай зазнає невдачі з однієї причини: він звертається не до того власника. Тунель під керуванням спільнотного OpenVPN GUI належить сеансу цього GUI, тунель, запущений службою Windows, належить службі, а OpenVPN Connect не належить жодному з них. Пройдіть ці перевірки по порядку й зупиніться, коли власник неясний. Надсилання команди kill через неоднозначного власника — це саме той шлях, на якому від'єднання одного профілю перетворюється на простій усієї площадки.
Для з'єднання під керуванням GUI корисна команда — це повідомлення GUI, а не сигнал openvpn.exe.
Спершу визначте власника
Погляньте, яка програма насправді показує під'єднаний стан, перш ніж щось писати. Значок у системному лотку означає, що ним володіє сеанс GUI. Запис служби означає, що ним володіє служба. Окреме вікно програми з власним списком профілів не означає жодного з них, і до нього застосовується його власний інтерфейс, специфічний для версії.
Перевірте також обліковий запис і сеанс робочого столу. Заплановане завдання, яке виконується від імені іншого користувача або в неінтерактивному сеансі, не слід вважати таким, що керує GUI, який бачить людина, що ввійшла. Ця розбіжність дає команду, яка завершується чисто й нічого не змінює, а це найдорожчий тип відмови для пошуку за журналом.
Потім надішліть власне від'єднання власника
Якщо GUI встановлено за шляхом із прикладу і є профіль з назвою office, уся команда — це один рядок:
"C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --command disconnect officeЗамініть його своїм реальним шляхом встановлення та точною назвою конфігурації, включно з регістром, як його показує GUI. Документація команд проєкту перелічує підтримувані елементи керування GUI, і цей приклад належить лише OpenVPN GUI — це не команда для кожної програми зі словом OpenVPN у назві.
Для тунелю, яким володіє служба, правильний елемент керування — служба, а не виконуваний файл GUI. Огляньте встановлену службу та профілі, якими вона керує, перш ніж щось зупиняти, бо зупинка може обвалити кілька тунелів одразу, а результату за кожним профілем ви не отримаєте.
Переконайтеся, що більше нічого не падає
GUI документує також команду disconnect_all, і саме її обсяг є причиною, чому вона є неправильним інструментом для скрипта, який має зупинити лише office. Якщо вас спокушає використати її заради простоти, запитайте, що ще під'єднано на цій машині та як користувач це помітить.
taskkill /F /IM openvpn.exe гірша у двох відношеннях. Вона вибирає процеси за назвою виконуваного файлу й примусово завершує їх, тому не виражає ні назви профілю, ні звичайної послідовності від'єднання власника. Називати це охайним завершенням — ховати обидві проблеми за одним кодом виходу.
Який би шлях ви не обрали, перевірте масштаб наслідків до зміни: перелічіть під'єднані профілі, занотуйте, які мають вижити, і перевірте їх знову після.
Підтверджуйте стан, а не код виходу
Попросивши від'єднання, читайте стан названого з'єднання через його власника, а не покладайтеся на значення, яке повертає команда. Якщо наступний крок потребує мережі після розбирання, дочекайтеся цієї зміни стану з явним тайм-аутом, замість припускати, що очищення завершилося, коли процес повернувся. Скрипт, який квапиться поперед розбирання, зрідка зазнаватиме невдачі, і провину покладуть на VPN.
Якщо стан ніколи не змінюється, власник, найімовірніше, не той, до кого ви звернулися. Перевірте ще раз сеанс і обліковий запис, перш ніж переходити до сильнішої команди.
Що записати в журнал
Записуйте назву профілю, власника, до якого ви звернулися, контекст запуску й отриманий стан. Не виливайте повну конфігурацію чи облікові дані в журнал завдання і не записуйте командний рядок, якщо він містить шлях до файлу з секретами.
Повідомлення про помилку, у якому названо профіль і контекст, достатньо, щоб наступна людина відтворила проблему. Журнал, у якому записано лише загальний код виходу, повертає їх на початок, і саме там здогади починаються знову.