Тримайте VPN у Windows увімкненим: запускайте rasdial за подією відключення
RasClient 20226 і 20227 позначають обрив; 631 означає, що це зробила людина. Запускайте rasdial за першими двома, збережіть одні облікові дані й читайте код виходу.
Windows не пропонує політики повторного додзвону для свого VPN-клієнта, тому з'єднання, яке обривається опівночі, і за сніданком усе ще відсутнє. Плановане завдання, яке стежить за розривом і запускає rasdial, закриває цю прогалину без клієнта третьої сторони. Чи поводиться завдання як оператор або як цикл, залежить від трьох деталей: з якими подіями воно збігається, які облікові дані воно бачить і що воно робить з результатом. Жодна з трьох не складна, і саме пропуск будь-якої з них створює завдання, яке дзвонить вічно.
Чому таймер — неправильний тригер
Таймер дзвонить за власним розкладом незалежно від того, чи тунель обірвано. Це породжує спроби, які нікому не були потрібні, а спроба під час робочої сесії може її перервати. Тригер події спрацьовує лише тоді, коли з'єднання змінює стан, що дешевше і простіше для осмислення. Подія також несе причину, і саме причина відокремлює збій мережі від людини, яка навмисно відключається.
Ця різниця — різниця між корисною задачею і тією, що воює з користувачем щовечора. Це також та частина, якої зазвичай бракує в рецептах, що описують лише дію.
Пара подій і та, яку треба придушити
Клієнт служби Remote Access Service записує записи життєвого циклу в журнал Application під постачальником RasClient. 20226 позначає завершене з'єднання, а 20227 — невдалу спробу, тож кожна з них може виправдати новий додзвін. Усе інше в завданні залежить від точного збігу цих двох ідентифікаторів. Вони стабільні роками, тому рецепти, побудовані на них, досі ходять, але збірка, яка перейменовує постачальника або ідентифікатори, робить так, що запит нічого не повертає. Повторюйте крок доказу після кожного оновлення функції, замість того щоб чекати, поки завдання перестане спрацьовувати.
Одне завершення треба виключити. Помилка 631 означає, що користувач відключив порт, і повторний додзвін у цей момент воює з людиною, яка щойно навмисно змінила мережу. Помістіть виняток у фільтр тригера, а не в скрипт, щоб завдання взагалі не починалося. Він має стосуватися лише одного ідентифікатора події, бо предикат EventData збігається лише тоді, коли названий елемент існує, а спільна умова мовчки відкинула б кожну подію іншого ідентифікатора. Прочитайте ім'я елемента з реального запису, перш ніж писати фільтр:
Get-WinEvent -LogName Application -MaxEvents 5 -FilterXPath "*[System[Provider[@Name='RasClient'] and EventID=20226]]" | Select-Object -First 1 -ExpandProperty ToXml
XML показує точні імена Data у цьому записі. ErrorCode — звичайне написання, а запис, який використовує щось інше, потребує підстановки цього імені у фільтрі нижче.
<QueryList><Query Id="0" Path="Application"><Select Path="Application">*[System[Provider[@Name='RasClient'] and (EventID=20226 or EventID=20227)]] and (EventData[Data[@Name='ErrorCode'] != '631'] or System[EventID=20227])</Select></Query></QueryList>
Вставте це в користувацький фільтр тригера і доведіть як запит, перш ніж він стане тригером. Той самий XPath виконується з PowerShell проти живого журналу, що є дешевим способом побачити, з чим він збігається, поки історія завдань ще не задіяна.
Get-WinEvent -LogName Application -MaxEvents 40 -FilterXPath "*[System[Provider[@Name='RasClient'] and (EventID=20226 or EventID=20227)]] and (EventData[Data[@Name='ErrorCode'] != '631'] or System[EventID=20227])" | Select-Object TimeCreated,Id,Message
Тригер, який мовчки ні з чим не збігається, виглядає точно як завдання, яке виконується і падає. Обидва виглядають як «автоматизація не працює», і жоден не каже, якої половини бракує. Спершу перевірте вивід запиту, бо він розділяє два випадки за один крок.
Додзвін не вдається, бо немає кому ввести пароль
Дія запускає rasdial з іменем з'єднання. Коли в профілі немає кешованих облікових даних, додзвін одразу не вдається, бо немає кому відповісти на запит. Це найпоширеніша причина, чому правильно запущене завдання не робить нічого видимого, тому перевірте це, перш ніж чіпати тригер. Додзвін вручну з командного рядка відокремлює проблему облікових даних від проблеми розкладу.
Збережіть облікові дані один раз під тим обліковим записом, від імені якого працюватиме завдання, і зробіть цей запис частиною проєкту. Завдання, що працює як SYSTEM, не може прочитати облікові дані, кешовані вашим інтерактивним записом, і завдання, що працює від імені когось іншого, теж не може. Ім'я також має точно відповідати профілю, включно з будь-яким префіксом домену в полі користувача.
rasdial
rasdial "Office VPN"
(Start-Process rasdial -ArgumentList '"Office VPN"' -Wait -PassThru -NoNewWindow).ExitCode
Перша команда перелічує імена, які знає Windows. Друга дзвонить за іменем, використовуючи кешовані облікові дані, а третя — це форма, яку має використовувати дія PowerShell, бо вона чекає і повертає значення, яке завдання може записати.
Читайте код виходу, а не вікно
Завдання, яке запускає процес без очікування, повідомляє про успіх, щойно процес існує. Для додзвону, який може не вдатися за секунду, такий вердикт нічого не вартий. Очікування коду виходу перетворює дію на справжній результат. Історія завдань сама по собі показує лише те, що процес почався, і ніколи — що тунель піднявся.
Записуйте значення з позначкою часу при кожному запуску. Одиничний збій після збою живлення — це нормально, а три збої підряд з одним кодом указують на облікові дані або профіль, а не на мережу. Саме цей зразок робить історію гідною читання.
Додайте короткий інтервал повторення як страховку і чітко скажіть, як він взаємодіє з тригером події. Повторення щохвилини протягом п'яти хвилин дає другу спробу, коли інтернет повернувся разом із тунелем, а в розділі «Параметри», «Якщо завдання вже виконується, застосовується таке правило», завдання хоче «Не запускати новий екземпляр», щоб повторення не перекривало додзвін, який ще триває. Без цього налаштування два процеси rasdial можуть змагатися за один порт, і другий зазнає невдачі без жодної корисної причини.
Доведіть шлях відновлення
Перевірте обидва напрямки навмисно. Відключіться вручну і переконайтеся, що повторного додзвону не відбувається, потім вимкніть мережевий адаптер і переконайтеся, що завдання спрацьовує, коли зв'язок повертається. Ці два тести покривають правило придушення і реальний випадок збою, і більше ніщо цього не робить.
Потім читайте історію завдань, а не значок підключення. Історія фіксує, коли завдання виконувалося, який обліковий запис використовувався і що повернула дія, і це саме той доказ, потрібний, коли та сама машина знову обірветься наступного місяця.