Nhập hồ sơ VPN trong PowerShell bằng Add-VpnConnection
Add-VpnConnection chỉ tạo hồ sơ Windows gốc. Ghép cặp đường hầm và xác thực với cổng, đặt phạm vi một cách có chủ đích, rồi kiểm tra tuyến và DNS.
Không có cmdlet Import-VpnProfile, và thứ trông gần nhất, Add-VpnConnection, không bao giờ đọc tệp .ovpn hay .conf. Nó lắp ghép một hồ sơ Windows gốc từ các tham số bạn truyền vào, nên điểm kiểm tra đầu tiên ở đây là định dạng tệp chứ không phải dòng lệnh. Nếu cổng nói SSTP, IKEv2, L2TP/IPsec hoặc PPTP, Windows có thể sở hữu hồ sơ và phần còn lại của danh sách vẫn áp dụng. Nếu bạn được đưa cho tệp OpenVPN hoặc WireGuard, hãy dừng ở bước một: các ứng dụng đó sở hữu trình nhập của riêng chúng.
Bước 1: Xác nhận hồ sơ mà Windows thực sự có thể sở hữu
Trước hết hãy chạy Get-Command -Module VpnClient trên máy. Windows 10, Windows 11 và Server 2016 trở lên có sẵn mô-đun này; nếu thiếu, không bản sao kịch bản nào khiến máy chủ này chấp nhận hồ sơ gốc. Các cmdlet quan trọng là Add-VpnConnection, Get-VpnConnection và Remove-VpnConnection, và danh sách tham số trong tài liệu tham chiếu Add-VpnConnection đáng đọc trọn một lần.
Gốc nghĩa là ngăn xếp VPN của Windows kết thúc đường hầm. Điều đó bao gồm IKEv2, thường với chứng chỉ máy; SSTP, tức TLS có xác thực người dùng hoặc chứng chỉ bên trong; và L2TP/IPsec với khóa chia sẻ trước. Tệp .ovpn là kịch bản OpenVPN, không phải kết nối Windows: nó mang các chỉ thị như remote, cipher hay tls-auth mà ngăn xếp Windows hoàn toàn không hiểu. .conf của WireGuard cũng vậy với PrivateKey và AllowedIPs; chuyển cái này thành cái kia không phải chọn tham số mà là một cách hiện thực đường hầm khác.
Có nhánh thứ ba. Nếu quản trị viên đưa bạn tài liệu XML VPNv2 CSP hoặc hồ sơ Intune, đó là đường MDM, do ngăn xếp cung cấp áp dụng chứ không phải Add-VpnConnection. Đừng dịch các tên nút đó thành tham số PowerShell; thay vào đó hãy hỏi cơ chế nào áp dụng XML.
Bước 2: Ghép loại đường hầm với phương thức xác thực
-TunnelType và -AuthenticationMethod là hai tham số riêng, và cổng chỉ quan tâm đến tổ hợp. Đúng một cái sai cái kia, bạn sẽ có hồ sơ không kết nối được gì, hoặc treo trong khi đường hầm đã lên. Hãy đặt cả hai một cách tường minh thay vì tin vào mặc định được chọn cho dịch vụ khác.
- IKEv2 với MachineCertificate: ứng dụng xuất trình chứng chỉ máy tính; đồng thời đặt -EncryptionLevel Required.
- SSTP với Eap: đường hầm TLS trước, rồi PEAP/MSCHAPv2 hoặc chứng chỉ bên trong EAP. Việc này cần XML ở bước 3.
- SSTP, L2TP hoặc PPTP với MSChapv2, Chap hoặc Pap: tên người dùng và mật khẩu thường, không có EAP blob.
- L2TP với MSChapv2 và -Lt2pPsk: PSK phủ nửa IPsec, người dùng phủ PPP; cả hai phải khớp với máy chủ.
splat giữ các giá trị ở một chỗ:
$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 trả về đối tượng Windows vừa ghi, nên bạn có thể xem nó mà không cần gọi lần hai. Nếu tên đã tồn tại, cmdlet từ chối chạy; -Force ghi đè nó, đây là phản xạ sai trên máy tính xách tay sản xuất vì nó âm thầm vứt bỏ những gì ai đó đã cấu hình bằng tay.
Bước 3: Trao vật liệu xác thực đúng cách
Mật khẩu, khóa chia sẻ trước và EAP blob là chỗ các kịch bản này thường gãy. -EapConfigXmlStream cần XmlDocument chứ không phải đường dẫn, nên hãy đọc và ép kiểu tệp trước. Truyền một chuỗi tạo ra lỗi chuyển đổi nghe như vấn đề lược đồ và khiến người ta viết lại đoạn XML vốn không hề sai.
$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 đó không phải thứ để tự bịa từ một đoạn blog. Nó nêu loại phương thức EAP và xác thực bên trong, và cổng so cả hai với chính sách của nó. Phương thức bên trong không khớp sẽ thất bại sau khi bắt tay TLS hoàn tất, trông đúng như mật khẩu sai và không phải thế. Hãy lấy XML từ người vận hành cổng, hoặc xuất nó từ một hồ sơ đã hoạt động.
Với IKEv2, nửa chứng chỉ là một lần tra kho. -MachineCertificateIssuerFilter nhận một đối tượng chứng chỉ, và Windows dùng nó để tìm chứng chỉ máy khách dùng được trong LocalMachine\My. Chứng chỉ cần khóa riêng và chuỗi mà máy chủ tin cậy; thiếu một trong hai thì xác thực thất bại mà không có chi tiết hữu ích, nên hãy kiểm tra kho trước:
Get-ChildItem Cert:\LocalMachine\My |
Where-Object { $_.HasPrivateKey -and $_.NotAfter -gt (Get-Date) } |
Select-Object Subject, Issuer, Thumbprint, NotAfterGiữ bí mật ra ngoài tệp kịch bản. PSK truyền trên dòng lệnh hoặc nhúng vào .ps1 sẽ nằm trong bản ghi, phiên đã lưu và kho chia sẻ, còn -RememberCredential lưu đệm thông tin đăng nhập cho sau này, biến một lần thử thành quyền truy cập lâu dài.
Bước 4: Quyết định phạm vi trước lần chạy đầu
Cùng một cmdlet ghi vào hai sổ điện thoại khác nhau. Không có -AllUserConnection, hồ sơ thuộc về bạn và nằm dưới %APPDATA%\Microsoft\Network\Connections\Pbk\rasphone.pbk. Có nó, từ dấu nhắc nâng quyền, hồ sơ hiển thị với mọi tài khoản, kể cả màn hình đăng nhập, và rơi vào %ProgramData%\Microsoft\Network\Connections\Pbk\rasphone.pbk.
Phạm vi không phải chuyện hình thức. Hồ sơ toàn người dùng là thứ tài khoản dịch vụ, tác vụ đã lập lịch hay kịch bản trước đăng nhập dùng được; hồ sơ một người dùng thì cả ba đều không thấy. Cách đọc đối tượng cũng khác: Get-VpnConnection liệt kê mục của người dùng hiện tại, Get-VpnConnection -AllUserConnection liệt kê mục toàn máy. Chọn một ngay bây giờ, và coi thay đổi về sau là xóa rồi tạo lại chứ không phải sửa:
# elevated prompt
Remove-VpnConnection -Name "Corp IKEv2" -Force
Add-VpnConnection -Name "Corp IKEv2" -ServerAddress "vpn.example.com" `
-TunnelType Ikev2 -AuthenticationMethod MachineCertificate `
-EncryptionLevel Required -AllUserConnectionBước 5: Kiểm tra đường hầm thực sự phải cung cấp gì
Biểu tượng đã kết nối chỉ chứng minh đường hầm đã lên, không gì khác. Hãy kết nối từ dòng lệnh trước để lỗi đến dưới dạng văn bản chứ không phải hộp thoại, rồi đọc lại những gì Windows ghi nhận:
rasdial "Corp IKEv2"
Get-VpnConnection -Name "Corp IKEv2" |
Select-Object Name, ServerAddress, TunnelType, ConnectionStatus, SplitTunneling
Get-NetRoute -DestinationPrefix "0.0.0.0/0"Hai lỗi người dùng báo cáo khi trạng thái vẫn ghi Đã kết nối là DNS và định tuyến. Phân giải một tên nội bộ và xem máy chủ nào trả lời; hồ sơ không có -DnsSuffix có thể tạo đường hầm hoàn hảo mà vẫn hỏng mọi truy vấn intranet. Sau đó xem tuyến mặc định: khi tắt chia tách đường hầm, tuyến 0.0.0.0/0 có metric thấp nhất phải trỏ vào giao diện VPN, khi bật thì chỉ những tiền tố bạn mong đợi. Nếu cả hai đều trông đúng mà lưu lượng vẫn chết, vấn đề nằm ngoài hồ sơ, trong chính sách hoặc bộ lọc của cổng.
Khi kết nối hỏng hoàn toàn, mã lỗi thu hẹp bước cần xem lại:
- 691: cổng từ chối thông tin đăng nhập. Quay lại bước 3, không phải đường hầm.
- 809: bắt tay IKEv2 không bao giờ hoàn tất. Kiểm tra UDP 500 và 4500, và sự tin cậy chứng chỉ.
- 789: khóa chia sẻ trước L2TP/IPsec thiếu hoặc sai.
- 868: tên máy chủ không phân giải được. Sửa DNS trước khi sửa hồ sơ.
Giữ lệnh đang chạy được bên cạnh các thiết lập mà nó mã hóa, để người tiếp theo có thể dựng lại thay vì dịch ngược hồ sơ từ giao diện. Nếu buộc phải dựng lại, hãy xóa mục và tạo lại bằng đúng các tham số đó; vá một hồ sơ cấu hình dở sẽ để lại tuyến cũ và trạng thái xác thực. Và nếu tệp chưa bao giờ là gốc, hãy quay lại ứng dụng sở hữu nó. Một .ovpn khoác áo hồ sơ IKEv2 không phải nhập, đó là phiếu hỗ trợ.