No existeix cap cmdlet Import-VpnProfile, i el que més s'hi assembla, Add-VpnConnection, no llegeix mai un fitxer .ovpn o .conf. Construeix un perfil natiu de Windows a partir dels paràmetres que li passeu, i per això el primer punt de control aquí és el format del fitxer i no la línia d'ordres. Si la passarel·la parla SSTP, IKEv2, L2TP/IPsec o PPTP, Windows pot posseir el perfil i la resta de la llista s'aplica. Si us han donat un fitxer OpenVPN o WireGuard, atureu-vos al primer pas: aquests clients tenen els seus propis importadors.

Pas 1: Confirmeu quin perfil pot posseir realment Windows

Executeu Get-Command -Module VpnClient a la màquina abans que res. Windows 10, Windows 11 i Server 2016 o posterior inclouen el mòdul; si hi falta, cap script copiat farà que aquest amfitrió accepti un perfil natiu. Els cmdlets que importen són Add-VpnConnection, Get-VpnConnection i Remove-VpnConnection, i la llista de paràmetres de la referència d'Add-VpnConnection val la pena llegir-la sencera una vegada.

Natiu vol dir que la pila VPN de Windows acaba el túnel. Això cobreix IKEv2, sovint amb un certificat de màquina; SSTP, que és TLS amb autenticació d'usuari o de certificat a dins; i L2TP/IPsec amb una clau prèviament compartida. Un fitxer .ovpn és un script OpenVPN, no una connexió de Windows: porta directrius com remote, cipher o tls-auth que la pila de Windows no coneix. Un .conf de WireGuard és la mateixa història amb PrivateKey i AllowedIPs; convertir-ne un en l'altre no és una tria de paràmetres sinó una altra implementació de túnel.

Hi ha una tercera branca. Si un administrador us lliura un document XML de VPNv2 CSP o un perfil d'Intune, aquest és el camí MDM, aplicat per la pila d'aprovisionament i no per Add-VpnConnection. No traduïu aquests noms de node a paràmetres de PowerShell; pregunteu quin mecanisme aplica l'XML.

Pas 2: Aparelleu el tipus de túnel amb el mètode d'autenticació

-TunnelType i -AuthenticationMethod són paràmetres separats, i a la passarel·la només li importa la combinació. Encerta un i falla l'altre i obtindreu un perfil que no es connecta enlloc, o que s'encalla amb el túnel ja aixecat. Establiu tots dos explícitament en lloc de confiar en un valor per defecte triat per a un altre servei.

  • IKEv2 amb MachineCertificate: el client presenta un certificat d'ordinador; establiu també -EncryptionLevel Required.
  • SSTP amb Eap: primer el túnel TLS, després PEAP/MSCHAPv2 o un certificat dins d'EAP. Això necessita l'XML del pas 3.
  • SSTP, L2TP o PPTP amb MSChapv2, Chap o Pap: nom d'usuari i contrasenya normals, sense blob EAP.
  • L2TP amb MSChapv2 i -Lt2pPsk: la PSK cobreix la meitat IPsec, l'usuari cobreix PPP; tots dos han de coincidir amb el servidor.

Un splat manté els valors en un sol lloc:

$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 retorna l'objecte que Windows acaba d'escriure, així que el podeu inspeccionar sense una segona crida. Si el nom ja existeix, el cmdlet es nega a executar-se; -Force el sobreescriu, que és el reflex equivocat en un portàtil de producció perquè descarta en silenci el que algú ha configurat a mà.

Pas 3: Lliureu el material de credencials correctament

Les contrasenyes, les claus prèviament compartides i els blobs EAP són on aquests scripts solen trencar-se. -EapConfigXmlStream vol un XmlDocument, no un camí, així que llegiu i convertiu el fitxer primer. Passar una cadena produeix un error de conversió que sembla un problema d'esquema i fa que la gent reescrigui XML que mai no era incorrecte.

$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

