Windows 10 VPN automatisch wieder neu verbinden

In Zeiten von Corona wird das Home-Office immer wichtiger. Virtual Private Networks (VPN) ermöglichen den Zugriff auf Firmen-Ressourcen. Der in Windows 10 eingebaute VPN Clients für PPTP, L2TP/IPSec, SSTP oder IKEv2 baut VPNs nicht wieder automatisch auf, wenn die Verbindung zusammenbricht. Ein Verbindungsabriss kann z.B. durch ein Netzwerkwechsel oder Internet-Netzwerkfehler auftreten.

Im Alltag eines Heimarbeiters und Road Warriors führt der Verbindungsabriss eines VPN zu hektischer Betriebsamkeit, da Remotedesktop Clients erst hängen und sich dann neu Verbinden wollen, der Datei-Explorer bleibt stecken und dann verzweifelt versucht den Ordnerinhalt einer Server-Freigabe mit Sanduhr anzuzeigen. Mit schnellem Klicken versucht der erfahrene Poweruser das VPN wiederaufzubauen, bevor sich die Anwendungen mit einer Timeout-Fehlermeldung verabschieden und alles neu geöffnet werden muss. Dies klappt jedoch nicht immer…

Hier hat Microsoft einfach die Funktion für das automatische Neu-Verbinden von VPN Verbindungen vergessen. Wahrscheinlich gibt es immer irgendwo ein Kontrollkästchen, dass einem irgendwann irgendwo händeringend fehlt…

Einrichtung einer VPN Verbindung

Um eine VPN Verbindung automatisch aufzubauen, müssen Benutzername und Kennwort gespeichert sein. Dies wird bereits bei der Einrichtung angegeben:

VPN Einrichten
Verbindung mit einem Arbeitsplatz herstellen

Mit der Option „Anmeldedaten speichern“ werden Benutzername und Kennwort nach dem ersten erfolgreichen Aufbau des VPNs gespeichert.

Neu-Verbindung über die Aufgabenplanung

Die Funktion zum automatischen VPN Aufbau nach einer Trennung kann dann mit Bordmitteln nachgerüstet werden. Die Ausgangsbasis sind Ereignisprotokolle, in denen folgende Ereignisse auftreten:

Ereignis-IDQuelleBeschreibung
20226RasClientROUTERLOG_CORR_ID = Der Benutzer %1 () hat eine Verbindung mit dem Namen %2 () gewählt, die Verbindung wurde jedoch getrennt. Der
10000NetworkProfileNetzwerkverbindung hergestellt

Das Ereignis 2226 tritt auf, wenn die VPN Verbindung beendet wurde. In diesem Fall wird sofort versucht, diese wiederaufzubauen. Falls dies scheitert, weil keine Netzwerkverbindung verfügbar ist, so greifen die Ereignisse 10000 und 8001, die auftreten, wenn eine kabelgebundene oder eine WiFi-Verbindung hergestellt wurde.

Die so konfigurierte Aufgabe kann als „My Connection (VPN) Redial.xml“ im XML-Format importiert und unter dem angemeldeten Benutzerkonto ausgeführt werden:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2020-04-11T09:32:43.9830717</Date>
    <Author>LOGICLINK\marcus</Author>
    <URI>\My Connection (VPN) Redial</URI>
  </RegistrationInfo>
  <Triggers>
    <EventTrigger>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Application"&gt;&lt;Select Path="Application"&gt;*[System[Provider[@Name='RasClient'] and EventID=20226]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
    </EventTrigger>
    <EventTrigger>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Microsoft-Windows-NetworkProfile/Operational"&gt;&lt;Select Path="Microsoft-Windows-NetworkProfile/Operational"&gt;*[System[Provider[@Name='NetworkProfile'] and EventID=10000]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
    </EventTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>false</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
    <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>%SystemRoot%\System32\rasdial.exe</Command>
      <Arguments>"My Connection (VPN)"</Arguments>
    </Exec>
  </Actions>
</Task>

In Zeile 48 muss der Name der VPN Verbindung angepasst werden. Die Verbindung sollte vor der ersten Benutzung einmal manuell mit Benutzer und Kennwort hergestellt werden, damit die Zugangsdaten hier nicht als Parameter für rasdial.exe in der Aufgabe angegeben werden müssen.

Darüber hinaus sollte die Aufgabe standardmäßig deaktiviert sein und nur aktiviert werden, wenn das VPN auch gebraucht wird, damit dieses nicht unnötig Bandbreite frisst.

Aktivierung und Aufbau der VPN-Verbindung

Die Aktivierung und Deaktivierung übernehmen dazu zwei Batch-Programme.

In der Batch-Datei „Enable My Connection (VPN).cmd“ wird die Aufgabe für das automatische Neu-Verbinden aktiviert und dann die VPN Verbindung hergestellt:

@echo off

:: REMARKS: Don't use double quotes for the VPN name as they have to be escaped by back slashes for runas
set VPN=My Connection (VPN)
set TASK="My Connection (VPN) Redial"

:: Check for administrative rights
net session >nul 2>&1
if NOT %errorLevel% == 0 (
	echo Current permissions insufficient. Run script as administrator.
	pause
	exit 1
)

schtasks /Change /TN %TASK% /ENABLE
runas /trustlevel:0x20000 "rasdial.exe \"%VPN%\""

Die beiden Variablen „VPN“ und „TASK“ in Zeile 4 und 5 identifizieren die VPN-Verbindung und die Aufgabe in der Aufgabenplanung und müssen entsprechend angepasst werden. Mit diesen Variablen ist es auch möglich mehrere VPNs mit unterschiedlichen Batch-Dateien zu konfigurieren.

Im nächsten Schritt wird geprüft, ob die Batch-Datei mit administrativen Rechten gestartet wurde. Die Administratorrechte sind für die Aktivierung von Aufgaben in der Aufgabenplanung erforderlich. Falls die Batch-Datei nicht „als Administrator“ ausgeführt wurde, so wird eine Fehlermeldung angezeigt und die Batch-Datei beendet.

Der nächste Schritt besteht in der Aktvierung der Aufgabe „TASK“ in der Aufgabenplanung. Um die VPN-Verbindung mit den gespeicherten Zugangsdaten wiederherzustellen, müssen die administrativen Rechte zurückgegeben werden. Daher wird rasdial.exe über runas.exe mit Standardbenutzerrechten aufgerufen.

Abbau und Deaktivierung der VPN-Verbindung

Die Deaktivierung erfolgt in der Batch-Datei „Disable My Connection (VPN).cmd“ mit den gleichen Befehlen rückwärts:

@echo off

:: REMARKS: Don't use double quotes for the VPN name as they have to be escaped by back slashes for runas
set VPN=My Connection (VPN)
set TASK="My Connection (VPN) Redial"

:: Check for administrative rights
net session >nul 2>&1
if NOT %errorLevel% == 0 (
	echo Current permissions insufficient. Run script as administrator.
	pause
	exit 1
)

schtasks /Change /TN %TASK% /DISABLE
rasdial "%VPN%" /DISCONNECT

Die beiden Variablen „VPN“ und „TASK“ in Zeile 4 und 5 müssen hier ebenfalls angepasst werden. Beim Abbau der VPN-Verbindung stören die administrativen Rechte nicht und rasdial.exe kann direkt aufgerufen werden.

Downloads

Sie können alle Batch-Dateien und die XML-Datei für die Aufgabenplanung auch als Zip-Archiv hier herunterladen:

VPNRedial.zip2,2 KBAlle Batch-Dateien und Aufgaben-XML-Definition

Weitere Informationen