Скрипт отключения обычно терпит неудачу по одной причине: он обращается не к тому владельцу. Туннель под управлением 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.

Если состояние никогда не меняется, владелец, скорее всего, не тот, к кому вы обратились. Перепроверьте сеанс и учётную запись, прежде чем переходить к более сильной команде.

Что записать в журнал

Записывайте имя профиля, владельца, к которому вы обратились, контекст запуска и полученное состояние. Не выливайте полную конфигурацию или учётные данные в журнал задачи и не записывайте командную строку, если она содержит путь к файлу с секретами.

Сообщения об ошибке, в котором названы профиль и контекст, достаточно, чтобы следующий человек воспроизвёл проблему. Журнал, в котором записан только общий код возврата, отправляет их обратно в начало, и именно там догадки начинаются заново.

Похожие статьи