有什么方法可以在互联网丢失时禁用和启用网络连接

时间:2019-11-03 08:53:31

标签: powershell networking

这是我的第一篇文章,希望我做得对。

我正在寻找一种方法来自动禁用以太网网络连接,然后重新启用它。

我正在使用营地Internet连接(一次要工作数周),并且Internet连接很好,除了每半小时左右就会中断,并要求我刷新连接。通常,我只是断开以太网插头一秒钟,然后再插回去,但是我想使该过程自动化,以便在我不在时可以远程连接到PC。

任何有关如何完成此操作的帮助将不胜感激。

编辑:我在描述中遗漏了至关重要的部分。我希望脚本检测互联网连接丢失的时间,然后刷新连接。一旦连接丢失,在我刷新连接之前永远不会恢复它。

2 个答案:

答案 0 :(得分:0)

您可以使用 Get-NetAdapter Enable-NetAdapter Disable-NetAdapter 命令来处理此问题。

答案 1 :(得分:0)

如果您使用的是DHCP

然后将美元换成甜甜圈,您只需要续订DHCP租约即可。

这是您可以在CMD中轻松完成的操作(我敢肯定PS中可能有一种简单的方法,但我不为人所知)

这将释放当前分配的DHCP地址,等待几秒钟,然后将其续订。

IPConfig /Release & timeout 5 & IPConfig /Renew

在CLI或批处理脚本中,您可以设置一个do-while循环来循环,直到您需要返回预期的地址为止。

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禁用和启用NIC。

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

结合检查ping到互联网(如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 ) )

现在,将需要从CMD提示符处实例化PowerShell,我通常编写一个.cmd脚本包装,以供.ps1脚本在任务处理程序中或手动调用。

有时,我将编写一个嵌入了.cmd代码的组合ps脚本,并只创建一个强行。以原始的.cmd脚本作为。 .ps1执行ps代码。

尽管如此简单,但使用PowerShell.exe作为嵌入式命令运行脚本可能是最简单的。

但是所有道路都通向罗马,您需要执行PowerShell,但是要定期运行它,则需要安排脚本运行,并且默认情况下无法直接运行ps脚本,因此选择一种您喜欢的方法,该方法可用于运行脚本,然后使用Windows Scheduler将任务安排为在您喜欢的每个x间隔(例如每小时)运行一次

让您选择一个新任务(而不是基本任务),然后选择“以最高特权运行”复选框,然后在兼容性列表框中选择最新版本的Windows。

确保提供管理员的用户名和密码,并选择保存密码/运行(无论用户是否登录)。

设置触发器并放入您选择的执行脚本的方法,并运行一些测试以确保其可以正常工作。

编辑:

原始方法为DO {动作} WHILE (要检查的条件返回True ),因为While结束时它保证一个迭代。

由于即使在Internet可ping通的情况下也不想禁用和启用NIC,因此可以使用WHILE (条件检查返回的真值) {操作}

$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
}

您绝对需要安排任务才能定期运行此任务。

即使您只想启动一次并将其留在后台,并且总是进行havit检查(我们可以这样做),您仍需要设置一个计划任务以杀死它(如果仍在运行),然后重新启动它间隔一定的时间,因为可能会导致进程无响应或被杀死,或者使计算机重新启动等,而您却忘记了启动脚本等。

此版本每隔一分钟就会循环检查一次,并且仅在无法访问Internet时执行。

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
}