Для решения этой задачи лучше всего использовать PowerShell или Batch (CMD) скрипт. Поскольку установка программ в Windows и запись в системные папки требуют прав администратора, скрипт должен автоматически запрашивать их при запуске.

Ниже представлены два варианта: простой .bat файл (который можно запустить сразу) и PowerShell скрипт (который при желании можно «упаковать» в полноценный .exe файл).


Вариант 1: Batch-файл (.bat) — Самый простой

Этот вариант не требует установки дополнительных программ. Вам нужно просто создать текстовый файл, вставить код и сохранить его с расширением .bat (например, install_umnik.bat).

Важно: Файл скрипта, MSI-установщик и все конфигурационные файлы должны лежать в одной папке.

@echo off
:: Проверка прав администратора
net session >nul 2>&1
if %errorLevel% neq 0 (
    echo Запрашиваются права администратора...
    powershell -Command "Start-Process cmd -ArgumentList '/c \"%~f0\"' -Verb RunAs"
    exit /b
)

echo ==========================================
echo  Установка OpenVPN и настройка Umnik
echo ==========================================

:: 1. Тихая установка MSI
:: /qn - без интерфейса, /norestart - не перезагружать ПК
echo [1/2] Установка OpenVPN...
msiexec /i "%~dp0OpenVPN-2.7.8-I001-amd64.msi" /qn /norestart /wait

:: 2. Копирование конфигурационных файлов
:: В современных версиях OpenVPN конфиги лучше класть в ProgramData
set "DEST_DIR=C:\ProgramData\OpenVPN\config"
if not exist "%DEST_DIR%" mkdir "%DEST_DIR%"

echo [2/2] Копирование конфигурационных файлов...
copy "%~dp0ca.crt" "%DEST_DIR%\" /Y
copy "%~dp0ta.key" "%DEST_DIR%\" /Y
copy "%~dp0umnik.crt" "%DEST_DIR%\" /Y
copy "%~dp0umnik.key" "%DEST_DIR%\" /Y
copy "%~dp0umnik.ovpn" "%DEST_DIR%\" /Y

:: Опционально: перезапуск службы OpenVPN, чтобы она сразу подхватила новый конфиг
net stop OpenVPNService >nul 2>&1
net start OpenVPNService >nul 2>&1

echo ==========================================
echo  Установка и настройка успешно завершены!
echo ==========================================
pause

Вариант 2: PowerShell скрипт (с возможностью сделать .exe)

PowerShell более гибок и элегантно обрабатывает ошибки.

  1. Создайте файл Install-OpenVPN.ps1 и вставьте туда этот код:
# Проверка и запрос прав администратора
$isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not $isAdmin) {
    Start-Process powershell.exe -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
    exit
}

$scriptDir = $PSScriptRoot
$msiFile = Join-Path $scriptDir "OpenVPN-2.7.8-I001-amd64.msi"
$configDir = "C:\ProgramData\OpenVPN\config" # Путь для конфигов в новых версиях OpenVPN

# Файлы для копирования
$filesToCopy = @("ca.crt", "ta.key", "umnik.crt", "umnik.key", "umnik.ovpn")

