Отключите один профиль 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.
Если состояние никогда не меняется, владелец, скорее всего, не тот, к кому вы обратились. Перепроверьте сеанс и учётную запись, прежде чем переходить к более сильной команде.
Что записать в журнал
Записывайте имя профиля, владельца, к которому вы обратились, контекст запуска и полученное состояние. Не выливайте полную конфигурацию или учётные данные в журнал задачи и не записывайте командную строку, если она содержит путь к файлу с секретами.
Сообщения об ошибке, в котором названы профиль и контекст, достаточно, чтобы следующий человек воспроизвёл проблему. Журнал, в котором записан только общий код возврата, отправляет их обратно в начало, и именно там догадки начинаются заново.