Wenn durch einen VPN-Tunnel per Remotedesktopverbindung auf einen Server zugegriffen werden soll.

Voraussetzung:
Das Ausführen von VisualBasic-Script muss auf dem Client-PC erlaubt sein (Voreinstellung wenn nicht ein Virenscanner dazwischen funkt).
* Lancom-Router auf Empfänger/Serverseite
* Eine funtionsfähige VPN-Verbindung via Lancom Advanced VPN-Client sollte bestehen.
* Eine RDP-Sitzung sollte darüber laufen.

Das Script verwendet denLancom Advanced VPN-Clien
Damit nicht ein schwarzen Fenster während der Laufzeit der RDP-Sitzung bestehen bleibt wird ein Hilfsscript verwendet.

vpn_rdp.bat Batch-Datei um das Hilfsscript zu starten

cscript -nologo hidden_VBS.vbs


hidden_VBS.vbs Hilfsscript

Option Explicit
'*****************************************
' Script oder Programm augeblendet starten
'*****************************************

Dim oApp, oWSH, sApp, sPara, sScriptPath
Const cScriptName = "runRDPviaVPN.vbs"

Set oApp = CreateObject("Shell.Application")
Set oWSH = CreateObject("Wscript.shell")

'Das Programm bzw. Scriptinterpreter
sApp = "cscript.exe"
sScriptPath = Replace(WScript.ScriptFullName, WScript.ScriptName, vbNullString)

' Startparameter für die Anwendung oder Script-Datei
sPara = sScriptPath & cScriptName

' Programm / Script Ausführen mit Parametern, 0 => Ausführung versteckt (hidden) ohne auf das Beenden zu warten.
oApp.ShellExecute sApp, sPara, "", "", 0

Set oApp = Nothing
Set oWSH = Nothing


runRDPviaLancomAdvancedVPNClient.vbs Script um erst den VPN-Client dann die Remotedesktopverbindung starten

Option Explicit
' ************************************************************
' Das Script etabliert eine VPN-Verbindung zu einem LANCOM-Router via LANCOM Advanced VPN Client.
' Sobald die VPN-Verbindung zwischen dem lokalen PC und dem Router besteht wird im Anschluss eine 
' RDP-Verbindung zu einem Server/PC innerhalb des Netzwerkes des LANCOM-Routers aufgebaut.
' Funktionsweise des Scripts:
' 1. Prüfen ob der VPN-Client schon gestartet ist

' Verwendete Software
' Remote Desktop Protokoll (RDP)
' LANCOM Advanced VPN Client -> https://www.lancom-systems.de/produkte/router-vpn-gateways/lancom-advanced-vpn-client-windows/
' ************************************************************

' ************************************************************
' Persönliche Einstellungen 
' ************************************************************
' Datei-Name der RDP-Verbindungseinstellungen: Remotedesktopverbindung starten -> Optionen einblenden -> Verbindungseinstellungen speichern unter... aufrufen 
' In diesem Bsp. liegt die Datei auf dem Desktop des Benutzers und wurde remotedesktop genannt.
Const cRDP            =  "%HOMEDRIVE%%HOMEPATH%\desktop\remotedesktop.rdp"  

' Für den Verbindungsaufbau wird dieser Client-Monitor nicht benötigt. Kann also auch leer gelassen werden wenn die VPN-Verbindung korret funktioniert.
Const cAppAVPNC      = "ncpmon.exe" 'VPN Client 'ncpmon.exe

' Verbindungs-Profil-Name das gestartet werden soll.
' Wird hier nichts eingetragen muss ein Profil als Standard im VPN Client markiert sein. Konfiguration -> Profile
Const cVPN            = ""          

' Ist der Verbindungsaufbau des Profils auf "immer" im VPN Client eingestellt, muss eine Wartezeit für die Zeit des Verbindungsaufbaus eingetragen werden (~2-3 Sek.). Sonst 0
Const cWartezeit      = 0 'In Sekunden 
' ************************************************************

Dim oWsh, oApp, oFS, appAVPNC, appAVPNCCMD, appRDPP, argRDP
Dim sScriptPath, sTerminalServer, fAppAVPNC, sCMD, i, sTmp, sTmpfile
Const cAppAVPNCCMD = "ncpclientcmd.exe" 'VPN Client Commandline. 
Const cAppAVPNCPath = "\LANCOM\Advanced VPN Client\" 'VPN Client SubPath
Const cAppRDP    = "mstsc.exe" 'RemoteDesktop-Client

' ************************************************************
' Funktionen
' ************************************************************
'Funktion prüft ob eine Anwendung gestartet ist.
Function appInTask(sApp) '
  Dim oSel, oObj, fappRunning
  Set oSel = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("Select Name from Win32_Process Where Name = '" & sApp & "'", , 48)
  fappRunning = False
  For Each oObj In oSel	 	
	  fappRunning = True	  
  Next  
  Set oSel = Nothing
  appInTask = fappRunning
End Function

