Estou executando um antigo sistema Windows 7 em wifi que acesso remotamente para monitorar.
O problema é que o wifi é imprevisível (devido a problemas estranhos no roteador) e preciso que esse sistema esteja online a qualquer hora do dia. Estranhamente, quando o wifi cai, ele não tende a se reconectar automaticamente, mesmo que ainda esteja disponível e o Windows esteja configurado para se reconectar a ele.
Encontrei uma pergunta semelhante com uma resposta aqui, mas era para uma rede com fio e, infelizmente, a solução não funciona no meu sistema.
É um arquivo em lote conforme criado abaixo. Eu executei, desliguei o roteador wifi que interrompeu os pings, mas ele não completou a instrução if para redefinir a interface. A janela de comando simplesmente mostra que o tempo limite do ping expirou e continua repetindo isso até que a conexão seja restabelecida. O arquivo de log não registra um erro, portanto nunca chega à parte do erro da instrução if. Alterei a var "Interface" original de "Conexão de área local" para "Conexão de rede sem fio"
Alguém pode solucionar isso ou sugerir uma opção alternativa para redefinir o adaptador automaticamente quando a rede cair, pois isso parece resolver o problema. Preciso adicionar "Conexão de rede sem fio (%SSID%)" como interface?
Obrigado!
Panterateama
@echo off
set INTERFACE="Local Area Connection"
set TIMEOUT=3600
set IP=8.8.8.8
set LOG="watchdog.log"
echo %DATE% %TIME%: Watchdog started >> %LOG%
:loop
rem First check the interface for an hour by pinging the Google DNS
rem and resetting the networking interface if it should fail.
ping -n %TIMEOUT% -w 1000 -l 0 %IP%
if %errorlevel% NEQ 1 goto :loop
echo %DATE% %TIME%: Connection failed. Restarting interface.. >> %LOG%
netsh interface set interface %INTERFACE% disable
netsh interface set interface %INTERFACE% enable
rem Give it another shot but restart the whole computer if it the
communication should still fail
ping -n %TIMEOUT% -w 1000 -l 0 %IP%
if %errorlevel% NEQ 1 goto :loop
echo %DATE% %TIME%: Still no connection. Restarting computer.. >> %LOG%
shutdown /r /c "Internet wathchdog"
echo %DATE% %TIME%: Waiting for system to shut down >> %LOG%
choice /T %TIMEOUT% /D Y /N > NUL
echo %DATE% %TIME%: Gave up on the shut down attempt. Trying again.. >>
%LOG%
goto :loop
Responder1
Altere TIMEOUT para 30. Isso solicitará que ele execute a redefinição se a conexão estiver inativa por 30 segundos. Caso contrário, ele deverá ficar inativo por 3.600 segundos (1 hora).
Além disso, você não deve usar 8.8.8.8 para essa finalidade. Em vez disso, você deve usar o endereço IP do gateway encontrado em ipconfig
. Se você usar um IP externo como 8.8.8.8, seu computador irá redefinir sua conexão e até mesmo reiniciar seu computador se algo como sua Internet simplesmente cair.
Ao usar um IP interno como o endereço do seu gateway, ele só será redefinido ou reiniciado quando a conexão wi-fi estiver realmente desligada.
Além disso, você pode executar isso como uma tarefa agendada para ser executada com os privilégios mais altos, como nt authority\system
na inicialização do computador. Mas eu mudaria o tempo limite para algo um pouco mais longo, como 300 segundos, porque o script pode ser executado antes que sua pilha de rede esteja totalmente operacional.
EDIT: Conforme afirmado nos comentários, o script postado na pergunta simplesmente não funciona. O problema com o script original é que o comando ping pode retornar uma "Resposta de xxx.xxx.xxx.xxx: Host de destino inacessível", o que resulta em um nível de erro "bem-sucedido".
Abaixo está um script atualizado que funciona e altera a lógica para detectar com mais eficiência uma conexão interrompida. Também removi a parte que reinicializaria o computador - considero isso desnecessário e potencialmente problemático. Observe que NÃO haverá saída na tela deste comando quando ele estiver em execução. Certifique-se de que o nome da interface de rede adequado foi obtido usando o netsh interface show interface
comando.
@echo off
REM Modified by Appleoddity - 10/11/2017
REM Fixed ping status check; Removed shutdown/reboot ability; Improved logging
REM This script MUST RUN AS ADMIN
REM
REM Obtain network interface name with 'netsh interface show interface'
REM
REM Change the INTERFACE; THRESHOLD; IP; and LOG variables below.
REM Note: THRESHOLD is not necessarily the number of seconds before reset - but close
REM
setlocal EnableDelayedExpansion
set INTERFACE="Wi-Fi"
set THRESHOLD=30
set IP=10.1.10.1
set LOG="watchdog.log"
echo %DATE% %TIME%: Watchdog started >> %LOG%
SET /A COUNT=0
REM Loop until <THRESHOLD> failed, consecutive pings are counted
:LOOP
ping -n 1 -w 1000 -l 0 %IP% | find /i " bytes=" >NUL 2>&1
if errorlevel 1 (
set /A COUNT+=1
echo %DATE% %TIME%: Failed ping detected - Count = !COUNT!. >> %LOG%
) ELSE (
set /A COUNT=0
REM Pause
ping -n 2 -w 1000 -l 0 127.0.0.1 >NUL 2>&1
)
if %COUNT% GEQ %THRESHOLD% (
echo %DATE% %TIME%: %THRESHOLD% failed pings exceeded. >> %LOG%
GOTO RESET
)
GOTO LOOP
REM Reset the network interface
:RESET
echo %DATE% %TIME%: Restarting network interface - %INTERFACE% >> %LOG%
netsh interface set interface "%INTERFACE%" admin=DISABLED >NUL 2>&1
netsh interface set interface "%INTERFACE%" admin=ENABLED >NUL 2>&1
SET /A COUNT=0
GOTO LOOP
Responder2
Se você está conseguindo"Uma interface com esse nome não está registrada no roteador"erro, significa que você não está selecionando o adaptador de rede correto em seu script.
Você está executando o lote/comando como Admin?
Se quiser ter certeza de que possui direitos de administrador, você pode executarncpa.cplou
netsh interface show interface
que fornece uma lista de adaptadores e, em seguida, escreva algo assim, com base nos nomes dos adaptadores:
netsh interface set interface name="Local area connection" admin="disabled"
netsh interface set interface name="Wireless Network Connection" admin="disabled"
netsh interface set interface name="Local area connection" admin="enabled"
netsh interface set interface name="Wireless Network Connection" admin="enabled"
Isso redefinirá o adaptador necessário e você poderá usar & para encadeá-los todos juntos:
netsh interface set interface name="Local area connection" admin="disabled" & netsh interface set interface name="Local area connection" admin="enabled"