Есть ли способ отключить и включить сетевое соединение при потере интернета - PullRequest
0 голосов
/ 03 ноября 2019

это мой первый пост, так что, надеюсь, я все делаю правильно.

Я ищу способ автоматизировать процесс отключения сетевого подключения Ethernet, а затем снова включить его.

IЯ нахожусь в лагерном интернет-соединении (работаю несколько недель подряд), и интернет-соединение в порядке, кроме того, что оно прерывается каждые полчаса или около того и требует от меня обновить соединение. Обычно я просто отключаю разъем Ethernet на секунду и снова подключаю его, но я хочу автоматизировать процесс, чтобы я мог удаленно подключаться к компьютеру, когда меня нет дома.

Любая помощь о том, как этого добиться, будет принята с благодарностью.

Редактировать: я оставил важную часть вне моего описания. Я хочу, чтобы скрипт обнаружил, когда интернет-соединение потеряно, а затем обновил соединение. Как только соединение потеряно, оно никогда не восстановит его, пока я не обновлю соединение.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Если вы используете DHCP

Тогда доллары для пончиков вам просто нужно продлить аренду DHCP.

Это то, что вы можете легко сделать в CMD (я уверен, что естьВероятно, такой же простой способ в PS, но я не знаю, как он это делает)

Это освободит назначенный в настоящий момент DHCP-адрес, подождите несколько секунд, а затем обновит его.

IPConfig /Release & timeout 5 & IPConfig /Renew

ВCLI или в пакетном скрипте вы можете настроить цикл do-while для цикла, пока вы не вернете ожидаемый адрес up, если хотите.

Пример цикла костюма в cmd cli.

For /L %L (1,1,2147483648) DO (
  IPConfig /Release & timeout 3 & IPConfig /Renew &timeout 3 &(
    Ping -n 2 4.2.2.2 | find /I "Reply From" | find /I " 4.2.2.2"  &&(
      Exit /b 0
    )
  )
)

Отключение и включение сетевого адаптера можно выполнить с помощью CMD или Powershell.

Здесь Powershell проще.

Получить только доступные в настоящее время адаптеры, используйте их, чтобы отключить их, подождите несколько секунд и включитеих снова

$NIC_Original_State = get-NetAdapter | ? {$_.Status -eq "Enabled"}
$NIC_Original_State | Disable-NetAdapter -name $_.name -confirm:$false
Sleep 5
$NIC_Original_State | Enable-NetAdapter -name $_.name -confirm:$false

В сочетании с проверкой проверки связи с Интернетом (как в примере cmd) для создания цикла, пока у нас не установится хорошее соединение.

$NIC_Original_State = get-NetAdapter | ? {$_.Status -eq "Enabled"}

DO {
  $NIC_Original_State | Disable-NetAdapter -name $_.name -confirm:$false
  Sleep 5
  $NIC_Original_State | Enable-NetAdapter -name $_.name -confirm:$false
  Sleep 5
} While ( ! $(test-connection -TargetName 4.2.2.2 -Quiet ) )

Теперь PowerShell потребуетсябыть созданным из CMD подскажите, я обычно пишу оболочку сценария .cmd для сценария .ps1, который вызывается из Scedualer или вручную.

Иногда я пишу комбо .cmd сценарий с ps Код встроен и просто создать жесткую линию. К оригинальному .cmd скрипту в качестве. .ps1 для выполнения кода PS.

Хотя для чего-то такого простого, возможно, проще всего использовать PowerShell.exe для запуска сценария в качестве встроенной команды.

Но все дороги ведутВ Риме вы выполняете PowerShell, но для его периодического запуска вам нужно запланировать запуск сценария, и по умолчанию нет способа запустить сценарии ps напрямую, поэтому выберите метод, который вам подходитдля запуска сценария, а затем с помощью планировщика Windows запланировать выполнение задачи каждый интервал времени x (скажем, ежечасно)

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

Убедитесь, что вы указали имя пользователя и пароль администратора, и выберите, чтобы сохранить пароль / запустить, независимо от того, вошел ли пользователь в систему илиnot.

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

Редактировать:

Исходный метод в форме DO { Действие } WHILE ( Условие для проверки возвращает True ) Так как while находится в конце, то оногарантирует одну итерацию.

Поскольку вы не хотите отключать и включать сетевой адаптер хотя бы один раз, если Интернет доступен для проверки связи, вы можете использовать WHILE ( Условие для проверки Возвращает True ) { Действие }

$NIC_Original_State = get-NetAdapter | ? {$_.Status -eq "Enabled"}

While ( ! $( test-connection -ComputerName 4.2.2.2 -Quiet ) ) {
  $NIC_Original_State | Disable-NetAdapter -name $_.name -confirm:$false
  Sleep 5
  $NIC_Original_State | Enable-NetAdapter -name $_.name -confirm:$false
  Sleep 5
}

Вам обязательно нужно запланированное задание для регулярного запуска.

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

Эта версия будет проверять цикл каждую минуту и ​​выполняется только тогда, когда Интернет недоступен.

while ($true) {
  $NIC_Original_State = get-NetAdapter | ? {$_.Status -eq "Enabled"}

  While ( ! $( test-connection -ComputerName 4.2.2.2 -Quiet ) ) {
    $NIC_Original_State | Disable-NetAdapter -name $_.name -confirm:$false
    Sleep 5
    $NIC_Original_State | Enable-NetAdapter -name $_.name -confirm:$false
    Sleep 5
  }
 sleep 60
}

Опять вы можетепросто запустите это в powershell, конечно, btu, затем, если по какой-либо причине его остановят, он не запустится снова.

Используйте планировщик заданий и настройте действие для запуска этого o Запуск и раз в час, убиваялюбая ранее запущенная копия сценария.

Обычно для запуска сценария CMD я просто пишу простой сценарий cmd, поэтому, если я хочу редактировать какую-либо часть чего-либо, я изменяю только сценарий, но не задачу.

<# ## & REM Script Name:
@(
    SETLOCAL ENABLEDELAYEDEXPANSION
    ECHO OFF
    (
        NET SESSION 2>&1 >NUL
    ) || (
        powershell.exe -Command "Start-Process cmd \"/k %~dpnx0\" -Verb RunAs"
        pause
        GOTO :EOF
    )
    IF EXIST "%~dpn0.ps1" (
        DEL /Q /F %~dpn0.ps1"
    )
    MKLINK /H "%~dpn0.ps1" "%~f0"
)

Powershell.exe -ExecutionPolicy Bypass -File "%~dpn0.ps1"

(
  ENDLOCAL
  EXIT /B %_eLvl%
)

#>

## Script: 
## Powershell Portion Begins

while ($true) {
  $NIC_Original_State = get-NetAdapter | ? {$_.Status -eq "Enabled"}

  While ( ! $( test-connection -ComputerName 4.2.2.2 -Quiet ) ) {
    $NIC_Original_State | Disable-NetAdapter -name $_.name -confirm:$false
    Sleep 5
    $NIC_Original_State | Enable-NetAdapter -name $_.name -confirm:$false
    Sleep 5
  }
 sleep 60
}


0 голосов
/ 03 ноября 2019

Вы можете справиться с этим с помощью Get-NetAdapter , Enable-NetAdapter и Disable-NetAdapter .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...