Буква диска появляется при входе, а затем открывается как пустая папка или с красным крестом и сообщением о недоступном сетевом ресурсе. Права обычно в порядке. Произошло то, что команда подключения выполнилась в тот промежуток, когда клиент 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-файл, который лежит на общем ресурсе входа. Любой, кто может прочитать этот ресурс, может прочитать и пароль, а это превращает удобство в инцидент.

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

Записывайте достаточно, чтобы доказать, какая половина опоздала

Запишите отметку времени, результат проверки готовности и код выхода подключения в файл в профиле пользователя. Когда придёт следующее сообщение об отсутствующем диске, этот журнал ответит на единственный важный вопрос: туннель пришёл поздно или ресурс отказал?

Без него каждое повторение исследуется с нуля, и обычный вывод — изменение прав, которое ничего не исправляет.

Проверьте последовательность один раз после холодной загрузки и один раз после сна. Случай пробуждения — это место, где порядок ломается чаще всего, потому что сеанс возобновляется раньше сети, и скрипт видит машину, вошедшую в систему несколько часов назад.

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