Netzlaufwerk, bevor die VPN bereit ist? Machen Sie es vom Server abhängig
Ein Anmeldeskript verbindet die Freigabe, bevor der Tunnel eine Route hat. Prüfen Sie einen Server, der nur über ihn antwortet, verbinden Sie dann in der Benutzersitzung und protokollieren Sie das Ergebnis.
Der Laufwerksbuchstabe erscheint bei der Anmeldung und öffnet sich dann als leerer Ordner oder mit einem roten Kreuz und einer Meldung über eine nicht verfügbare Netzwerkressource. Die Berechtigungen sind meist in Ordnung. Passiert ist Folgendes: Der Befehl zum Verbinden lief in dem Zeitfenster, in dem der VPN-Client existierte, aber keine Route zum Dateiserver, und Windows hat diesen Fehler als Zustand des Laufwerks gespeichert. Die Lösung besteht darin, das Verbinden nicht mehr als etwas zu behandeln, das bei der Anmeldung passiert, sondern als letzten Schritt einer Verbindungssequenz.
Warum das Verbinden zu früh läuft
Ein Anmeldeskript startet, wenn die Sitzung startet. Ein VPN-Client, der sich während der Anmeldung verbindet, legt seine eigene Zeitachse darüber: Der Prozess kann laufen, der virtuelle Adapter kann existieren, und die Route zum Büro-Subnetz kann noch fehlen. Diese drei Zustände sehen aus Sicht eines Skripts gleich aus, und nur einer davon funktioniert.
Manche Umgebungen reagieren, indem sie bei jeder Anmeldung dieselbe fehlschlagende Zeile wiederholen, was einen Benutzer erzeugt, der gelernt hat, das Laufwerk zweimal anzuklicken, und ein Skript, das nie von allein erfolgreich war.
Das Laufwerk selbst verschlimmert es. Ein verbundenes Laufwerk ist ein Sitzungsobjekt, und sobald Windows es als nicht verfügbar markiert hat, kann das Symbol noch lange kaputt bleiben, nachdem der Tunnel gesund ist. Deshalb funktioniert das manuelle erneute Verbinden, während das Skript nichts zu tun scheint. Die Sitzung erinnert sich an den Fehler, nicht an die Absicht dahinter.
Ein verbundener Status ist kein Pfad
Das VPN-Symbol im Infobereich meldet, ob der Tunnel steht. Es sagt nichts darüber aus, ob eine Route zu einem bestimmten Server existiert, ob DNS diesen Namen in die Tunneladresse auflöst, oder ob die Firewall des Servers selbst Sie durchlässt.
Das sind drei getrennte Fehler mit demselben sichtbaren Ergebnis, und wer das Symbol im Infobereich zur Bedingung macht, verschmilzt sie zu einem unzuverlässigen Signal.
Eine Bereitschaftsprüfung, die den Server nennt, den Sie wirklich brauchen unterscheidet sie, weil sie fehlschlägt, bis der konkrete Pfad funktioniert, und nicht, bis irgendeine Schnittstelle sich als verbunden meldet.
Bedingung ist der Server, nicht der Client
Wählen Sie einen Host, der nur über den Tunnel erreichbar ist, und warten Sie darauf, bevor Sie irgendetwas verbinden. Der folgende Ausschnitt verbindet einen gespeicherten Windows-VPN-Eintrag, prüft den Dateiserver und verbindet dann das Laufwerk.
@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
Das Ping ist eine Bereitschaftsprüfung, kein Berechtigungstest. Wenn ICMP in Ihrem Netz gefiltert wird, prüfen Sie stattdessen den Dienst, den Sie tatsächlich nutzen: net view \\%server% für eine schnelle Kontrolle oder einen kurzen TCP-Test gegen Port 445 in PowerShell. Beides macht das Wesentliche zur Bedingung.
Fügen Sie eine begrenzte Anzahl von Versuchen hinzu. Eine Warteschleife ohne Obergrenze macht aus einem kaputten Tunnel eine Sitzung, die die Anmeldung nie abschließt, und das ist ein schlimmerer Supportanruf als ein fehlender Laufwerksbuchstabe.
Machen Sie es wiederholbar und sitzungsbewusst
Führen Sie es innerhalb der Sitzung des Benutzers aus. Eine Aufgabe, die als SYSTEM läuft, legt das Laufwerk in eine völlig andere Sitzung, und der angemeldete Benutzer sieht das Ergebnis nie. Das ergibt ein Skript, das Erfolg meldet, und einen Desktop ohne Laufwerk.
Prüfen Sie vor dem Verbinden und entfernen Sie nur den veralteten Eintrag. net use Z: /delete gibt einen Fehler zurück, wenn der Buchstabe nicht verwendet wird, und dieser Fehler lässt sich gefahrlos ignorieren, statt ein Grund zu sein, den Rest des Skripts aufzugeben. Behalten Sie /persistent:no bei, damit ein fehlgeschlagener Versuch später nicht zu einem dauerhaften Wiederverbindungsversuch wird.
Und legen Sie kein Kennwort in die Datei. rasdial kann die für den VPN-Eintrag gespeicherten Anmeldeinformationen wiederverwenden, und die Freigabe sollte sich als der angemeldete Benutzer authentifizieren. Wenn die Freigabe wirklich andere Anmeldeinformationen braucht, registrieren Sie sie einmal pro Benutzer mit cmdkey, statt sie in eine Batchdatei einzubetten, die auf einer Anmeldefreigabe liegt. Wer diese Freigabe lesen kann, kann das Kennwort lesen, und das macht aus einer Bequemlichkeit einen Vorfall.
Das ganze Skript erneut auszuführen sollte harmlos sein, denn genau das wird passieren. Benutzer verbinden sich neu, Laptops wachen auf, und derselbe Codepfad läuft erneut mit einem anderen Ausgangszustand.
Protokollieren Sie genug, um zu beweisen, welche Hälfte zu spät war
Schreiben Sie den Zeitstempel, das Bereitschaftsergebnis und den Exitcode des Verbindens in eine Datei unter dem Benutzerprofil. Wenn die nächste Meldung über ein fehlendes Laufwerk kommt, beantwortet dieses Protokoll die einzige wichtige Frage: Kam der Tunnel zu spät, oder hat die Freigabe abgelehnt?
Ohne das wird jeder erneute Fall von vorn untersucht, und die übliche Schlussfolgerung ist eine Berechtigungsänderung, die nichts repariert.
Testen Sie die Sequenz einmal nach einem Kaltstart und einmal aus dem Ruhezustand. Der Aufwachfall ist der, in dem die Reihenfolge am häufigsten bricht, weil die Sitzung vor dem Netzwerk fortgesetzt wird und das Skript einen Rechner sieht, der seit Stunden angemeldet ist.