Імпорт профілю VPN у PowerShell за допомогою Add-VpnConnection
Add-VpnConnection створює лише рідні профілі Windows. Зіставте пару тунелю й автентифікації зі шлюзом, свідомо задайте область дії, а потім перевірте маршрути та DNS.
Командлета Import-VpnProfile не існує, і той, що найбільше схожий на нього, Add-VpnConnection, ніколи не читає файл .ovpn чи .conf: він збирає рідний профіль Windows із параметрів, які ви передаєте. Тому перша контрольна точка тут — формат файлу, а не командний рядок. Якщо шлюз розмовляє SSTP, IKEv2, L2TP/IPsec чи PPTP, Windows може володіти профілем, і решта списку застосовується. Якщо вам дали файл OpenVPN або WireGuard, зупиніться на першому кроці: ці клієнти мають власні імпортери.
Крок 1: Підтвердьте профіль, яким Windows справді може володіти
Спершу виконайте на машині Get-Command -Module VpnClient. Windows 10, Windows 11 і Server 2016 або новіші постачаються з цим модулем; якщо його немає, жоден скопійований скрипт не змусить цей хост прийняти рідний профіль. Важливі командлети — Add-VpnConnection, Get-VpnConnection і Remove-VpnConnection, а список параметрів у довідці Add-VpnConnection варто один раз прочитати повністю.
Рідний означає, що тунель завершує стек Windows VPN. Це охоплює IKEv2, часто з сертифікатом машини; SSTP, тобто TLS із автентифікацією користувача або сертифіката всередині; і L2TP/IPsec із попередньо спільним ключем. Файл .ovpn — це скрипт OpenVPN, а не з'єднання Windows: він несе директиви на кшталт remote, cipher чи tls-auth, про які стек Windows не має жодного уявлення. Файл .conf WireGuard — та сама історія з PrivateKey та AllowedIPs; перетворити одне на інше — це не вибір параметра, а інша реалізація тунелю.
Є третя гілка. Якщо адміністратор дає вам XML-документ VPNv2 CSP або профіль Intune, це шлях MDM, який застосовує стек підготовки, а не Add-VpnConnection. Не перекладайте ці назви вузлів у параметри PowerShell; натомість запитайте, який механізм застосовує XML.
Крок 2: Зіставте тип тунелю з методом автентифікації
-TunnelType і -AuthenticationMethod — окремі параметри, і шлюзу важлива лише комбінація. Якщо одне правильне, а інше хибне, ви отримаєте профіль, який нікуди не підключається або зависає, коли тунель уже піднято. Задавайте обидва явно, а не довіряйте типовому значенню, вибраному для іншої служби.
- IKEv2 з MachineCertificate: клієнт подає сертифікат комп'ютера; також задайте -EncryptionLevel Required.
- SSTP з Eap: спершу TLS-тунель, потім PEAP/MSCHAPv2 або сертифікат усередині EAP. Для цього потрібен XML із кроку 3.
- SSTP, L2TP чи PPTP з MSChapv2, Chap або Pap: звичайні ім'я користувача й пароль, без EAP-блоба.
- L2TP з MSChapv2 і -Lt2pPsk: PSK покриває частину IPsec, користувач — PPP; обидва мають збігатися із сервером.
Splat тримає значення в одному місці:
$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 повертає об'єкт, який Windows щойно записав, тож ви можете оглянути його без другого виклику. Якщо назва вже існує, командлет відмовляється працювати; -Force перезаписує її, що є хибним рефлексом на робочому ноутбуці, бо тихо відкидає те, що хтось налаштував вручну.
Крок 3: Передайте матеріал облікових даних правильно
Паролі, попередньо спільні ключі і EAP-блоби — це те, на чому ці скрипти зазвичай ламаються. -EapConfigXmlStream хоче XmlDocument, а не шлях, тому спершу прочитайте файл і приведіть тип. Передача рядка дає помилку перетворення, що звучить як проблема схеми, і змушує людей переписувати XML, який ніколи не був хибним.
$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Цей XML не варто вигадувати з уривка блогу. Він називає тип методу EAP і внутрішню автентифікацію, і шлюз порівнює обидва зі своєю політикою. Невідповідний внутрішній метод зазнає невдачі після завершення TLS-рукостискання, що виглядає точно як поганий пароль і ним не є. Беріть XML у того, хто керує шлюзом, або експортуйте його з профілю, який уже працює.
Для IKEv2 половина із сертифікатом — це пошук у сховищі. -MachineCertificateIssuerFilter приймає об'єкт сертифіката, і Windows використовує його, щоб знайти придатний клієнтський сертифікат у LocalMachine\My. Сертифікату потрібен закритий ключ і ланцюг, якому довіряє сервер; якщо бракує чогось, автентифікація не вдається без корисної інформації, тож спершу перевірте сховище:
Get-ChildItem Cert:\LocalMachine\My |
Where-Object { $_.HasPrivateKey -and $_.NotAfter -gt (Get-Date) } |
Select-Object Subject, Issuer, Thumbprint, NotAfterТримайте секрети поза файлом скрипту. PSK, переданий у командному рядку або вшитий у .ps1, потрапляє до журналів, збережених сеансів і спільних сховищ, а -RememberCredential кешує облікові дані користувача на потім, перетворюючи разовий тест на тривалий дозвіл.
Крок 4: Визначте область дії до першого запуску
Той самий командлет пише до двох різних телефонних книг. Без -AllUserConnection профіль належить вам і живе в %APPDATA%\Microsoft\Network\Connections\Pbk\rasphone.pbk. З ним, із підвищеного запиту, профіль бачать усі облікові записи, включно з екраном входу, і він потрапляє до %ProgramData%\Microsoft\Network\Connections\Pbk\rasphone.pbk.
Область дії — не косметика. Профіль для всіх користувачів — це те, що можуть використовувати службовий обліковий запис, заплановане завдання чи сценарій до входу; профіль для одного користувача невидимий для всіх трьох. Об'єкти читаються по-різному: Get-VpnConnection перелічує записи поточного користувача, Get-VpnConnection -AllUserConnection — загальномашинні. Виберіть один зараз, а пізнішу зміну трактуйте як видалення й повторне створення, а не редагування:
# elevated prompt
Remove-VpnConnection -Name "Corp IKEv2" -Force
Add-VpnConnection -Name "Corp IKEv2" -ServerAddress "vpn.example.com" `
-TunnelType Ikev2 -AuthenticationMethod MachineCertificate `
-EncryptionLevel Required -AllUserConnectionКрок 5: Перевірте, що тунель насправді має доставляти
Підключена іконка доводить, що тунель піднявся, і більше нічого. Спершу підключіться з командного рядка, щоб збої приходили текстом, а не діалогом, а потім прочитайте, що записав Windows:
rasdial "Corp IKEv2"
Get-VpnConnection -Name "Corp IKEv2" |
Select-Object Name, ServerAddress, TunnelType, ConnectionStatus, SplitTunneling
Get-NetRoute -DestinationPrefix "0.0.0.0/0"Дві несправності, про які користувачі повідомляють, коли статус усе ще каже Підключено, — це DNS і маршрутизація. Розв'яжіть внутрішнє ім'я і перевірте, який сервер відповів; профіль без -DnsSuffix може чудово тунелювати й усе одно провалювати кожен пошук в інтранеті. Потім подивіться на маршрут за замовчуванням: коли роздільне тунелювання вимкнене, маршрут 0.0.0.0/0 із найнижшою метрикою має вказувати в інтерфейс VPN, а коли ввімкнене — лише очікувані вами префікси. Якщо обидва виглядають правильно, а трафік усе одно гине, проблема поза профілем — у політиці або фільтрі шлюзу.
Коли з'єднання не вдається цілком, код звужує крок, до якого слід повернутися:
- 691: шлюз відхилив облікові дані. Поверніться до кроку 3, а не до тунелю.
- 809: рукостискання IKEv2 так і не завершилося. Перевірте UDP 500 і 4500 та довіру до сертифіката.
- 789: попередньо спільний ключ L2TP/IPsec відсутній або хибний.
- 868: ім'я сервера не розв'язалося. Виправте DNS, перш ніж редагувати профіль.
Тримайте робочу команду поруч із налаштуваннями, які вона кодує, щоб наступна людина могла зібрати все заново, а не відновлювати профіль з інтерфейсу. Якщо справді треба перезібрати, видаліть запис і створіть його заново з тими самими параметрами; латання напівналаштованого профілю лишає застарілі маршрути й стан автентифікації. А якщо файл ніколи не був рідним, поверніться до клієнта, який ним володіє. .ovpn, перевдягнутий у профіль IKEv2, — це не імпорт, це звернення до підтримки.