Der findes ingen Import-VpnProfile-cmdlet, og den, der ligner mest, Add-VpnConnection, læser aldrig en .ovpn- eller .conf-fil. Den samler en indbygget Windows-profil ud fra de parametre, du sender ind, og derfor er det første kontrolpunkt her filformatet og ikke kommandolinjen. Hvis gatewayen taler SSTP, IKEv2, L2TP/IPsec eller PPTP, kan Windows eje profilen, og resten af listen gælder. Hvis du har fået en OpenVPN- eller WireGuard-fil, så stop ved første trin: de klienter har deres egne importere.

Trin 1: Bekræft, hvilken profil Windows faktisk kan eje

Kør Get-Command -Module VpnClient på maskinen før alt andet. Windows 10, Windows 11 og Server 2016 eller nyere leveres med modulet; hvis det mangler, får ingen kopieret script denne vært til at acceptere en indbygget profil. De cmdlets, der betyder noget, er Add-VpnConnection, Get-VpnConnection og Remove-VpnConnection, og parameterlisten i Add-VpnConnection-referencen er værd at læse helt igennem én gang.

Indbygget betyder, at Windows' VPN-stak afslutter tunnelen. Det dækker IKEv2, ofte med et maskincertifikat; SSTP, som er TLS med bruger- eller certifikatgodkendelse indeni; og L2TP/IPsec med en forudelt nøgle. En .ovpn-fil er et OpenVPN-script, ikke en Windows-forbindelse: den bærer direktiver som remote, cipher eller tls-auth, som Windows-stakken slet ikke kender. En WireGuard .conf er den samme historie med PrivateKey og AllowedIPs; at konvertere den ene til den anden er ikke et parametervalg, men en anden tunnelimplementering.

Der er en tredje gren. Hvis en administrator giver dig et VPNv2 CSP XML-dokument eller en Intune-profil, er det MDM-vejen, som anvendes af provisioning-stakken og ikke af Add-VpnConnection. Oversæt ikke de node-navne til PowerShell-parametre; spørg i stedet, hvilken mekanisme der anvender XML'en.

Trin 2: Par tunneltypen med godkendelsesmetoden

-TunnelType og -AuthenticationMethod er separate parametre, og gatewayen er ligeglad med andet end kombinationen. Får du den ene rigtig og den anden forkert, får du en profil, der ikke forbinder til noget, eller som går i stå med tunnelen allerede oppe. Sæt begge eksplicit i stedet for at stole på en standard, der blev valgt til en anden tjeneste.

  • IKEv2 med MachineCertificate: klienten fremviser et computercertifikat; sæt også -EncryptionLevel Required.
  • SSTP med Eap: først TLS-tunnel, derefter PEAP/MSCHAPv2 eller et certifikat inde i EAP. Det kræver XML'en fra trin 3.
  • SSTP, L2TP eller PPTP med MSChapv2, Chap eller Pap: almindeligt brugernavn og adgangskode, ingen EAP-blob.
  • L2TP med MSChapv2 og -Lt2pPsk: PSK'en dækker IPsec-halvdelen, brugeren dækker PPP; begge skal matche serveren.

En splat holder værdierne på ét sted:

$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 returnerer det objekt, Windows netop har skrevet, så du kan inspicere det uden et andet kald. Hvis navnet allerede findes, nægter cmdletten at køre; -Force overskriver det, hvilket er den forkerte refleks på en produktionslaptop, fordi den lydløst kasserer alt, hvad nogen har sat op manuelt.

Trin 3: Overdrag legitimationsmaterialet korrekt

Adgangskoder, forudelte nøgler og EAP-blobs er der, hvor disse scripts normalt knækker. -EapConfigXmlStream vil have et XmlDocument, ikke en sti, så læs og cast filen først. Sender du en streng, får du en konverteringsfejl, der ligner et skemaproblem og får folk til at omskrive XML, som aldrig var forkert.

$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

