Importarea unui profil VPN în PowerShell cu Add-VpnConnection
Add-VpnConnection construiește doar profiluri Windows native. Potrivește perechea tunel și autentificare la gateway, stabilește conștient domeniul, apoi testează rutele și DNS.
Nu există un cmdlet Import-VpnProfile, iar cel care pare cel mai apropiat, Add-VpnConnection, nu citește niciodată un fișier .ovpn sau .conf. El compune un profil Windows nativ din parametrii pe care îi dai, motiv pentru care primul punct de control aici este formatul fișierului, nu linia de comandă. Dacă gateway-ul vorbește SSTP, IKEv2, L2TP/IPsec sau PPTP, Windows poate deține profilul și restul listei se aplică. Dacă ai primit un fișier OpenVPN sau WireGuard, oprește-te la pasul unu: acei clienți au propriii importatori.
Pasul 1: confirmă ce profil poate deține Windows cu adevărat
Rulează Get-Command -Module VpnClient pe mașină înainte de orice altceva. Windows 10, Windows 11 și Server 2016 sau mai nou livrează modulul; dacă lipsește, niciun script copiat nu va face acest host să accepte un profil nativ. Cmdleturile care contează sunt Add-VpnConnection, Get-VpnConnection și Remove-VpnConnection, iar lista de parametri din referința Add-VpnConnection merită citită o dată integral.
Nativ înseamnă că stiva VPN din Windows termină tunelul. Asta acoperă IKEv2, adesea cu un certificat de mașină; SSTP, care este TLS cu autentificare de utilizator sau cu certificat în interior; și L2TP/IPsec cu o cheie prepartajată. Un fișier .ovpn este un script OpenVPN, nu o conexiune Windows: poartă directive precum remote, cipher sau tls-auth de care stiva Windows nu are habar. Un .conf WireGuard este aceeași poveste cu PrivateKey și AllowedIPs; a converti unul în altul nu este o alegere de parametri, ci o altă implementare de tunel.
Există o a treia ramură. Dacă un administrator îți dă un document XML VPNv2 CSP sau un profil Intune, aceea este calea MDM, aplicată de stiva de provisionare, nu de Add-VpnConnection. Nu traduce acele nume de noduri în parametri PowerShell; întreabă ce mecanism aplică XML-ul.
Pasul 2: asociază tipul de tunel cu metoda de autentificare
-TunnelType și -AuthenticationMethod sunt parametri separați, iar gateway-ului îi pasă doar de combinație. Dacă una e corectă și cealaltă greșită, obții un profil care nu se conectează nicăieri sau care se blochează cu tunelul deja ridicat. Setează-le pe amândouă explicit, în loc să te bazezi pe o valoare implicită aleasă pentru alt serviciu.
- IKEv2 cu MachineCertificate: clientul prezintă un certificat de computer; setează și -EncryptionLevel Required.
- SSTP cu Eap: mai întâi tunelul TLS, apoi PEAP/MSCHAPv2 sau un certificat în interiorul EAP. Asta cere XML-ul de la pasul 3.
- SSTP, L2TP sau PPTP cu MSChapv2, Chap sau Pap: nume de utilizator și parolă simple, fără blob EAP.
- L2TP cu MSChapv2 și -Lt2pPsk: PSK-ul acoperă jumătatea IPsec, utilizatorul acoperă PPP; ambele trebuie să corespundă serverului.
Un splat ține valorile într-un singur loc:
$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 întoarce obiectul pe care Windows tocmai l-a scris, așa că îl poți inspecta fără un al doilea apel. Dacă numele există deja, cmdletul refuză să ruleze; -Force îl suprascrie, ceea ce este reflexul greșit pe un laptop de producție, pentru că aruncă fără zgomot ce a configurat cineva manual.
Pasul 3: predă materialul de acreditare corect
Parolele, cheile prepartajate și blocurile EAP sunt locul unde aceste scripturi se strică de obicei. -EapConfigXmlStream vrea un XmlDocument, nu o cale, așa că citește și convertește fișierul mai întâi. Transmiterea unui șir produce o eroare de conversie care sună ca o problemă de schemă și îi face pe oameni să rescrie un XML care nu a fost niciodată greșit.
$eap = [xml](Get-Content -Raw .\peap-mschapv2.xml)
Add-VpnConnection -Name "Corp SSTP" -ServerAddress "sstp.example.com" `
-TunnelType Sstp -AuthenticationMethod Eap `
-EapConfigXmlStream $eap -EncryptionLevel RequiredXML-ul acela nu se inventează dintr-un fragment de blog. El numește tipul metodei EAP și autentificarea interioară, iar gateway-ul le compară pe amândouă cu politica lui. O metodă interioară nepotrivită eșuează după ce handshake-ul TLS se încheie, ceea ce arată exact ca o parolă greșită și nu este. Ia XML-ul de la cine administrează gateway-ul sau exportă-l dintr-un profil care funcționează deja.
Pentru IKEv2, jumătatea de certificat este o căutare în magazin. -MachineCertificateIssuerFilter primește un obiect certificat, iar Windows îl folosește ca să găsească un certificat de client utilizabil în LocalMachine\My. Certificatul are nevoie de o cheie privată și de un lanț în care serverul are încredere; când lipsește oricare dintre ele, autentificarea eșuează fără niciun detaliu util, așa că verifică întâi magazinul:
Get-ChildItem Cert:\LocalMachine\My |
Where-Object { $_.HasPrivateKey -and $_.NotAfter -gt (Get-Date) } |
Select-Object Subject, Issuer, Thumbprint, NotAfterȚine secretele în afara fișierului de script. Un PSK trecut pe linia de comandă sau turnat într-un .ps1 ajunge în transcrieri, sesiuni salvate și depozite partajate, iar -RememberCredential memorează acreditările utilizatorului pentru mai târziu, transformând un test unic într-o autorizare durabilă.
Pasul 4: decide domeniul înainte de prima rulare
Același cmdlet scrie în două agende telefonice diferite. Fără -AllUserConnection, profilul este al tău și stă sub %APPDATA\Microsoft\Network\Connections\Pbk\rasphone.pbk. Cu el, dintr-un prompt elevat, profilul merge în %ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk și este vizibil pentru fiecare cont, inclusiv pentru ecranul de autentificare.
Domeniul nu este cosmetic. Un profil pentru toți utilizatorii este ceea ce poate folosi un cont de serviciu, o sarcină programată sau un scenariu dinaintea autentificării; un profil per utilizator este invizibil pentru toate trei. Obiectele se citesc și ele diferit: Get-VpnConnection listează intrările utilizatorului curent, Get-VpnConnection -AllUserConnection le listează pe cele la nivel de mașină. Alege unul acum și tratează o schimbare ulterioară ca ștergere și recreare, nu ca editare:
# elevated prompt
Remove-VpnConnection -Name "Corp IKEv2" -Force
Add-VpnConnection -Name "Corp IKEv2" -ServerAddress "vpn.example.com" `
-TunnelType Ikev2 -AuthenticationMethod MachineCertificate `
-EncryptionLevel Required -AllUserConnectionPasul 5: testează ce trebuie să livreze de fapt un tunel
O pictogramă conectată dovedește că tunelul a urcat și nimic altceva. Conectează-te întâi din linia de comandă, ca eșecurile să vină ca text, nu ca dialog, apoi citește înapoi ce a înregistrat Windows:
rasdial "Corp IKEv2"
Get-VpnConnection -Name "Corp IKEv2" |
Select-Object Name, ServerAddress, TunnelType, ConnectionStatus, SplitTunneling
Get-NetRoute -DestinationPrefix "0.0.0.0/0"Cele două eșecuri pe care le raportează utilizatorii în timp ce starea încă spune Conectat sunt DNS și rutarea. Rezolvă un nume intern și verifică ce server a răspuns; un profil fără -DnsSuffix poate tunela perfect și totuși poate rata fiecare căutare din intranet. Apoi uită-te la ruta implicită: cu split tunneling oprit, ruta 0.0.0.0/0 cu cea mai mică metrică trebuie să indice interfața VPN, iar cu el pornit doar prefixele la care te aștepți. Dacă ambele arată bine și traficul tot moare, problema este dincolo de profil, în politică sau în filtrul gateway-ului.
Când conexiunea eșuează de tot, codul îngustează pasul de reluat:
- 691: gateway-ul a respins acreditările. Întoarce-te la pasul 3, nu la tunel.
- 809: handshake-ul IKEv2 nu s-a încheiat niciodată. Verifică UDP 500 și 4500, și încrederea în certificat.
- 789: cheia prepartajată L2TP/IPsec lipsește sau este greșită.
- 868: numele serverului nu s-a rezolvat. Repară DNS-ul înainte de a edita profilul.
Ține comanda care funcționează lângă setările pe care le codifică, ca următoarea persoană să poată reconstrui în loc să facă inginerie inversă a profilului din interfață. Dacă tot trebuie să reconstruiești, șterge intrarea și recreeaz-o din aceiași parametri; a petici un profil pe jumătate configurat lasă în urmă rute învechite și stare de autentificare. Iar dacă fișierul nu a fost niciodată nativ, întoarce-te la clientul care îl deține. Un .ovpn dichisit ca profil IKEv2 nu este o importare, este un tichet de suport.