Ziel des IT Service Managements ist es, Nutzer*innen durch automatisierte Prozesse möglichst viel Arbeit abzunehmen. NETWAYS hat bereits vor geraumer Zeit auf die aktuelle Corona-Situation reagiert und alle Mitarbeitenden ins Home Office geschickt.
Um auch Zuhause weiterhin auf firmeninterne Adressen zugreifen zu können, ist ein VPN (Virtuelles Privates Netzwerk) nötig und die Mehrheit nutzt eine “openVPN”-Lösung, welche aufgrund unserer Netzgegebenheiten aber weniger leistungsstark, als ein “L2TP” abschneiden kann. Um den Kolleg*innen den Umstieg von openVPN auf L2TP zu erleichtern, haben wir es uns zum Ziel gesetzt, einen automatisierten Ablauf zu schaffen, welcher dem*r User*in im Grunde genommen ermöglicht, den VPN-Zugang lediglich per “Knopfdruck” auf dem eigenen Windows-Gerät zu installieren.
Die Umsetzung
Da wir uns auf einer Windows-Plattform bewegen, stand außer Frage, dass ein Powershell-Script benötigt wird, um unsere VPN-Verbindung in das System einzubinden. Microsoft bietet unter “docs.microsoft.com” eine wundervolle Dokumentation zum Thema Powershell an. Unter anderem kann man dort nach einzelnen “tags” suchen und sich die dazu passenden Funktionen samt Syntax anzeigen lassen. Und so habe ich nach kurzer Suche die Funktion “Add-VpnConnection” gefunden!
Schnell wurde mir klar, dass ich fast mein gesamtes Konzept in einer Zeile Powershell umsetzen konnte. Es ist möglich, die Funktion mit verschiedensten Parametern zu beeinflussen. Man kann zum Beispiel den Namen, Typ des VPNs, einen Pre-Shared-Key (PSK) und noch vieles mehr einbinden. Eine besondere Erwähnung meinerseits erhält an dieser Stelle der Parameter “-SplitTunneling”, welcher erlaubt, das VPN nur dann zu nutzen, wenn die Netzwerkressourcen auch wirklich benötigt werden. Beim Verbinden zu nicht-internen Internetdiensten werden die Standardrouten des Clients und Providers genutzt. Dieses Feature war für mich bei der herkömmlichen Einrichtung eines VPNs, unter der grafischen Oberfläche von Windows, nicht ersichtlich. Nachdem man die einzelnen Routen in das Script mit aufgenommen hat, funktioniert das Ganze auch problemlos.
Die Herausforderung
Nachdem ich das VPN Script getestet hatte und die Einrichtung ohne Hindernisse funktionierte, stellten sich mir zwei Fragen: Wie meldet sich der*die Endbenutzer*in mit seinem AD-Account in dem VPN an und wie lässt sich ein Powershellscript ausführen ohne Powershell nutzen zu müssen?
Das Problem mit dem User-Login löste sich beim Probieren von selbst: Sobald das VPN installiert ist und der*die Nutzer*in auf “Verbinden” drückt, startet Windows eine Benutzer/Passwortabfrage. Wenn man in der Funktion noch den Parameter “-RememberCredential” implementiert hat, werden die eingegebenen Daten automatisch gespeichert und aus dem Cache entnommen.
Bei dem Ausführen der .ps1 Powershell-Datei gab es für mich nun zwei Möglichkeiten: Es gibt eine Vielzahl an Konvertern, die eine .ps1-Datei in ein .exe Format umwandeln. Dabei könnte die Datei aber durch eventuelle Fremdsysteme laufen. Da ich einen PSK zur Authentifizierung in das Script eingebunden habe, entschied ich mich gegen diese Lösung. Dafür fiel meine Wahl auf die zweite Option, nämlich eine Batch-Datei (.bat) anzulegen, mit der man die .ps1 in Powershell ausführt.
In der .bat-Datei selbst befinden sich drei Komponenten
Der Pfad zu Powershell, in dem unsere Datei ausgeführt werden soll:
- C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Ein Kommando zum Ausführen:
- executionpolicy bypass
Und dieser kryptische Name:
- %~dp0%~n0.ps1
Diese Bezeichnung macht das Batch-Script zu einem dynamischen Script, welches, unabhängig von Location, ausgeführt werden kann ohne im eigentlichen Script etwas ändern zu müssen.
Wir haben zwei Batch-Variablen, die wir uns dafür zu Nutze machen. Mit “%~dp0 “ sucht man im aktuellen Pfad, in welchem die Batch ausgeführt wurde, nach dem Namen, den die Batch-Datei trägt (“%~n0”) . Da ich aber nicht die Batch-Datei selber öffnen möchte, nutze ich das “.ps1 “ Anhängsel unserer Powershell-Datei.
# Batch-Script zum Ausführen
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass %~dp0%~n0.ps1
Und damit kommen wir zu den Voraussetzungen, die erfüllt sein müssen, damit die Batch- und Powershell-Datei funktionieren: Beide müssen denselben Namen tragen und sich im selben Verzeichnis befinden!
Fast geschafft! Am Ende lässt sich das Script einfach ausführen und kann – ohne weitere Eingaben in die Powershell/CMD – den VPN-Zugang anlegen. Die beiden Dateien müssten sich – wie oben beschrieben – nur im selben Pfad befinden und die Batch-Datei ausgeführt werden.
Das Script
#Add VPN
Add-VpnConnection -Name "L2TP-VPN" -Server_Address "Server_adresse" -TunnelType "L2tp" -EncryptionLevel "Required" -L2tpPsk "Generic_Key" -Force -RememberCredential -PassThru
#Setting Name
$MyVPNName = "L2TP-VPN"
#Call VPN via Name + SplitTunneling
Set-VpnConnection -Name $MyVPNName -SplitTunneling $TRUE;
#Routes
Add-VpnConnectionRoute -ConnectionName $MyVPNName -PassThru -DestinationPrefix IP.IP.IP.IP/Netzanteil #Beispiel-Route

0 Comments