Det finnes ingen cmdlet som heter Import-VpnProfile, og den som ligner mest, Add-VpnConnection, leser aldri en .ovpn- eller .conf-fil. Den setter sammen en native Windows-profil fra parameterne du oppgir, og derfor er det første kontrollpunktet her filformatet og ikke kommandolinjen. Hvis gatewayen snakker SSTP, IKEv2, L2TP/IPsec eller PPTP, kan Windows eie profilen og resten av listen gjelder. Hvis du har fått en OpenVPN- eller WireGuard-fil, stopp på første trinn: de klientene har sine egne importere.

Trinn 1: Bekreft hvilken profil Windows faktisk kan eie

Kjør Get-Command -Module VpnClient på maskinen før noe annet. Windows 10, Windows 11 og Server 2016 eller nyere leveres med modulen; mangler den, vil ingen kopiert skript få denne verten til å godta en native profil. Cmdletene som betyr noe er Add-VpnConnection, Get-VpnConnection og Remove-VpnConnection, og Add-VpnConnection-referansen parameterlisten der er verdt én full gjennomlesing.

Native betyr at Windows' VPN-stack avslutter tunnelen. Det dekker IKEv2, ofte med et maskinsertifikat; SSTP, som er TLS med bruker- eller sertifikatautentisering inni; og L2TP/IPsec med en forhåndsdelt nøkkel. En .ovpn-fil er et OpenVPN-skript, ikke en Windows-tilkobling: den bærer direktiver som remote, cipher eller tls-auth som Windows-stacken ikke har noe begrep om. En WireGuard .conf er samme historien med PrivateKey og AllowedIPs; å gjøre om den ene til den andre er ikke et parametervalg, men en annen tunnelimplementasjon.

Det finnes en tredje gren. Hvis en administrator gir deg et VPNv2 CSP XML-dokument eller en Intune-profil, er det MDM-veien, brukt av provisjoneringsstacken og ikke av Add-VpnConnection. Ikke oversett de nodenavnene til PowerShell-parametere; spør i stedet hvilken mekanisme som bruker XML-en.

Trinn 2: Match tunneltypen med autentiseringsmetoden

-TunnelType og -AuthenticationMethod er separate parametere, og gatewayen bryr seg bare om kombinasjonen. Én riktig og én feil og du får en profil som ikke kobler til noe, eller som stopper mens tunnelen allerede er oppe. Sett begge eksplisitt i stedet for å stole på en standardverdi valgt for en annen tjeneste.

  • IKEv2 med MachineCertificate: klienten presenterer et datamaskinsertifikat; sett også -EncryptionLevel Required.
  • SSTP med Eap: først TLS-tunnelen, deretter PEAP/MSCHAPv2 eller et sertifikat inne i EAP. Dette krever XML-en fra trinn 3.
  • SSTP, L2TP eller PPTP med MSChapv2, Chap eller Pap: vanlig brukernavn og passord, ingen EAP-blob.
  • L2TP med MSChapv2 og -Lt2pPsk: PSK-en dekker IPsec-halvdelen, brukeren dekker PPP; begge må stemme med serveren.

En splat holder verdiene på ett 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 objektet Windows nettopp skrev, så du kan undersøke det uten et andre kall. Hvis navnet allerede finnes, nekter cmdleten å kjøre; -Force overskriver det, og det er den gale refleksen på en produksjonsbærbar, fordi den stille kaster det noen konfigurerte for hånd.

Trinn 3: Overlever legitimasjonsmaterialet riktig

Passord, forhåndsdelt nøkler og EAP-blober er der disse skriptene vanligvis ryker. -EapConfigXmlStream vil ha en XmlDocument, ikke en bane, så les og konverter filen først. Å sende en streng gir en konverteringsfeil som ser ut som et skjemaproblem og sender folk til å skrive om XML som aldri var feil.