' Nachdem die VPN-Verbindung aufgebaut ist wird den RDP-Server (Terminalserver) angepingt ob dieser ereichbar ist
Function ping(j)
  Dim i, sTmp, sPing    
  'Zeigt die Anzahl der Zeilen an welche die Zeichenfolge " TTL=" enthalten
  sPing = "ping -n 1 " & sTerminalServer & " | find /c "" TTL=""" 
  On Error Resume Next   
  i = 0    
  Do  
    oWsh.run sCMD & sPing & " > " & sTmpfile, 0, True
    i = CInt(Trim(oFS.OpenTextFile(sTmpfile).ReadLine()))
    WScript.Sleep 1000
    j = j - 1
  Loop Until i > 0 or j <= 0  
  ping = (i > 0)
End Function  

Function wrap(s)
  If InStr(1, s, " ", vbTextCompare) Then s = """" & s & """"
  wrap = s 
End Function

Function GetInfoFromFile(sFile, sFind)
  Dim sTmp, oFile  
  Set oFile = oFS.OpenTextFile(sFile, 1, True, -2)
  With oFile
    Do
      sTmp = .ReadLine
      If InStr(1, sTmp, sFind) Then
       GetInfoFromFile= Trim(Replace(sTmp, sFind, vbNullString))          
       sTmp = .ReadAll
      End If
    Loop Until .AtEndOfStream
    .Close
  End With      
End Function

' ************************************************************
' Script
' ************************************************************
' sollen die CMD-Fenster angezeigt werden? 0 = versteckt [default], 1 = anzeigen 

Set oWSH = CreateObject("Wscript.shell")
Set oApp = CreateObject("Shell.Application")
Set oFS  = CreateObject("Scripting.FileSystemObject")
sCMD = oWsh.ExpandEnvironmentStrings("%COMSPEC%") & " /C "
' Pfad des Scripts.
sScriptPath = Replace(WScript.ScriptFullName, WScript.ScriptName, vbNullString)
sTmpfile = oWsh.ExpandEnvironmentStrings("%tmp%") & "\~info.txt"
' kompletter Dateipfad des VPN Clients 
appAVPNC = oWsh.ExpandEnvironmentStrings("%ProgramFiles%") & + cAppAVPNCPath + cAppAVPNC
appAVPNCCMD = oWsh.ExpandEnvironmentStrings("%ProgramFiles%") & + cAppAVPNCPath + cAppAVPNCCMD
If Not oFS.FileExists(appAVPNCCMD) Then
  appAVPNC = oWsh.ExpandEnvironmentStrings("%ProgramFiles(x86)%") & + cAppAVPNCPath + cAppAVPNC
  appAVPNCCMD = oWsh.ExpandEnvironmentStrings("%ProgramFiles(x86)%") & + cAppAVPNCPath + cAppAVPNCCMD
  If Not oFS.FileExists(appAVPNCCMD) Then
    oWsh.popup "Lancom Advanced VPN Client wurde nicht gefunden" , 15, "Fehler in der Installation", vbOKOnly
    WScript.Quit
  End If
End If

appAVPNC = wrap(appAVPNC)
appAVPNCCMD = wrap(appAVPNCCMD)
' RDP - Remotedesktopverbindung 
appRDPP = oWsh.ExpandEnvironmentStrings("%windir%") + "\system32\" + cAppRDP

