Как перезагрузить компьютер, когда моя сеть зависает?

Вопрос или проблема

Я использую компьютер с Windows 10, к которому мне нужно иметь удаленный доступ, когда я не дома. На этом компьютере я использую VPN-сервис, и если он включен на длительное время, соединение часто обрывается, и система оказывается в состоянии, когда клиент VPN думает, что он все еще подключен, но на самом деле нет. Клиент никогда не пытается переподключиться, поскольку считает, что он все еще подключен, и трафик без VPN также блокируется (как своего рода непреднамеренный «выключатель»). В результате возникает ситуация, когда непреднамеренный «выключатель» мешает мне получить удаленный доступ к моему компьютеру.

Моя конечная цель — перезагружать компьютер автоматически, когда интернет, по-видимому, недоступен в течение более чем 5 минут, но я не уверен, как это сделать. Я был бы признателен, если кто-то смог бы помочь мне разработать скрипт, который перезагрузит компьютер в такой ситуации. Я не очень хорошо знаком с cmd или скриптами PowerShell, но вот небольшой псевдокод, демонстрирующий процесс, который я хотел бы закодировать, так, чтобы его можно было запустить с помощью встроенных инструментов/программного обеспечения, включенного в мою ОС, например, PowerShell или пакетного файла.

// Примечание - ПСЕВДОКОД, НЕ ИСПОЛЬЗУЕМЫЙ СКРИПТ КАК ЕСТЬ
ping 8.8.8.8 // проверить интернет-соединение. 0% возврат пакетов указывает на то, что компьютер, вероятно, попал в блокировку сети
if pingsReturned == 0
{
    wait 5 minutes // в случае временного отключения, дать сети время восстановиться
    ping superuser.com // альтернативный сайт, используемый для подтверждения того, что google не единственный сайт, к которому я не могу подключиться, т.е. google не работает, не мое сетевое подключение
    if pingsReturned == 0
        shutdown /f /r /t 60 /c "Перезагрузка из-за проблем с подключением." 
    else
    {
        exit
    }
}
else
{
    exit
}

Я планирую запускать это как задачу, которая будет выполняться с интервалом 5 минут в планировщике задач, если это возможно. Я искал решения в интернете (и конкретно на этом сайте), но не нашел ни одного для Windows, хотя я нашел очень похожую реализацию для Linux (которая, как ни странно, также использовала DNS Google в качестве теста, или, возможно, это просто сайт для ping-тестов в целом…).

Думал, что что-то вроде этого должно сработать

:: ping google
ping www.google.com -n 1 | find "TTL=" >nul
if errorlevel 1 (
    :: ждать 60 секунд
    ping 127.0.0.1 -n 60 > nul

    :: ping другой
    ping www.facebook.com -n 1 | find "TTL=" >nul
    if errorlevel 1 (
        echo Перезагрузка...
        shutdown /r
    ) else (
        echo Мы снова в сети
    )
) else (
    echo Мы в сети
)

Проверка ERRORLEVEL, установленного командой ping, бесполезна, потому что в некоторых ситуациях она устанавливает ERRORLEVEL в ноль (успех), даже если не получила никаких действительных ответов от удаленного хоста!!!

Тем не менее, метод, описанный ниже, надежен, переносим и работает с:

  1. Переводы на все другие языки, например: “ms”, “TTL”, “Ответ от”, “потеря”, “Недоступен”, “Получено” и т.д., включая русский и китайский.
  2. Пингованием IPv4 адреса.
  3. Пингованием IPv6 адреса (без поля TTL)
  4. Ситуациями, в которых возникает ошибка “Общая ошибка.”
  5. Пингованием адреса, который возвращает “Запрос завершился по истечении времени.”
  6. Пингованием адреса, который возвращает “Целевой хост недоступен.”
  7. Пингованием разрешимого алфавитно-цифрового хоста.
  8. Пингованием неразрешимого алфавитно-цифрового хоста, что вызывает возврат ошибки “Запрос ping не смог найти хост UnresolvableHost…”.
@echo off

set prev=0
:loop

for /F %%A in ('ping %1 -n 2 ^| findstr /C:^= ^| find /c /v ""') do (set "res=%%A")

