Es gibt kein Cmdlet Import-VpnProfile, und das, was am nächsten kommt, Add-VpnConnection, liest niemals eine .ovpn- oder .conf-Datei. Es baut ein natives Windows-Profil aus den Parametern zusammen, die Sie übergeben, und deshalb ist der erste Prüfpunkt hier das Dateiformat und nicht die Kommandozeile. Wenn das Gateway SSTP, IKEv2, L2TP/IPsec oder PPTP spricht, kann Windows das Profil besitzen, und der Rest der Liste gilt. Wenn Sie eine OpenVPN- oder WireGuard-Datei bekommen haben, hören Sie bei Schritt eins auf: Diese Clients haben ihre eigenen Importeure.

Schritt 1: Prüfen, welches Profil Windows wirklich besitzen kann

Führen Sie Get-Command -Module VpnClient auf der Maschine aus, bevor Sie irgendetwas anderes tun. Windows 10, Windows 11 und Server 2016 oder neuer liefern das Modul mit; fehlt es, bringt kein kopiertes Skript diesen Host dazu, ein natives Profil zu akzeptieren. Die relevanten Cmdlets sind Add-VpnConnection, Get-VpnConnection und Remove-VpnConnection, und die Parameterliste in der Add-VpnConnection-Referenz lohnt sich einmal komplett zu lesen.

Nativ bedeutet, dass der Windows-VPN-Stack den Tunnel beendet. Das umfasst IKEv2, oft mit einem Maschinenzertifikat; SSTP, also TLS mit Benutzer- oder Zertifikatsauthentifizierung innen; und L2TP/IPsec mit einem vorab geteilten Schlüssel. Eine .ovpn-Datei ist ein OpenVPN-Skript, keine Windows-Verbindung: Sie trägt Anweisungen wie remote, cipher oder tls-auth, von denen der Windows-Stack nichts weiß. Eine WireGuard-.conf ist dieselbe Geschichte mit PrivateKey und AllowedIPs; das eine in das andere umzuwandeln ist keine Parameterwahl, sondern eine andere Tunnelimplementierung.

Es gibt einen dritten Zweig. Wenn ein Administrator Ihnen ein VPNv2-CSP-XML-Dokument oder ein Intune-Profil gibt, ist das der MDM-Weg, der vom Provisioning-Stack angewandt wird und nicht von Add-VpnConnection. Übersetzen Sie diese Knotennamen nicht in PowerShell-Parameter; fragen Sie stattdessen, welcher Mechanismus die XML anwendet.

Schritt 2: Tunneltyp und Authentifizierungsmethode paaren

-TunnelType und -AuthenticationMethod sind getrennte Parameter, und das Gateway interessiert nur die Kombination. Machen Sie einen richtig und den anderen falsch, und Sie bekommen ein Profil, das sich mit nichts verbindet oder hängt, obwohl der Tunnel schon steht. Setzen Sie beide explizit, statt einem Standard zu vertrauen, der für einen anderen Dienst gewählt wurde.

  • IKEv2 mit MachineCertificate: Der Client legt ein Computerzertifikat vor; setzen Sie zusätzlich -EncryptionLevel Required.
  • SSTP mit Eap: erst der TLS-Tunnel, dann PEAP/MSCHAPv2 oder ein Zertifikat innerhalb von EAP. Dafür braucht es die XML aus Schritt 3.
  • SSTP, L2TP oder PPTP mit MSChapv2, Chap oder Pap: einfacher Benutzername und Kennwort, kein EAP-Blob.
  • L2TP mit MSChapv2 und -Lt2pPsk: Der PSK deckt die IPsec-Hälfte ab, der Benutzer die PPP-Hälfte; beide müssen zum Server passen.

Ein Splat hält die Werte an einer Stelle:

$p = @{
  Name                 = "Corp IKEv2"
  ServerAddress        = "vpn.example.com"
  TunnelType           = "Ikev2"
  AuthenticationMethod = "MachineCertificate"
  EncryptionLevel      = "Required"
  SplitTunneling       = $false
  DnsSuffix            = "corp.example.com"
}
Add-VpnConnection @p -PassThru

-PassThru gibt das Objekt zurück, das Windows gerade geschrieben hat, sodass Sie es ohne einen zweiten Aufruf prüfen können. Existiert der Name bereits, verweigert das Cmdlet den Lauf; -Force überschreibt ihn, was auf einem Produktions-Laptop der falsche Reflex ist, weil es still verwirft, was jemand von Hand konfiguriert hat.

Schritt 3: Das Anmeldedatenmaterial richtig übergeben

Kennwörter, vorab geteilte Schlüssel und EAP-Blobs sind die Stelle, an der diese Skripte üblicherweise brechen. -EapConfigXmlStream will ein XmlDocument, keinen Pfad, also lesen und casten Sie die Datei zuerst. Eine Zeichenkette zu übergeben erzeugt einen Konvertierungsfehler, der wie ein Schemaproblem aussieht und Leute dazu bringt, XML umzuschreiben, das nie falsch war.

$eap = [xml](Get-Content -Raw .\peap-mschapv2.xml)
Add-VpnConnection -Name "Corp SSTP" -ServerAddress "sstp.example.com" `
  -TunnelType Sstp -AuthenticationMethod Eap `
  -EapConfigXmlStream $eap -EncryptionLevel Required