' Wenn der komplette Pfad in der Konstante eingetragen wurde, wird nichts angefügt. 
' Sonst wird der Scriptordner vorangestellt.
If InStr(1, cRDP, "\") = 0 Then
  argRDP = sScriptPath & cRDP
Else
  argRDP = cRDP
End If
If Right(LCase(cRDP), 4) <> ".rdp" Then argRDP = argRDP & ".rdp"

If InStr(1, cRDP, "%") > 0 Then
  argRDP = Replace(argRDP, "%HOMEDRIVE%", oWsh.ExpandEnvironmentStrings("%HOMEDRIVE%"))
  argRDP = Replace(argRDP, "%HOMEPATH%", oWsh.ExpandEnvironmentStrings("%HOMEPATH%"))
End If

If Not oFS.FileExists(argRDP) Then
  oWsh.popup "Die RemoteDesktop Verbindungsdatei wurde nicht gefunden." & vbCrLf & vbCrLf & argRDP, 15, "Fehler in Konfiguration", vbOKOnly + vbExclamation
  WScript.Quit
End If
sTerminalServer = GetInfoFromFile(argRDP, "full address:s:")

If cAppAVPNC <> "" Then ' Soll der Client gestartet werden
  fAppAVPNC = appInTask(cAppAVPNC)
  If Not fAppAVPNC Then   
    oWsh.Exec appAVPNC                
  End If  
Else
  fAppAVPNC = False
End If

sTmp = appAVPNCCMD & " /writeClientInfoCenterData " & sTmpfile
oWsh.Run sTmp, 0, True  
sTmp = GetInfoFromFile(sTmpfile, "State")

If sTmp = "= disconnected" Then
  sTmp = appAVPNCCMD & " " & Trim("/connect " & cVPN)
  oWsh.Run sTmp, 0, True   
End If

'Prüfen ob der Zielhost erreichbar ist
If ping(10) Then
  oWsh.run appRDPP & " " & wrap(argRDP), 3, True  'RDP maximiert starten und aktivieren. Warten bis Anwendung geschlossen wird.
Else
  oWsh.popup "Ping-Anforderung konnte den Host '" & sTerminalServer & "' nicht finden" , 15, "Fehler da Server nicht erreichbar ist", vbOKOnly
End If

'Wenn kein RDP mehr läuft VPN schließen
if Not appInTask(cAppRDP) Then  
  oWsh.run appAVPNCCMD & " /disconnect", 0, True
  If Not fAppAVPNC Then oWsh.Run appAVPNCCMD & " /stop", 0, True   
End If
On Error Resume Next
oFS.DeleteFile sTmpfile
Set oWSH = Nothing
Set oApp = Nothing
Set oFS  = Nothing

 

pLancom bietet eine eigene Software den LANCOM Advanced VPN Client an. Dieser kostet mit Stand 12/2019 etwa 90 €.
Wer keine öffentliche IP4-Adresse von seinem Internet-Provider bekommt, Stichwort DS-Lite mit IPv6 das passiert bei den Kabel-Anbietern, muss den LANCOM Advance VPN Client nehmen. Dieser funktioniert hier ohne Probleme.

Steht einem aber noch eine IPv4 Adresse zu Verfügung kann ohne Probleme den Shrew Soft VPN Client einsetzen.
Bei der Installation des VPN-Clients sollte aber darauf geachtet werden dass nur die Standard Edition installiert wird. Sonst wird jedes mal nach einer Aktivierung gefragt.

Vorbereitungen:
Eine neu Textdatei öffen in der relevanten Daten kurz zwischengespeicher werden können.


A) Lancom-Router Konfiguration erstellen.
1) Lanconfig starten.
2) Rechte Maustaste auf den Router in der Liste und Setup-Assistenten starten.
3) Einwahl Zugang bereitstellen (RAS, VPN) auswählen   > weiter
4) Austauch-Modus IKEv1 auswählen   > weiter
5) VPN-Client auswählen > VPN-Client mit benutzerdefinierten Parametern auswählen   > witeer
6) Name (VPN festlegen) z.B. SHREWVPN_001. Kann aber auch aussagekräftiger sein.
   Tip Namen in den o.G Editor kopieren
7) Den Preshared Key erstellen. Am einfachsten das Häckchen Anzeigen anklicken und dann auf Passwort erzeugen klicken.
   TiP: Diesen PSK in den o.G. Editor kopieren
8) Standard-IKE_Parameter sollte nicht ankgepasst werden da dies Auswirkung auf schon erstellen Verbindungen hat.
9) Jetzt werden die Identitäten erstellt. Der Ty ist für beide Einträge auf Fully Qualified Username gestellt  Hier enfiehlt sich eine fantasie Email-Adresse einzutragen. Lokale und entfernte Identität am besten aber gleich!10) Das PFS-Verfahren deaktivieren.
11) verwendete Verschlüsselungsverfahren auswählen
12) Authentifizierungsverfahren auswählen Kein AH
13) IP-Adresse welche der Client im lokalen Netzwerkes des Lancom-Router erhält. sollte nicht im Berich der lokalen PC's liegen.
(13b) Sollte die IP-Adresse schon vergeben sein gibt es ein Warnhinweis auf der nächsten Seite
14) Wenn der Client alle IP-Adressen erreichen soll Alle IP-Adressen für den VPN-client erlauben auwählen.
15) Mit Fertig stellen wird die Konfiguration auf dem Lancom-Router geschrieben und ist somit aktiv.

Nachtrag: Sollte es vergessen worden sein die Identitäten zu kopiern / mitzuschreiben können sie recht einfach in der Konfiguration den Lancom-Routern ausgelesen werden.
Rechte Maustaste auf den Router Konfiguration starten  > VPN > IKE/IPSec >IKE-Schlüssel & Identitäten

B) Shrew Soft VPN Konfiguration erstellen.

1) VPN Access Manager starten
2) Durch den Add-Button eine neue Konfiguration erstellen
3.) Register General
* DynDNS-Name oder öffentlcihe IP-Adresse des Lancom-Router eintragen. Wenn es keine feste IP-Aressse vom Internetprovider zur verfügung gestellt wird muss auf einen DynDNS-dienst zurückgegriffen werden. (Muss natürlcih vorab eingerichtet werden.)
4) Register Client
 * NAT Traversal und IKE Fagment auf disable stellen
5) Register Name Resolution
 * DNS & WINS bleiben unverändert (alel aktiv)
6) Register Authentication
 * Authentication Method auf Mutual PSK stellen
   A&B) Unterregister Local Identity & Remote Identity
   * Identification Type auf User Fully Qualified Domain Name
   * UFQDN die fantasie Email-Adresse eintragen
   C) Unterregister Credentials
   *  Pre Shared Key des Router-Eintrags verwenden
7) Register Phase & Phase2
  * Bleigen unverändert
8) Register Policy
 * Bleibt unverändert


Anmerkung: Wenn eine Remotedesktopverbidnung durch den VPN-Tunnel geschleust werden soll hilft ein kleines Script um dies zu automatisieren.