$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-en er ikke noe man dikter opp fra et bloggutdrag. Den navngir EAP-metodetypen og den indre autentiseringen, og gatewayen sammenligner begge med sin policy. En indre metode som ikke passer, feiler etter at TLS-håndtrykket er fullført, noe som ser nøyaktig ut som et dårlig passord og ikke er det. Ta XML-en fra den som drifter gatewayen, eller eksporter den fra en profil som allerede virker.

For IKEv2 er sertifikathalvdelen et oppslag i lageret. -MachineCertificateIssuerFilter tar et sertifikatobjekt, og Windows bruker det til å finne et brukbart klientsertifikat i LocalMachine\My. Sertifikatet trenger en privat nøkkel og en kjede serveren stoler på; mangler en av dem, feiler autentiseringen uten nyttige detaljer, så sjekk lageret først:

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

Hold hemmeligheter utenfor skriptfilen. En PSK gitt på kommandolinjen eller bakt inn i en .ps1 havner i transkripsjoner, lagrede økter og delte repositorier, og -RememberCredential cacher brukerens legitimasjon for senere, og gjør en engangstest til en varig tillatelse.

Trinn 4: Bestem omfanget før første kjøring

Den samme cmdleten skriver til to forskjellige telefonbøker. Uten -AllUserConnection tilhører profilen deg og ligger under %APPDATA%\Microsoft\Network\Connections\Pbk\rasphone.pbk. Med den, fra en forhøyet ledetekst, går profilen til %ProgramData%\Microsoft\Network\Connections\Pbk\rasphone.pbk og er synlig for alle kontoer, inkludert påloggingsskjermen.

Omfanget er ikke kosmetisk. En profil for alle brukere er det en tjenestekonto, en planlagt oppgave eller et scenario før pålogging kan bruke; en profil per bruker er usynlig for alle tre. Objektene leses også ulikt: Get-VpnConnection lister oppføringene til gjeldende bruker, Get-VpnConnection -AllUserConnection dem for hele maskinen. Velg én nå, og behandle en senere endring som sletting og nyoppretting, ikke 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

Trinn 5: Test hva en tunnel faktisk må levere

Et tilkoblet ikon beviser at tunnelen kom opp og ingenting mer. Koble til fra kommandolinjen først, slik at feil kommer som tekst og ikke en dialog, og les deretter tilbake det Windows registrerte:

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 feilene brukere rapporterer mens statusen fortsatt sier Connected, er DNS og ruting. Slå opp et internt navn og sjekk hvilken server som svarte; en profil uten -DnsSuffix kan tunnelere perfekt og likevel feile på hvert intranett-oppslag. Se deretter på standardruten: med delt tunnel av skal ruten 0.0.0.0/0 med lavest metrikk peke inn i VPN-grensesnittet, og med den på bare prefiksene du forventer. Hvis begge ser riktige ut og trafikken likevel dør, er problemet forbi profilen, i policyen eller gatewayfilteret.

Når tilkoblingen feiler helt, snevrer koden inn trinnet du skal gå tilbake til:

  • 691: gatewayen avviste legitimasjonen. Gå tilbake til trinn 3, ikke tunnelen.
  • 809: IKEv2-håndtrykket ble aldri fullført. Sjekk UDP 500 og 4500, og sertifikattilliten.
  • 789: den forhåndsdelte L2TP/IPsec-nøkkelen mangler eller er feil.
  • 868: servernavnet ble ikke slått opp. Fiks DNS før du redigerer profilen.

Hold den virkende kommandoen ved siden av innstillingene den koder, slik at neste person kan bygge på nytt i stedet for å reversere profilen fra UI-et. Hvis du virkelig må bygge på nytt, slett oppføringen og opprett den på nytt med de samme parameterne; å lappe en halvkonfigurert profil etterlater utdaterte ruter og autentiseringstilstand. Og hvis filen aldri var native, gå tilbake til klienten som eier den. En .ovpn kledd ut som IKEv2-profil er ikke en import, det er en støttebillett.

Relaterte artikler