Dieses XML sollte man nicht aus einem Blog-Schnipsel erfinden. Es benennt den EAP-Methodentyp und die innere Authentifizierung, und das Gateway vergleicht beides mit seiner Richtlinie. Eine nicht passende innere Methode scheitert, nachdem der TLS-Handshake abgeschlossen ist, was genau wie ein falsches Kennwort aussieht und keines ist. Holen Sie die XML von dem, der das Gateway betreibt, oder exportieren Sie sie aus einem Profil, das bereits funktioniert.

Bei IKEv2 ist die Zertifikatshälfte ein Speichersuchlauf. -MachineCertificateIssuerFilter nimmt ein Zertifikatsobjekt, und Windows sucht damit ein brauchbares Clientzertifikat in LocalMachine\My. Das Zertifikat braucht einen privaten Schlüssel und eine Kette, der der Server vertraut; fehlt eines davon, scheitert die Authentifizierung ohne nützliche Details, also prüfen Sie zuerst den Speicher:

Get-ChildItem Cert:\LocalMachine\My |
  Where-Object { $_.HasPrivateKey -and $_.NotAfter -gt (Get-Date) } |
  Select-Object Subject, Issuer, Thumbprint, NotAfter

Halten Sie Geheimnisse aus der Skriptdatei. Ein PSK, der auf der Kommandozeile übergeben oder in eine .ps1 eingebacken wird, landet in Transkripten, gespeicherten Sitzungen und geteilten Repositories, und -RememberCredential speichert Benutzeranmeldedaten für später zwischen und macht aus einem einmaligen Test eine dauerhafte Berechtigung.

Schritt 4: Den Geltungsbereich vor dem ersten Lauf festlegen

Dasselbe Cmdlet schreibt in zwei verschiedene Telefonbücher. Ohne -AllUserConnection gehört das Profil Ihnen und liegt unter %APPDATA%\Microsoft\Network\Connections\Pbk\rasphone.pbk. Damit, aus einer erhöhten Eingabeaufforderung, geht das Profil nach %ProgramData%\Microsoft\Network\Connections\Pbk\rasphone.pbk und ist für jedes Konto sichtbar, auch für den Anmeldebildschirm.

Der Geltungsbereich ist nicht kosmetisch. Ein All-User-Profil ist das, was ein Dienstkonto, eine geplante Aufgabe oder ein Pre-Logon-Szenario nutzen kann; ein Per-User-Profil ist für alle drei unsichtbar. Auch die Objekte werden anders gelesen: Get-VpnConnection listet die Einträge des aktuellen Benutzers, Get-VpnConnection -AllUserConnection die maschinenweiten. Wählen Sie jetzt eines, und behandeln Sie eine spätere Änderung als Löschen und Neuerstellen statt als Bearbeiten:

# elevated prompt
Remove-VpnConnection -Name "Corp IKEv2" -Force
Add-VpnConnection -Name "Corp IKEv2" -ServerAddress "vpn.example.com" `
  -TunnelType Ikev2 -AuthenticationMethod MachineCertificate `
  -EncryptionLevel Required -AllUserConnection

Schritt 5: Testen, was ein Tunnel tatsächlich liefern muss

Ein verbundenes Symbol beweist, dass der Tunnel hochkam, und sonst nichts. Verbinden Sie sich zuerst über die Kommandozeile, damit Fehler als Text ankommen und nicht als Dialog, und lesen Sie dann zurück, was Windows aufgezeichnet hat:

rasdial "Corp IKEv2"
Get-VpnConnection -Name "Corp IKEv2" |
  Select-Object Name, ServerAddress, TunnelType, ConnectionStatus, SplitTunneling
Get-NetRoute -DestinationPrefix "0.0.0.0/0"

Die beiden Fehler, die Nutzer melden, während der Status noch Connected sagt, sind DNS und Routing. Lösen Sie einen internen Namen auf und prüfen Sie, welcher Server geantwortet hat; ein Profil ohne -DnsSuffix kann perfekt tunneln und trotzdem jede Intranet-Suche scheitern lassen. Sehen Sie sich dann die Standardroute an: Mit ausgeschaltetem Split Tunneling sollte die 0.0.0.0/0-Route mit der niedrigsten Metrik in das VPN-Interface zeigen, mit eingeschaltetem nur die Präfixe, die Sie erwarten. Wenn beides richtig aussieht und der Verkehr trotzdem stirbt, liegt das Problem hinter dem Profil, in der Richtlinie oder im Gateway-Filter.

Wenn die Verbindung komplett scheitert, engt der Code den Schritt ein, zu dem Sie zurückkehren sollten:

  • 691: Das Gateway hat die Anmeldedaten abgelehnt. Gehen Sie zurück zu Schritt 3, nicht zum Tunnel.
  • 809: Der IKEv2-Handshake wurde nie abgeschlossen. Prüfen Sie UDP 500 und 4500 sowie das Zertifikatsvertrauen.
  • 789: Der vorab geteilte L2TP/IPsec-Schlüssel fehlt oder ist falsch.
  • 868: Der Servername wurde nicht aufgelöst. Reparieren Sie DNS, bevor Sie das Profil bearbeiten.

Halten Sie den funktionierenden Befehl neben den Einstellungen, die er kodiert, damit die nächste Person neu bauen kann, statt das Profil aus der Oberfläche zurückzuentwickeln. Wenn Sie wirklich neu bauen müssen, löschen Sie den Eintrag und legen ihn aus denselben Parametern neu an; ein halb konfiguriertes Profil zu flicken hinterlässt veraltete Routen und Authentifizierungszustand. Und wenn die Datei nie nativ war, gehen Sie zurück zu dem Client, der sie besitzt. Eine als IKEv2-Profil verkleidete .ovpn ist kein Import, sondern ein Support-Ticket.

Ähnliche Artikel