Den XML skal ikke opfindes ud fra et bloguddrag. Den navngiver EAP-metodetypen og den indre godkendelse, og gatewayen sammenligner begge med sin politik. En indre metode, der ikke matcher, fejler efter TLS-håndtrykket er gennemført, hvilket ligner præcis en dårlig adgangskode og ikke er det. Hent XML'en hos den, der driver gatewayen, eller eksportér den fra en profil, der allerede virker.

For IKEv2 er certifikathalvdelen et opslag i lageret. -MachineCertificateIssuerFilter tager et certifikatobjekt, og Windows bruger det til at finde et brugbart klientcertifikat i LocalMachine\My. Certifikatet skal have en privat nøgle og en kæde, som serveren stoler på; mangler en af delene, fejler godkendelsen uden nyttig detalje, så tjek lageret først:

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

Hold hemmeligheder ude af scriptfilen. En PSK, der sendes på kommandolinjen eller bages ind i en .ps1, ender i transskriptioner, gemte sessioner og delte repositorier, og -RememberCredential cacher brugerlegitimationer til senere og gør en engangstest til en varig tilladelse.

Trin 4: Beslut omfanget før første kørsel

Den samme cmdlet skriver til to forskellige telefonbøger. Uden -AllUserConnection tilhører profilen dig og bor under %APPDATA%\Microsoft\Network\Connections\Pbk\rasphone.pbk. Med den, fra en forhøjet kommandoprompt, går profilen til %ProgramData%\Microsoft\Network\Connections\Pbk\rasphone.pbk og er synlig for hver konto, inklusive logon-skærmen.

Omfang er ikke kosmetik. En profil for alle brugere er det, en tjenestekonto, en planlagt opgave eller et scenarie før logon kan bruge; en profil for den enkelte bruger er usynlig for alle tre. Objekterne læses også forskelligt: Get-VpnConnection viser den aktuelle brugers poster, Get-VpnConnection -AllUserConnection viser dem for hele maskinen. Vælg én nu, og behandl en senere ændring som slet og genskab i stedet for en redigering:

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

Trin 5: Test, hvad en tunnel faktisk skal levere

Et tilsluttet ikon beviser, at tunnelen kom op, og intet andet. Forbind først fra kommandolinjen, så fejl kommer som tekst og ikke som en dialog, og læs derefter, hvad Windows registrerede:

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

De to fejl, brugerne rapporterer, mens status stadig siger Connected, er DNS og routing. Slå et internt navn op, og tjek hvilken server der svarede; en profil uden -DnsSuffix kan tunnele perfekt og alligevel fejle på hvert intranetopslag. Se derefter på standardruten: med split tunneling slået fra skal ruten 0.0.0.0/0 med lavest metric pege ind i VPN-interfacet, og med den slået til kun de præfikser, du forventer. Ser begge rigtige ud, og trafikken alligevel dør, ligger problemet ud over profilen, i politik eller gateway-filteret.

Når forbindelsen fejler helt, indsnævrer koden det trin, du skal vende tilbage til:

  • 691: gatewayen afviste legitimationsoplysningerne. Gå tilbage til trin 3, ikke til tunnelen.
  • 809: IKEv2-håndtrykket blev aldrig fuldført. Tjek UDP 500 og 4500, og certifikattillid.
  • 789: den forudelte nøgle til L2TP/IPsec mangler eller er forkert.
  • 868: servernavnet blev ikke slået op. Ret DNS, før du redigerer profilen.

Hold den fungerende kommando ved siden af de indstillinger, den koder, så den næste kan genopbygge i stedet for at reverse-engineere profilen ud fra brugerfladen. Hvis du må genopbygge, så slet posten og genskab den ud fra de samme parametre; at lappe en halvkonfigureret profil efterlader forældede ruter og godkendelsestilstand. Og hvis filen aldrig var indbygget, så gå tilbage til den klient, der ejer den. En .ovpn klædt ud som IKEv2-profil er ikke en import, det er en supportbillet.

Relaterede artikler