Задача
Дома и в командировках меня раздражали внезапные «тихие» обрывы Wi‑Fi. Хотелось, чтобы система сама возвращала подключение, но не спорила со мной, если я сознательно нажал «Отключить Wi‑Fi». И чтобы всё было прозрачно: логи, автозапуск, минимум магии.
Ограничения
-
Windows 10/11 и PowerShell 5.1+ — без сторонних демонов.
-
Никаких паролей в логах и странных автологинов.
-
Автоматика не должна мешать: ручное отключение — табу.
Архитектура
-
WifiMonitor.ps1 — наблюдение за стабильностью (ping, события), диагностика, логи.
-
WiFiAutoReconnect.ps1 — восстановление через netsh к доверенным сетям, игнор ручных отключений.
-
Планировщик задач — два фоновых задания с автозапуском и повышенными правами.
-
Логи и конфигурация — C:\ProgramData\WiFiDiag.
Реализация
Фильтр «ручного отключения»
-
Проверяю событие WLAN‑AutoConfig ID 8002 и статус адаптера (Disabled). Если это «воля пользователя», переподключение не стартует.
Критерий «реального обрыва»
-
Серия неудачных ping до надёжной цели (у меня 1.1.1.1); после порога срабатывает восстановление. Это лучше, чем одиночные «шумы».
Восстановление
-
Скрипт сканирует доступные сети и:
-
в приоритете пытается вернуться к последней успешной;
-
иначе — к первой из списка доверенных, профили которых уже есть в Windows.
-
-
Пароли не пишутся и не читаются в явном виде — работает механизм профилей Windows.
Логирование
-
Каждое действие записывается в C:\ProgramData\WiFiDiag\wifi-reconnect.log с таймстемпами: от «ping упал (2/3)» до «подключено к SSID».
Автозапуск и эксплуатация
Задача
Дома и в командировках меня раздражали внезапные «тихие» обрывы Wi‑Fi. Хотелось, чтобы система сама возвращала подключение, но не спорила со мной, если я сознательно нажал «Отключить Wi‑Fi». И чтобы всё было прозрачно: логи, автозапуск, минимум магии.
Ограничения
-
Windows 10/11 и PowerShell 5.1+ — без сторонних демонов.
-
Никаких паролей в логах и странных автологинов.
-
Автоматика не должна мешать: ручное отключение — табу.
Архитектура
-
WifiMonitor.ps1 — наблюдение за стабильностью (ping, события), диагностика, логи.
-
WiFiAutoReconnect.ps1 — восстановление через netsh к доверенным сетям, игнор ручных отключений.
-
Планировщик задач — два фоновых задания с автозапуском и повышенными правами.
-
Логи и конфигурация — C:\ProgramData\WiFiDiag.
Реализация
Фильтр «ручного отключения»
-
Проверяю событие WLAN‑AutoConfig ID 8002 и статус адаптера (Disabled). Если это «воля пользователя», переподключение не стартует.
Критерий «реального обрыва»
-
Серия неудачных ping до надёжной цели (у меня 1.1.1.1); после порога срабатывает восстановление. Это лучше, чем одиночные «шумы».
Восстановление
-
Скрипт сканирует доступные сети и:
-
в приоритете пытается вернуться к последней успешной;
-
иначе — к первой из списка доверенных, профили которых уже есть в Windows.
-
-
Пароли не пишутся и не читаются в явном виде — работает механизм профилей Windows.
Логирование
-
Каждое действие записывается в C:\ProgramData\WiFiDiag\wifi-reconnect.log с таймстемпами: от «ping упал (2/3)» до «подключено к SSID».
Автозапуск и эксплуатация
Завёл две задачи планировщика. Да, на первом заходе поймал 0x800700b7: «уже существует». Решение — удалять/пересоздавать атомарно:
powershell
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -DontStopOnIdleEnd $trigger = New-ScheduledTaskTrigger -AtStartup $wifiMon = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File `"C:\Scripts\WifiMonitor.ps1`"" $wifiAuto = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File `"C:\Scripts\WiFiAutoReconnect.ps1`"" @( @{ Name="WifiMonitor"; Action=$wifiMon }, @{ Name="WiFiAutoReconnect"; Action=$wifiAuto } ) | ForEach-Object { if (Get-ScheduledTask -TaskName $_.Name -ErrorAction SilentlyContinue) { Unregister-ScheduledTask -TaskName $_.Name -Confirm:$false } Register-ScheduledTask -TaskName $_.Name -Action $_.Action -Trigger $trigger -Settings $settings -RunLevel Highest }
После регистрации — мгновенный ручной старт обеих задач и проверка логов.
Мелкие победы и одна «засада»
-
Самая коварная ошибка прилетела раньше — когда парсер PowerShell решил, что второй param в файле — это параметры скрипта, а не функции. Лечится просто: блок param внутри функции должен стоять первой строкой тела, сразу после «{» и на своей строке.
-
Для самоуспокоения я добавил опциональный мини‑самотест (AST‑парсинг, поиск «заблудившихся» param, скрытых символов и подсказка по кодировке UTF‑8 BOM). Его можно включать в строгом режиме на старте, пока идёт активная разработка.
Результат
-
Система возвращает Wi‑Fi автоматически, но не спорит со мной, если я его отключил намеренно.
-
Логи говорят сами за себя — следить за поведением легко.
-
Всё работает после переустановки ОС: задачи планировщика и скрипты восстанавливаются одной командой.
Что дальше
-
Экспоненциальный бэк‑офф и несколько целевых хостов для ping.
-
Ротация логов и уровни важности.
-
Встроенный самотест — по умолчанию в warn‑режиме; strict — только на CI/первичном развертывании.
Немного про ИИ в процессе
ИИ здесь — как «старший коллега», который помогает не закапываться в рутину и держит фокус на устойчивости. Он:
-
предложил разбивку обязанностей и строгий фильтр ручного отключения;
-
подсветил риск с param внутри функций и дал безопасный шаблон;
-
собрал атомарную команду для пере‑регистрации задач, чтобы не ловить 0x800700b7.
Это не «магия», а ускоритель. Решения остаются моими — и предсказуемыми.
🔹 Промпт для генерации PowerShell‑скрипта авто‑восстановления Wi‑Fi
Скопируйте и вставьте этот текст в свой любимый ИИ‑инструмент, чтобы получить рабочий, прозрачный и обратимый скрипт.
Code
Напиши на PowerShell 5.1+ скрипт, который: [Личность] Ты — старший системный инженер и архитект по автоматизации Windows (PowerShell 5.1+). Практикуешь безопасные, самодиагностирующиеся решения: минимум внешних зависимостей, явные логи, превентивные проверки, уважение к намеренным действиям пользователя (не «чинить» то, что он отключил сам). 1. Проверяет текущее состояние Wi‑Fi‑адаптера в Windows. 2. Если адаптер отключён пользователем — ничего не делает. 3. Если соединение потеряно, пытается переподключиться к сохранённой сети. 4. Логирует все действия в текстовый файл с датой и временем. 5. Поддерживает автозапуск через Планировщик задач. 6. Сохраняет кодировку UTF‑8 без BOM. 7. Перед применением выводит превью плана действий. 8. Не требует сторонних модулей. [Инструкция] Твоя задача — улучшать и расширять проект автопереподключения Wi‑Fi (WifiMonitor.ps1 + WiFiAutoReconnect.ps1) без лишних вопросов. Работай на опережение: предлагай и внедряй улучшения сразу, если они повышают устойчивость, прозрачность или безопасность. По итогам каждого шага: - кратко фиксируй, что именно ты сделал и зачем; - давай чёткий пошаговый план запуска начиная с диагностики окружения; - самопроверяй код (синтаксис, AST/скобки, «заблудившиеся» param, скрытые символы) и исправляй найденное. [Ресурсы/Контекст] - ОС: Windows 10/11, PowerShell 5.1+. - Каталоги: C:\Scripts (код), C:\ProgramData\WiFiDiag (логи/конфиги). - Задачи планировщика: WifiMonitor, WiFiAutoReconnect. - Требования: игнор ручного отключения (WLAN 8002 + Disabled), логирование, автозапуск, надёжность. - Нельзя хранить пароли в логах/плейнтексте; опирайся на профили Windows. [Алгоритм/Подача] 1) Диагностика среды: версии, права, политика выполнения, доступ к netsh, каталоги/права. 2) Самотест: AST-парсинг текущих файлов, поиск лишних param, скрытых символов, подсказки по кодировке (UTF‑8 BOM), баланс скобок. 3) Улучшения «на опережение»: - отказоустойчивость (экспоненциальная задержка, бэк‑офф); - чёткие критерии обрыва (серии ping, fallback хосты); - разделение обязанностей (мониторинг/восстановление); - безопасная работа с профилями (без утечки паролей); - логи с ротацией и уровнем важности. 4) Отчёт: что изменено, где, почему. Дай diff/фрагменты. 5) План запуска: команды и порядок действий. 6) Самопроверка: запускай встроённый быстрый линт/самотест и исправляй. [Критерии качества] - Никаких интерактивных зависаний в фоновом режиме. - Понятные логи и коды возврата. Стабильность важнее украшательств. - Меньше зависимостей: без модулей — по умолчанию; если модуль критичен — проверяй/ставь опционально. - Никаких паролей в явном виде. Не ломай намерения пользователя (ручное отключение — уважать). [Выходной формат] - Сначала перечисли ключевые изменения короткими маркерами (что/зачем). - Затем дай шаги запуска (диагностика → установка → проверка). - Потом приложи обновлённые фрагменты кода или весь файл, если изменений много. - В конце — краткий самоотчёт: «что сделал», «что проверил», «что осталось». [Начинай] Считай, что проект уже развёрнут по базовой схеме. Сразу предложи и внедри улучшения, затем выдай инструкции запуска и самоотчёт.
💡 Подсказка: после генерации кода запросите у ИИ «Покажи пошагово, что делает каждая строка» — так вы сразу получите и рабочее решение, и полноценный разбор логики.
Если вам хочется такой же спокойной жизни с Wi‑Fi: начните с логов, нарежьте ответственность на два скрипта, уважайте решение пользователя и не забывайте про одноразовые «засады» парсера. Дальше — только приятные мелочи.
ссылка на оригинал статьи https://habr.com/ru/articles/938302/
Добавить комментарий