Importowanie profilu VPN w PowerShellu za pomocą Add-VpnConnection
Add-VpnConnection buduje wyłącznie natywne profile Windows. Dopasuj parę tunel i uwierzytelnianie do bramy, świadomie ustaw zakres, a potem przetestuj trasy i DNS.
Nie ma cmdletu Import-VpnProfile, a ten, który wygląda najbliżej, Add-VpnConnection, nigdy nie czyta pliku .ovpn ani .conf. Składa on natywny profil Windows z parametrów, które podajesz, dlatego pierwszym punktem kontrolnym jest tutaj format pliku, a nie wiersz poleceń. Jeśli brama mówi w SSTP, IKEv2, L2TP/IPsec lub PPTP, Windows może przejąć profil i reszta listy obowiązuje. Jeśli dostałeś plik OpenVPN lub WireGuard, zatrzymaj się na pierwszym kroku: te klienty mają własne importy.
Krok 1: potwierdź, którym profilem Windows naprawdę może zarządzać
Uruchom Get-Command -Module VpnClient na maszynie, zanim cokolwiek innego. Windows 10, Windows 11 oraz Server 2016 i nowsze dostarczają ten moduł; jeśli go brakuje, żaden skopiowany skrypt nie sprawi, że ten host przyjmie natywny profil. Istotne cmdlety to Add-VpnConnection, Get-VpnConnection i Remove-VpnConnection, a lista parametrów w dokumentacji Add-VpnConnection jest warta jednego pełnego czytania.
Natywny oznacza, że stos VPN w Windows kończy tunel. Obejmuje to IKEv2, często z certyfikatem komputera; SSTP, czyli TLS z uwierzytelnianiem użytkownika lub certyfikatu w środku; oraz L2TP/IPsec z kluczem współdzielonym. Plik .ovpn to skrypt OpenVPN, a nie połączenie Windows: niesie dyrektywy takie jak remote, cipher czy tls-auth, których stos Windows w ogóle nie zna. Plik .conf WireGuard to ta sama historia z PrivateKey i AllowedIPs; zamiana jednego w drugi nie jest wyborem parametru, lecz inną implementacją tunelu.
Jest jeszcze trzecia gałąź. Jeśli administrator wręczy ci dokument XML VPNv2 CSP albo profil Intune, to ścieżka MDM, stosowana przez stos aprowizacji, a nie przez Add-VpnConnection. Nie tłumacz tych nazw węzłów na parametry PowerShell; zapytaj, jaki mechanizm stosuje ten XML.
Krok 2: dopasuj typ tunelu do metody uwierzytelniania
-TunnelType i -AuthenticationMethod to osobne parametry, a bramę interesuje tylko ich połączenie. Jedno dobrze, drugie źle i masz profil, który nigdzie się nie łączy albo zawiesza się, gdy tunel już stoi. Ustaw oba jawnie, zamiast ufać wartości domyślnej wybranej dla innej usługi.
- IKEv2 z MachineCertificate: klient przedstawia certyfikat komputera; ustaw też -EncryptionLevel Required.
- SSTP z Eap: najpierw tunel TLS, potem PEAP/MSCHAPv2 albo certyfikat wewnątrz EAP. To wymaga XML z kroku 3.
- SSTP, L2TP lub PPTP z MSChapv2, Chap lub Pap: zwykła nazwa użytkownika i hasło, bez bloba EAP.
- L2TP z MSChapv2 i -Lt2pPsk: PSK pokrywa połowę IPsec, użytkownik pokrywa PPP; oba muszą się zgadzać z serwerem.
Splat trzyma wartości w jednym miejscu:
$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 zwraca obiekt, który Windows właśnie zapisał, więc możesz go obejrzeć bez drugiego wywołania. Jeśli nazwa już istnieje, cmdlet odmawia uruchomienia; -Force ją nadpisuje, co jest złym odruchem na produkcyjnym laptopie, bo po cichu wyrzuca to, co ktoś ustawił ręcznie.
Krok 3: przekaż materiał poświadczeń poprawnie
Hasła, klucze współdzielone i bloby EAP to miejsce, w którym te skrypty zwykle się psują. -EapConfigXmlStream chce XmlDocument, a nie ścieżki, więc najpierw odczytaj plik i rzutuj go. Przekazanie łańcucha daje błąd konwersji, który brzmi jak problem ze schematem i każe ludziom przepisywać XML, który nigdy nie był błędny.
$eap = [xml](Get-Content -Raw .\peap-mschapv2.xml)
Add-VpnConnection -Name "Corp SSTP" -ServerAddress "sstp.example.com" `
-TunnelType Sstp -AuthenticationMethod Eap `
-EapConfigXmlStream $eap -EncryptionLevel RequiredTego XML nie wymyśla się z fragmentu bloga. Nazywa on typ metody EAP i uwierzytelnianie wewnętrzne, a brama porównuje oba ze swoją polityką. Niedopasowana metoda wewnętrzna zawodzi po zakończeniu uzgadniania TLS, co wygląda dokładnie jak złe hasło i nim nie jest. Weź XML od osoby zarządzającej bramą albo wyeksportuj go z profilu, który już działa.
W IKEv2 połowa certyfikatowa to wyszukiwanie w magazynie. -MachineCertificateIssuerFilter przyjmuje obiekt certyfikatu, a Windows używa go do znalezienia nadającego się certyfikatu klienta w LocalMachine\My. Certyfikat potrzebuje klucza prywatnego i łańcucha, któremu serwer ufa; gdy brakuje któregokolwiek, uwierzytelnianie zawodzi bez użytecznego szczegółu, więc najpierw sprawdź magazyn:
Get-ChildItem Cert:\LocalMachine\My |
Where-Object { $_.HasPrivateKey -and $_.NotAfter -gt (Get-Date) } |
Select-Object Subject, Issuer, Thumbprint, NotAfterTrzymaj sekrety poza plikiem skryptu. PSK przekazany w wierszu poleceń albo wklejony do .ps1 trafia do transkrypcji, zapisanych sesji i współdzielonych repozytoriów, a -RememberCredential zapisuje poświadczenia użytkownika na później, zamieniając jednorazowy test w trwałe uprawnienie.
Krok 4: zdecyduj o zakresie przed pierwszym uruchomieniem
Ten sam cmdlet pisze do dwóch różnych książek telefonicznych. Bez -AllUserConnection profil należy do ciebie i leży w %APPDATA\Microsoft\Network\Connections\Pbk\rasphone.pbk. Z nim, z podniesionego wiersza poleceń, profil trafia do %ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk i jest widoczny dla każdego konta, łącznie z ekranem logowania.
Zakres nie jest kosmetyczny. Profil dla wszystkich użytkowników to coś, czego może użyć konto usługi, zadanie harmonogramu albo scenariusz przed logowaniem; profil dla pojedynczego użytkownika jest dla tych trzech niewidoczny. Obiekty czyta się też inaczej: Get-VpnConnection listuje wpisy bieżącego użytkownika, Get-VpnConnection -AllUserConnection te obejmujące całą maszynę. Wybierz jeden teraz, a późniejszą zmianę traktuj jak usunięcie i odtworzenie, nie jak edycję:
# elevated prompt
Remove-VpnConnection -Name "Corp IKEv2" -Force
Add-VpnConnection -Name "Corp IKEv2" -ServerAddress "vpn.example.com" `
-TunnelType Ikev2 -AuthenticationMethod MachineCertificate `
-EncryptionLevel Required -AllUserConnectionKrok 5: sprawdź, co tunel naprawdę musi dostarczyć
Ikona połączenia dowodzi, że tunel wstał, i niczego więcej. Połącz się najpierw z wiersza poleceń, żeby awarie przychodziły jako tekst, a nie okno dialogowe, a potem odczytaj, co Windows zapisał:
rasdial "Corp IKEv2"
Get-VpnConnection -Name "Corp IKEv2" |
Select-Object Name, ServerAddress, TunnelType, ConnectionStatus, SplitTunneling
Get-NetRoute -DestinationPrefix "0.0.0.0/0"Dwie awarie zgłaszane przez użytkowników, gdy status wciąż mówi Połączono, to DNS i routing. Rozwiąż nazwę wewnętrzną i sprawdź, który serwer odpowiedział; profil bez -DnsSuffix może tunelować bez zarzutu i wciąż zawodzić przy każdym odczycie z intranetu. Potem spójrz na trasę domyślną: przy wyłączonym split tunelingu trasa 0.0.0.0/0 o najniższej metryce powinna wskazywać interfejs VPN, a przy włączonym tylko prefiksy, których oczekujesz. Jeśli oba wyglądają dobrze, a ruch nadal ginie, problem jest dalej niż profil, w polityce albo filtrze bramy.
Gdy połączenie zawodzi zupełnie, kod zawęża krok do powtórzenia:
- 691: brama odrzuciła poświadczenia. Wróć do kroku 3, nie do tunelu.
- 809: uzgadnianie IKEv2 nigdy się nie zakończyło. Sprawdź UDP 500 i 4500 oraz zaufanie do certyfikatu.
- 789: brakuje klucza współdzielonego L2TP/IPsec albo jest błędny.
- 868: nazwa serwera się nie rozwiązała. Napraw DNS, zanim zaczniesz edytować profil.
Trzymaj działające polecenie obok ustawień, które koduje, żeby następna osoba mogła odtworzyć profil, a nie odtwarzać go inżynierią wsteczną z interfejsu. Jeśli naprawdę musisz go odtworzyć, usuń wpis i utwórz go ponownie z tych samych parametrów; łatanie na wpół skonfigurowanego profilu zostawia po sobie nieaktualne trasy i stan uwierzytelniania. A jeśli plik nigdy nie był natywny, wróć do klienta, który jest jego właścicielem. Plik .ovpn przebrany za profil IKEv2 to nie import, to zgłoszenie do pomocy technicznej.