Write-Host "Запуск установки OpenVPN..." -ForegroundColor Cyan
# Тихая установка MSI с ожиданием завершения
Start-Process msiexec.exe -ArgumentList "/i `"$msiFile`" /qn /norestart" -Wait

Write-Host "Копирование конфигурационных файлов..." -ForegroundColor Cyan
if (-not (Test-Path $configDir)) {
    New-Item -ItemType Directory -Path $configDir -Force | Out-Null
}

foreach ($file in $filesToCopy) {
    $sourcePath = Join-Path $scriptDir $file
    if (Test-Path $sourcePath) {
        Copy-Item -Path $sourcePath -Destination $configDir -Force
    } else {
        Write-Host "Файл не найден: $file" -ForegroundColor Red
    }
}

# Перезапуск службы OpenVPN для применения настроек
Write-Host "Применение настроек (перезапуск службы)..." -ForegroundColor Cyan
Restart-Service -Name "OpenVPNService" -Force -ErrorAction SilentlyContinue

Write-Host "Готово! OpenVPN установлен и настроен." -ForegroundColor Green
Start-Sleep -Seconds 3

Как сделать из этого скрипта полноценную программу (.exe):

Если вы хотите, чтобы у программы была иконка и она запускалась как обычное приложение без «мелькания» консоли:

  1. Скачайте модуль PS2EXE (или используйте программу с графическим интерфейсом, например, PS2EXE-GUI).
  2. Скомпилируйте скрипт в .exe. При компиляции можно указать иконку и убрать окно консоли (опция -noConsole).
  3. Положите полученный .exe в одну папку с MSI и конфигурациями.

⚠️ Важные нюансы:

  1. Путь к конфигурациям:
    В коде указан путь C:\ProgramData\OpenVPN\config. Это стандартный и правильный путь для OpenVPN версий 2.4 и новее (конфиги из этой папки автоматически подхватываются OpenVPN GUI для всех пользователей).
    Если вы используете очень старую версию или специфическую сборку, замените C:\ProgramData\OpenVPN\config на C:\Program Files\OpenVPN\config.
  2. Имя MSI файла: Убедитесь, что имя файла установщика в точности совпадает с тем, что написано в скрипте (OpenVPN-2.7.8-I001-amd64.msi). Если имя отличается, измените его в коде.
  3. Антивирус: Поскольку скрипт тихо устанавливает MSI и копирует файлы в системные папки, некоторые строгие антивирусы (или Windows Defender SmartScreen) могут ругаться на .bat или .exe файл. Это нормальное поведение для self-written установщиков.
  4. Служба OpenVPN: В скриптах добавлена команда перезапуска службы OpenVPNService. Это нужно для того, чтобы если OpenVPN уже был запущен, он сразу «увидел» новый umnik.ovpn и смог по нему подключиться.

Компиляция PowerShell скрипта в .exe

Есть два основных способа: через командную строку (модуль PS2EXE) и через графическую программу (PS2EXE-GUI). Рассмотрим оба.


🛠 Способ 1: Модуль PS2EXE (через PowerShell)

Это самый популярный и надёжный метод. Модуль берёт ваш .ps1 скрипт и «упаковывает» его в полноценный .exe файл.

Шаг 1. Установка модуля PS2EXE

Откройте PowerShell от имени администратора и выполните:

Install-Module -Name ps2exe -Scope CurrentUser

Если система спросит про репозиторий NuGet — согласитесь (нажмите Y).

💡 Если у вас старая версия PowerShell (ниже 5.0), сначала обновите WMF или используйте ручную установку модуля с GitHub.

Шаг 2. Компиляция скрипта

Перейдите в папку со скриптом и выполните команду:

Invoke-PS2EXE -inputFile ".\Install-OpenVPN.ps1" -outputFile ".\Install-OpenVPN.exe" -noConsole -iconFile ".\icon.ico" -title "Установщик OpenVPN" -version "1.0.0"

Расшифровка параметров:

ПараметрНазначение
-inputFileПуть к исходному .ps1 скрипту
-outputFileПуть для готового .exe
-noConsoleСкрыть окно консоли (программа работает «в фоне»)
-iconFileПуть к .ico файлу (иконка exe)
-titleНазвание программы (видно в свойствах файла)
-versionВерсия программы
-requireAdminТребовать запуск от имени администратора (рекомендую добавить!)
-runtime40Использовать .NET 4.0 (для совместимости с Windows 10/11)

Рекомендуемая команда «всё-в-одном»:

Invoke-PS2EXE -inputFile ".\Install-OpenVPN.ps1" -outputFile ".\Install-OpenVPN.exe" -noConsole -requireAdmin -runtime40 -title "Установщик OpenVPN" -version "1.0.0"

🖱 Способ 2: PS2EXE-GUI (графический интерфейс)

Если не хотите возиться с командной строкой — используйте программу с визуальным интерфейсом.

  1. Скачайте PS2EXE-GUI с GitHub:
    👉 https://github.com/MScholtes/PS2EXE (раздел Releases)
  2. Распакуйте архив и запустите ps2exeGui.exe.
  3. В открывшемся окне:
    • Input file — выберите ваш Install-OpenVPN.ps1
    • Output file — укажите путь для .exe
    • Поставьте галочку «No console output» (без окна консоли)
    • Поставьте галочку «Require admin» (требовать права администратора)
    • При желании укажите иконку в поле Icon file
  4. Нажмите Compile — готово!

⚠️ Важные нюансы

1. Антивирусы и SmartScreen

Скомпилированные PowerShell-скрипты часто вызывают подозрение у Windows Defender и других антивирусов, потому что:

  • EXE содержит внутри зашифрованный скрипт
  • Нет цифровой подписи
  • Программа запрашивает права администратора

Решения:

  • Подписать EXE сертификатом (если есть) — signtool sign /f cert.pfx Install-OpenVPN.exe
  • Добавить папку с программой в исключения антивируса
  • Распространять через доверенный источник (корпоративный сервер, флешка)

2. Совместимость версий Windows

  • Параметр -runtime40 обеспечивает работу на Windows 10/11 и Server 2016+
  • Для Windows 7/8 используйте -runtime20 (но там может не работать современный PowerShell)

3. Где ищутся файлы при запуске EXE

При компиляции путь $PSScriptRoot в скрипте будет указывать на папку, где лежит сам .exe файл. Поэтому кладите MSI и конфиги в ту же папку, что и скомпилированный .exe — всё будет работать как задумано.

4. Размер файла

Готовый .exe будет весить около 300–500 КБ — это нормально, там «зашит» движок PowerShell.


🔄 Альтернативные инструменты

ИнструментОсобенности
iexpress.exe (встроен в Windows)Устарел, не рекомендуется
Advanced BAT to EXE ConverterРаботает с BAT, не с PS1
Bat To Exe ConverterПопулярный, но часто ловится антивирусами
NSIS / Inno SetupПрофессиональные установщики, но сложнее в освоении

Для вашей задачи PS2EXE — оптимальный выбор: просто, надёжно, сохраняет всю логику PowerShell-скрипта.


✅ Быстрый чек-лист перед компиляцией

  • Установлен модуль ps2exe
  • Скрипт Install-OpenVPN.ps1 работает при ручном запуске
  • Рядом лежат MSI и все .crt, .key, .ovpn файлы
  • В команде указан параметр -requireAdmin
  • После компиляции проверен запуск .exe на тестовой машине

Это решается одной командой. Выполните следующие шаги по порядку:

Шаг 1. Разрешите выполнение скриптов

Скопируйте и выполните эту команду (она разрешает запуск проверенных скриптов только для вашего пользователя, это безопасно):

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

⚠️ Важно: Система спросит подтверждение. Нажмите клавишу Y (или Д, если у вас русская раскладка) и затем Enter.

Шаг 2. Загрузите модуль

Теперь, когда блокировка снята, модуль загрузится без ошибок:

Import-Module ps2exe

(Если команда выполнилась молча и просто вернула новую строку PS C:\...> — значит, всё получилось).

Шаг 3. Запустите компиляцию

Теперь повторно выполните вашу команду для создания .exe файла:

invoke-ps2exe -inputfile ".\install-openvpn.ps1" -outputfile ".\install-openvpn.exe" -noconsole -iconfile ".\icon.ico" -title "Установщик openvpn" -version "1.0.0"

💡 Если ошибка повторяется даже после Шага 1:

Значит, нужны полные права администратора для изменения политик.

  1. Закройте текущее окно PowerShell.
  2. Нажмите Пуск, введите PowerShell, нажмите на него правой кнопкой мыши и выберите «Запуск от имени администратора».
  3. Снова выполните команду из Шага 1, но с другим параметром области:Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine(Нажмите Y / Д для подтверждения).
  4. После этого повторите Шаги 2 и 3.

После успешного выполнения в папке C:\users\alex\desktop\now появится файл install-openvpn.exe.

От alex

Обучаемый.