Aquest XML no és una cosa per inventar a partir d'un fragment de blog. Anomena el tipus de mètode EAP i l'autenticació interna, i la passarel·la compara tots dos amb la seva política. Un mètode intern que no coincideix falla després que l'handshake TLS s'hagi completat, cosa que sembla exactament una contrasenya dolenta i no ho és. Agafeu l'XML de qui gestiona la passarel·la, o exporteu-lo d'un perfil que ja funcioni.

Per a IKEv2 la part del certificat és una cerca al magatzem. -MachineCertificateIssuerFilter pren un objecte de certificat, i Windows l'usa per trobar un certificat de client utilitzable a LocalMachine\My. El certificat necessita una clau privada i una cadena en què el servidor confiï; quan en falta qualsevol, l'autenticació falla sense cap detall útil, així que mireu primer el magatzem:

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

Manteniu els secrets fora del fitxer d'script. Una PSK passada a la línia d'ordres o incrustada en un .ps1 acaba en transcripcions, sessions desades i repositoris compartits, i -RememberCredential guarda les credencials de l'usuari per a més endavant, convertint una prova puntual en un permís permanent.

Pas 4: Decidiu l'abast abans de la primera execució

El mateix cmdlet escriu en dues llibretes de telèfon diferents. Sense -AllUserConnection el perfil és vostre i viu a %APPDATA%\Microsoft\Network\Connections\Pbk\rasphone.pbk. Amb aquesta opció, des d'un símbol del sistema elevat, el perfil va a %ProgramData%\Microsoft\Network\Connections\Pbk\rasphone.pbk i és visible per a tots els comptes, inclosa la pantalla d'inici de sessió.

L'abast no és cosmètic. Un perfil per a tots els usuaris és el que poden fer servir un compte de servei, una tasca programada o un escenari previ a l'inici de sessió; un perfil per usuari és invisible per als tres. Els objectes també es llegeixen de manera diferent: Get-VpnConnection llista les entrades de l'usuari actual, Get-VpnConnection -AllUserConnection les de tota la màquina. Trieu-ne un ara i tracteu un canvi posterior com a esborrar i recrear, no com a editar:

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

Pas 5: Proveu què ha de lliurar realment un túnel

Una icona connectada demostra que el túnel ha pujat i res més. Connecteu-vos primer des de la línia d'ordres perquè les fallades arribin com a text i no com a diàleg, i després llegiu què ha registrat Windows:

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

Les dues fallades que els usuaris reporten mentre l'estat encara diu Connected són DNS i encaminament. Resoleu un nom intern i comproveu quin servidor ha respost; un perfil sense -DnsSuffix pot tunelar perfectament i tot i així fallar en cada consulta d'intranet. Després mireu la ruta per defecte: amb l'split tunneling desactivat, la ruta 0.0.0.0/0 de mètrica més baixa ha d'apuntar a la interfície VPN, i amb ell activat només els prefixos que espereu. Si tots dos semblen correctes i el trànsit encara mor, el problema és més enllà del perfil, en la política o el filtre de la passarel·la.

Quan la connexió falla del tot, el codi acota el pas al qual cal tornar:

  • 691: la passarel·la ha rebutjat les credencials. Torneu al pas 3, no al túnel.
  • 809: l'handshake IKEv2 no s'ha completat mai. Comproveu UDP 500 i 4500, i la confiança en els certificats.
  • 789: falta la clau prèviament compartida de L2TP/IPsec o és incorrecta.
  • 868: el nom del servidor no s'ha resolt. Arregleu el DNS abans d'editar el perfil.

Manteniu l'ordre que funciona al costat de la configuració que codifica, perquè la propera persona pugui reconstruir en lloc d'enginyeria inversa del perfil des de la interfície. Si heu de reconstruir, esborreu l'entrada i torneu-la a crear amb els mateixos paràmetres; pedaçar un perfil mig configurat deixa rutes i estat d'autenticació obsolets. I si el fitxer mai no va ser natiu, torneu al client que el posseeix. Un .ovpn disfressat de perfil IKEv2 no és una importació, és un tiquet de suport.

Articles relacionats