Вопрос или проблема
Я использую компьютер с 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
в ноль (успех), даже если не получила никаких действительных ответов от удаленного хоста!!!
Тем не менее, метод, описанный ниже, надежен, переносим и работает с:
- Переводы на все другие языки, например: “ms”, “TTL”, “Ответ от”, “потеря”, “Недоступен”, “Получено” и т.д., включая русский и китайский.
- Пингованием IPv4 адреса.
- Пингованием IPv6 адреса (без поля
TTL
) - Ситуациями, в которых возникает ошибка “Общая ошибка.”
- Пингованием адреса, который возвращает “Запрос завершился по истечении времени.”
- Пингованием адреса, который возвращает “Целевой хост недоступен.”
- Пингованием разрешимого алфавитно-цифрового хоста.
- Пингованием неразрешимого алфавитно-цифрового хоста, что вызывает возврат ошибки “Запрос 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) для выполнения необходимых проверок соединения с интернетом. Данный файл будет автоматически перезагружать компьютер, если обнаружен сбой соединения.
Шаги по созданию скрипта
-
Создание скрипта
Откройте любой текстовый редактор (например, Блокнот) и вставьте следующий код:
@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
. -
Настройка скрипта
Теперь вы можете запустить скрипт с параметром URL, который будет проверять соединение. Например:
pingtest google.com
Это будет проверять соединение с Google. Убедитесь, что указываете надежный сайт, который всегда в сети.
-
Настройка планировщика задач
Чтобы скрипт выполнялся автоматически через заданные интервалы:
- Откройте «Планировщик заданий».
- Выберите «Создать задачу».
- На вкладке «Общие» дайте имя вашей задаче.
- Перейдите на вкладку «Триггеры» и добавьте новый триггер, установив интервал на 5 минут.
- На вкладке «Действия» выберите «Запустить программу» и укажите путь к вашему
pingtest.bat
. - Убедитесь, что свойства задачи настроены на выполнение с наивысшими привилегиями, чтобы избежать проблем с правами доступа.
Проверка работоспособности
После настройки скрипта вы можете протестировать его, отключив интернет-соединение и проверив, перезагрузится ли ваш компьютер через 60 секунд после потери связи.
Заключение
Создание автоматической перезагрузки для вашего компьютера при сбоях соединения является эффективным методом решения проблемы с отключением VPN и отсутствием доступа. Следуя вышеизложенным шагам, вы сможете настроить систему так, чтобы она сама реагировала на проблемы с сетью, гарантируя вашу связь и удаленный доступ даже в сложных ситуациях.
Если у вас возникли дополнительные вопросы, не стесняйтесь задать их!