OpenVPN запускається під час входу, але не під час завантаження Windows?
Ярлик у автозавантаженні запускає стільничну програму, а не автоматичну службу. Перевірте, яке джерело профілю читає власник, перш ніж переміщати файли.
Тунелі, які з'являються лише після чийогось входу в систему, зазвичай запускаються сеансом цієї людини, а не автоматичною службою. Звичайний винуватець — ярлик у автозавантаженні, який запускає openvpn-gui.exe, і це не зламана інсталяція. Ярлик запускає стільничну програму всередині сеансу користувача, з профілем цього користувача, сховищами сертифікатів цього користувача та здатністю цього користувача відповісти на запит. Ніщо з цього не робить підключення незалежним від людини, яка увійшла, а саме це потрібно тунелю до входу в систему.
Симптом зазвичай має три причини
Три шаблони виглядають ззовні однаково і мають різні виправлення. Перший — власник виконання, яким є сеанс користувача, а не служба, тобто випадок ярлика в автозавантаженні. Другий — профіль, який розташований там, куди служба не дивиться, тому служба запускається, нічого не знаходить і чисто завершується. Третій — профіль, який служба знаходить і запускає, але його облікові дані потребують взаємодії, якої не може забезпечити жодна служба.
Щоб визначити, який випадок застосовний, потрібні два читання: що служба налаштована запускати і які файли вона бачить. Кожне — одна команда, і жодне не порушує робочого підключення.
Що насправді читає автоматична служба
Автоматична служба Community — це обгортка, яка сканує налаштований каталог автозапуску, зазвичай config-auto в інсталяції, і запускає процес OpenVPN для кожного знайденого відповідного профілю. Профіль, видимий у меню GUI користувача, розташований натомість у профілі роумінгу цього користувача, у каталозі, який обліковий запис служби не читає. Посібник зі служби Windows описує це виявлення, і його варто прочитати перед копіюванням чогось, бо цільовий каталог є властивістю інсталяції, а не фіксованою конвенцією. Тому копіювання файлу до папки GUI нічого не змінює для служби, а копіювання його до кожної папки з назвою config створює дублікати замість виправлення.
Get-Service OpenVPNService | Select-Object Status, StartType
Get-CimInstance Win32_Service | Where-Object Name -eq 'OpenVPNService' | Select-Object PathName, StartName
gci 'C:\Program Files\OpenVPN\config-auto'
Остання команда перелічує те, що обгортка справді побачить, — це найшвидший спосіб переконатися, що профіль не на своєму місці. Другий рядок також показує обліковий запис, від якого працює служба, і цей запис вирішує, які шляхи до файлів і сховища сертифікатів взагалі доступні.
Чому вхід на стільниці працює, а запуск під час завантаження ні
Успіх на стільниці може довго приховувати залежність від введення. GUI може зібрати парольну фразу ключа, пароль облікового запису або другий фактор у діалозі, бо він працює в інтерактивному сеансі з видимою стільницею. Служба працює в сеансі без стільниці, тому запиту на введення ніде з'явитися, і підключення обривається після тайм-ауту, який зовсім не схожий на проблему з обліковими даними.
Доступ до файлів підкоряється тому самому правилу. Закритий ключ, що зберігається в профілі користувача, або сертифікат в особистому сховищі користувача, недоступний службі, яка працює від імені машини. Порівнюйте абсолютні шляхи, дозволи та вибір сертифіката кожною стороною, а не припускайте, що той самий файл профілю означає те саме середовище.
Заплановане завдання, налаштоване запускатися незалежно від того, чи користувач увійшов, успадковує подібне обмеження. Воно може успішно запустити виконуваний файл GUI і все одно створити процес, який так і не отримає облікових даних, тому наявність процесу в диспетчері завдань не є доказом робочого тунелю.
Виберіть одного власника й перевірте реальний життєвий цикл
Для підключення, що належить людині, яка увійшла, використовуйте підтримувану GUI поведінку автозапуску й залиште службу осторонь. Для тунелю, який має існувати до чийогось входу, налаштуйте службу, розмістіть профіль там, де його читає обгортка, і використовуйте підтримуваний механізм облікових даних без участі людини, наприклад ключ без інтерактивної парольної фрази або документований файл облікових даних.
Get-Content 'C:\Program Files\OpenVPN\log\openvpn.log' -Tail 40
Get-WinEvent -LogName Application -MaxEvents 20 | Where-Object ProviderName -like '*OpenVPN*'
Перевірте життєвий цикл, який має значення: перезавантаження, коли ніхто не входить, а потім повторне підключення після зміни мережі. Тримайте одного власника підключення, бо два конкуруючі механізми автозапуску зазвичай створюють два екземпляри, що борються за ті самі маршрути й той самий сеанс сервера, що діагностувати складніше, ніж будь-який із механізмів окремо.