Mapować dysk, zanim VPN będzie gotowy? Uzależnij to od serwera
Skrypt logowania mapuje udział, zanim tunel ma trasę. Sprawdź jeden serwer, który odpowiada tylko przez niego, następnie zamapuj w sesji użytkownika i zapisz wynik.
Litera dysku pojawia się przy logowaniu, a następnie otwiera się jako pusty folder lub z czerwonym krzyżykiem i komunikatem o niedostępnym zasobie sieciowym. Uprawnienia zwykle są w porządku. Stało się tak, że polecenie mapowania działało w oknie, w którym klient VPN istniał, ale nie było trasy do serwera plików, i Windows zapisał tę porażkę jako stan dysku. Rozwiązaniem jest przestać traktować mapowanie jako coś, co dzieje się przy logowaniu, i traktować je jako ostatni krok sekwencji połączenia.
Dlaczego mapowanie uruchamia się zbyt wcześnie
Skrypt logowania zaczyna się, gdy zaczyna się sesja. Klient VPN, który łączy się podczas logowania, dokłada swoją własną oś czasu: proces może działać, wirtualny adapter może istnieć, a trasa do podsieci biura może wciąż brakować. Te trzy stany wyglądają z punktu widzenia skryptu tak samo i tylko jeden z nich działa.
Niektóre środowiska reagują powtarzaniem tej samej nieudanej linii przy każdym logowaniu, co daje użytkownika, który nauczył się dwa razy klikać dysk, i skrypt, który nigdy nie odniósł sukcesu sam.
Sam dysk pogarsza sprawę. Zamapowany dysk jest obiektem sesji, a gdy Windows oznaczył go jako niedostępny, ikona może pozostać zepsuta długo po tym, jak tunel jest zdrowy. Dlatego ręczne ponowne mapowanie działa, podczas gdy skrypt wydaje się nic nie robić. Sesja pamięta porażkę, a nie intencję, która za nią stała.
Stan połączenia to nie trasa
Ikona VPN w zasobniku informuje, czy tunel jest podniesiony. Nie mówi nic o tym, czy istnieje trasa do konkretnego serwera, czy DNS rozwiązuje tę nazwę na adres tunelu, ani czy zapora samego serwera cię wpuszcza.
To trzy osobne awarie o tym samym widocznym wyniku, a uzależnienie od ikony w zasobniku scala je w jeden zawodny sygnał.
Kontrola gotowości, która nazywa serwer, którego naprawdę potrzebujesz odróżnia je, bo zawodzi, dopóki nie zadziała konkretna trasa, a nie dopóki jakiś interfejs zgłosi się jako połączony.
Uzależnij to od serwera, nie od klienta
Wybierz jeden host osiągalny tylko przez tunel i poczekaj na niego, zanim cokolwiek zamapujesz. Poniższy fragment łączy się z zapisanym wpisem VPN systemu Windows, sprawdza serwer plików, a następnie mapuje dysk.
@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 to próbka gotowości, a nie test uprawnień. Jeśli ICMP jest filtrowany w twojej sieci, sprawdź zamiast tego usługę, której naprawdę używasz: net view \\%server% do szybkiego sprawdzenia albo krótki test TCP na port 445 w PowerShellu. Oba uzależniają to, co ważne.
Dodaj ograniczoną liczbę prób. Pętla oczekiwania bez limitu zamienia zepsuty tunel w sesję, która nigdy nie kończy logowania, a to gorszy telefon do wsparcia niż brakująca litera dysku.
Uczyń go wielokrotnie uruchamialnym i świadomym sesji
Uruchamiaj go w sesji samego użytkownika. Zadanie działające jako SYSTEM umieszcza dysk w zupełnie innej sesji, a zalogowany użytkownik nigdy nie widzi wyniku. Tak otrzymujesz skrypt raportujący sukces i pulpit bez dysku.
Sprawdź przed mapowaniem i usuń tylko nieaktualny wpis. net use Z: /delete zwraca błąd, gdy litera nie jest używana, i ten błąd można bezpiecznie zignorować, a nie traktować jako powód do porzucenia reszty skryptu. Zachowaj /persistent:no, aby nieudana próba nie zamieniła się później w trwałą próbę ponownego połączenia.
I nie umieszczaj hasła w pliku. rasdial może ponownie użyć poświadczeń zapisanych dla wpisu VPN, a udział powinien uwierzytelniać się jako zalogowany użytkownik. Jeśli udział naprawdę wymaga innych poświadczeń, zarejestruj je raz na użytkownika za pomocą cmdkey, zamiast wbudowywać je w plik wsadowy, który leży na udziale logowania. Kto może czytać ten udział, może przeczytać hasło, a to zamienia wygodę w incydent.
Ponowne uruchomienie całego skryptu powinno być nieszkodliwe, bo dokładnie to się stanie. Użytkownicy łączą się ponownie, laptopy się budzą, a ta sama ścieżka kodu uruchamia się ponownie z innym stanem początkowym.
Zapisuj tyle, by udowodnić, która połowa się spóźniła
Zapisz znacznik czasu, wynik kontroli gotowości i kod wyjścia mapowania do pliku w profilu użytkownika. Gdy przyjdzie następne zgłoszenie o brakującym dysku, ten log odpowie na jedyne ważne pytanie: czy tunel przyszedł za późno, czy udział odmówił?
Bez tego każde powtórzenie jest badane od zera, a zwykłym wnioskiem jest zmiana uprawnień, która niczego nie naprawia.
Przetestuj sekwencję raz po zimnym starcie i raz po uśpieniu. Przypadek wybudzenia to miejsce, w którym kolejność psuje się najczęściej, bo sesja wznawia się przed siecią, a skrypt widzi maszynę zalogowaną od godzin.