if %res% GTR 2 (
set res=2
) else (
set res=0
)

if %res% NEQ %prev% (
    
    set prev=%res%
    
    if %res% GEQ 2 (
    echo Подключено к интернету.
    ) else (
    color 47
    echo Подключение к интернету потеряно.
    shutdown /r /f /t 60 /c "Перезагрузка из-за проблем с подключением."     
    )
) 

goto :loop

Если сохранить приведенный выше код в файл с именем, например, pingtest.bat, вы можете использовать его для проверки, подключены ли вы к интернету, таким образом:

pingtest google.com

Если вы добавите символ BELL в конец строки: echo Подключение к интернету потеряно., используя клавиатурную комбинацию ALT-007, тогда этот пакетный файл издаст звук, когда интернет-соединение будет потеряно.

Ответ или решение

Как перезагрузить компьютер при зависании сети: Полное руководство

Если вы сталкиваетесь с проблемой незаконченного подключения при использовании VPN на вашем компьютере с Windows 10, это может привести к неработоспособности как самого VPN, так и общего интернет-соединения. Данное руководство направлено на создание скрипта, который автоматически перезагружает компьютер в случае, если соединение с интернетом пропадает на более чем 5 минут, и одновременно предоставит вам шаги по настройке этого решения.

Проблема

Вы используете компьютер под управлением Windows 10 с VPN-сервисом, который при длительном подключении может зависать, оставляя систему в состоянии, когда клиент VPN считает, что вы все еще подключены, хотя на самом деле это не так. Это создает трудности с удаленным доступом к вашему компьютеру и блокирует не-VPN трафик. Чтобы избежать этой серии неприятностей, необходимо настроить автоматическую перезагрузку системы.

Решение

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

Шаги по созданию скрипта

  1. Создание скрипта

    Откройте любой текстовый редактор (например, Блокнот) и вставьте следующий код:

    @echo off
    
    set prev=0
    :loop
    
    for /F %%A in ('ping %1 -n 2 ^| findstr /C:^= ^| find /c /v ""') do (set "res=%%A")
    
    if %res% GTR 2 (
       set res=2
    ) else (
       set res=0
    )
    
    if %res% NEQ %prev% (
       set prev=%res%
    
       if %res% GEQ 2 (
           echo Подключение к интернету установлено.
       ) else (
           color 47
           echo Подключение к интернету потеряно.
           shutdown /r /f /t 60 /c "Перезагрузка из-за проблем с соединением."     
       )
    )
    
    goto :loop

    Сохраните файл с именем pingtest.bat.

  2. Настройка скрипта

    Теперь вы можете запустить скрипт с параметром URL, который будет проверять соединение. Например:

    pingtest google.com

    Это будет проверять соединение с Google. Убедитесь, что указываете надежный сайт, который всегда в сети.

  3. Настройка планировщика задач

    Чтобы скрипт выполнялся автоматически через заданные интервалы:

    • Откройте «Планировщик заданий».
    • Выберите «Создать задачу».
    • На вкладке «Общие» дайте имя вашей задаче.
    • Перейдите на вкладку «Триггеры» и добавьте новый триггер, установив интервал на 5 минут.
    • На вкладке «Действия» выберите «Запустить программу» и укажите путь к вашему pingtest.bat.
    • Убедитесь, что свойства задачи настроены на выполнение с наивысшими привилегиями, чтобы избежать проблем с правами доступа.

Проверка работоспособности

После настройки скрипта вы можете протестировать его, отключив интернет-соединение и проверив, перезагрузится ли ваш компьютер через 60 секунд после потери связи.

Заключение

Создание автоматической перезагрузки для вашего компьютера при сбоях соединения является эффективным методом решения проблемы с отключением VPN и отсутствием доступа. Следуя вышеизложенным шагам, вы сможете настроить систему так, чтобы она сама реагировала на проблемы с сетью, гарантируя вашу связь и удаленный доступ даже в сложных ситуациях.

Если у вас возникли дополнительные вопросы, не стесняйтесь задать их!

Оцените материал
Добавить комментарий

Капча загружается...