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).
* Eine funtionsfähige VPN-Verbindung sollte bestehen.
* Eine RDP-Sitzung sollte darüber laufen.

Das Script verwendet den Shrew Soft VPN Client
Damit nicht ein schwarzen Fenster während der Laufzeit der RDP-Sitzung bestehen bleibt wird ein Hilfsscript verwendet.

Download gezippte Scripte

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

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

Option Explicit
' ************************************************************
' Verwendete folgende Software
' Remote Desktop Protokoll (RDP)
' Shrew Soft VPN Client -> https://www.shrew.net/download/vpn
' ************************************************************

' ************************************************************
' Persönliche Einstellungen 
' ************************************************************
' Datei-Name der RDP-Verbindungseinstellungen (Liegt sie im Script-Ordner muss nur der Dateiname angegeben werden, andernfalls der komplette Dateifpad). 
Const cRDP            = "RDP_Datei"  
' VPN-Verbindung aus dem VPN Access Manager
Const cVPN            = "VPN_Name"          
' ************************************************************


' ************************************************************
' Funktionen
' ************************************************************
'Funktion prüft ob eine Anwendung gestartet ist.
Function appInTask(sApp, fKill) '
  'On Error resume next
  'dim oSel, oObject, fappRunning
  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	  
    If fKill Then oObj.terminate
  Next  
  Set oSel = Nothing
  appInTask = fappRunning
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

' Nachdem die VPN-Verbindung aufgebaut ist wird den RDP-Server (Terminalserver) angepingt ob dieser ereichbar ist
Function ping()
  Dim i, j, tmp, sPing    
  'Zeigt die Anzahl der Zeilen an welche die Zeichenfolge " TTL=" enthalten
  sPing = "ping -n 1 " & sTerminalServer & " | find /c "" TTL=""" 
  On Error Resume Next
  j = 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 >= 20 
  ping = (i > 0) 
end Function

' ************************************************************
' Script
' ************************************************************
Dim oWsh, oApp, oFS
Dim appIPSecP, argIPSec, appRDPP, argRDP, sScriptPath, sTerminalServer, sCMD, sTmp, sTmpfile 
Const cAappIPSec = "ipsecc.exe" 'VPN Client-Dateiname 
Const cAppRDP    = "mstsc.exe"
Set oWSH = CreateObject("Wscript.shell")
Set oApp = CreateObject("Shell.Application")
set oFS  = CreateObject("Scripting.FileSystemObject")
sCMD = oWsh.ExpandEnvironmentStrings("%COMSPEC%") & " /C "
sTmpfile = oWsh.ExpandEnvironmentStrings("%tmp%") & "\~info.txt"
' Pfad des Scripts.
sScriptPath = Replace(WScript.ScriptFullName, WScript.ScriptName, vbNullString)
' kompletter Dateipfad des VPN Clients 
appIPSecP = oWsh.ExpandEnvironmentStrings("%ProgramFiles%") & + "\ShrewSoft\VPN Client\" + cAappIPSec
' VPN Connection im VPN Access Manager
' c:\Users\[USERNAME]\AppData\Local\Shrew Soft VPN\sites\[Connection-Name]
argIPSec = "-r " & cVPN & " -a" ' Connection-Name aus "VPN Access Manager"
' RDP - Remotedesktopverbindung 
appRDPP = oWsh.ExpandEnvironmentStrings("%windir%") + "\system32\" + cAppRDP


' RDP Verbindungs-Datei wenn sie im Scriptordner liegt
argRDP = sScriptPath & cRDP
' Wenn der Komplette Pfad in der Konstante eingetragen wurde
'argRDP = cRDP
' ************************************************************

' 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 Not oFS.FileExists(argRDP) Then
  oWsh.popup "Die RemoteDesktop Verbindungsdatei wurde nicht gefunden." & vbCrLf & vbCrLf & argRDP, 15, "", vbOKOnly
  WScript.Quit
End If
sTerminalServer = GetInfoFromFile(argRDP, "full address:s:")

' VPN-Tunnel aufbauen, falls noch nicht gestartet
If not appInTask(cAappIPSec, false) Then oApp.ShellExecute appIPSecP, argIPSec, "", "", 1


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

'Wenn kein RDP mehr läuft VPN schließen

If Not appInTask(cAppRDP, False) Then appInTask cAappIPSec, true 'oWsh.run sCMD & "taskkill /T /F /IM " & cAappIPSec, 0, False
On Error Resume Next
oFS.DeleteFile sTmpfile
Set oWSH = Nothing
Set oApp = Nothing
Set oFS  = Nothing