Подключать диск до готовности VPN? Привяжите это к серверу
Скрипт входа подключает общий ресурс раньше, чем у туннеля появится маршрут. Проверьте один сервер, который отвечает только через него, затем подключите диск в сеансе пользователя и запишите результат.
Буква диска появляется при входе, а затем открывается как пустая папка или с красным крестом и сообщением о недоступном сетевом ресурсе. Права обычно в порядке. Произошло то, что команда подключения выполнилась в тот промежуток, когда клиент VPN существовал, но маршрута к файловому серверу не было, и Windows записал эту неудачу как состояние диска. Решение — перестать считать подключение чем-то, что происходит при входе, и рассматривать его как последний шаг последовательности соединения.
Почему подключение выполняется слишком рано
Скрипт входа запускается вместе с сеансом. Клиент VPN, который подключается во время входа, добавляет свою временную шкалу: процесс может работать, виртуальный адаптер может существовать, а маршрут к офисной подсети может всё ещё отсутствовать. Эти три состояния выглядят одинаково с точки зрения скрипта, и работает только одно из них.
Некоторые среды реагируют повторением одной и той же неудачной строки при каждом входе, что создаёт пользователя, научившегося дважды щёлкать диск, и скрипт, который ни разу не сработал сам.
Сам диск ухудшает ситуацию. Подключённый диск — это объект сеанса, и после того как Windows пометил его как недоступный, значок может оставаться сломанным ещё долго после того, как туннель стал здоровым. Поэтому повторное подключение вручную работает, а скрипт как будто ничего не делает. Сеанс помнит неудачу, а не намерение за ней.
Состояние «подключено» — это не путь
Значок VPN в области уведомлений сообщает, поднят ли туннель. Он ничего не говорит о том, существует ли маршрут к конкретному серверу, преобразует ли DNS это имя в адрес туннеля, или пропускает ли вас собственный брандмауэр сервера.
Это три отдельные неисправности с одинаковым видимым результатом, и привязка к значку в области уведомлений сливает их в один ненадёжный сигнал.
Проверка готовности, которая называет сервер, действительно необходимый вам отличает их, потому что она не проходит, пока не заработает конкретный путь, а не пока какой-нибудь интерфейс не объявит себя подключённым.
Привяжите к серверу, а не к клиенту
Выберите один узел, доступный только через туннель, и дождитесь его, прежде чем что-либо подключать. Фрагмент ниже подключается к сохранённой записи VPN Windows, проверяет файловый сервер и затем подключает диск.
@echo off
set server=fileserver.corp.example
rasdial "Office VPN" /disconnect
rasdial "Office VPN"
:wait
ping -n 1 -w 1000 %server% >nul || (
timeout /t 5 /nobreak >nul
goto wait
)
net use Z: \\%server%\share /persistent:no
Ping — это проба готовности, а не проверка прав. Если ICMP фильтруется в вашей сети, проверяйте вместо этого службу, которой действительно пользуетесь: net view \\%server% для быстрой проверки или короткий TCP-тест на порт 445 в PowerShell. Любой из них привязывает проверку к тому, что важно.
Добавьте ограниченное число попыток. Цикл ожидания без потолка превращает сломанный туннель в сеанс, который никогда не завершает вход, и это худший звонок в поддержку, чем отсутствующая буква диска.
Сделайте его повторно запускаемым и учитывающим сеанс
Запускайте его в сеансе самого пользователя. Задача, работающая как SYSTEM, помещает диск в совершенно другой сеанс, и вошедший пользователь никогда не видит результат. Так вы получаете скрипт, сообщающий об успехе, и рабочий стол без диска.
Проверяйте перед подключением и удаляйте только устаревшую запись. net use Z: /delete возвращает ошибку, когда буква не используется, и эту ошибку безопасно игнорировать, а не считать причиной бросить остаток скрипта. Сохраните /persistent:no, чтобы неудачная попытка позже не превратилась в постоянную попытку переподключения.
И не кладите пароль в файл. rasdial может повторно использовать учётные данные, сохранённые для записи VPN, а общий ресурс должен аутентифицироваться как вошедший пользователь. Если ресурсу действительно нужны другие учётные данные, зарегистрируйте их один раз на пользователя с помощью cmdkey вместо того, чтобы встраивать их в batch-файл, который лежит на общем ресурсе входа. Любой, кто может прочитать этот ресурс, может прочитать и пароль, а это превращает удобство в инцидент.
Повторный запуск всего скрипта должен быть безвредным, потому что именно это и произойдёт. Пользователи переподключаются, ноутбуки просыпаются, и тот же путь кода выполняется снова с другим начальным состоянием.
Записывайте достаточно, чтобы доказать, какая половина опоздала
Запишите отметку времени, результат проверки готовности и код выхода подключения в файл в профиле пользователя. Когда придёт следующее сообщение об отсутствующем диске, этот журнал ответит на единственный важный вопрос: туннель пришёл поздно или ресурс отказал?
Без него каждое повторение исследуется с нуля, и обычный вывод — изменение прав, которое ничего не исправляет.
Проверьте последовательность один раз после холодной загрузки и один раз после сна. Случай пробуждения — это место, где порядок ломается чаще всего, потому что сеанс возобновляется раньше сети, и скрипт видит машину, вошедшую в систему несколько часов назад.