Hotspot i brak internetu? Rozwiązujemy i automatyzujemy!

Jakiś rok temu natknąłem się na dość błahy, ale uporczywy problem. Czasem musiałem się przepinać między sieciami WIFI, pomiędzy moim domowym routerem, a hotspotem zestawionym z mojego smartfona od stajni Xiaomi. W momencie zestawienia połączenia między laptopem a hotspotem, przestał działać mi Internet… brzmi jak typowa sprawa z Helpdesku pod tytułem „Kliknąłem coś i dzieją się rzeczy niestworzone” (ten cytat to autentyk, tak było).

Chyba każdy administrator odpala w tym momencie cmd i używa pinga na jakiś adres, który na 100% działa. Tak jak się spodziewałem, ping zwrócił absolutny brak odpowiedzi:

Ping na google.com również nie działa, w zasadzie nic nie działa. Miałem możliwość więc przepiąłem się na inną sieć i dokończyłem to co chciałem zrobić, myśląc, że to pewnie tymczasowy problem. Niestety, sytuacja kolejnego dnia się powtórzyła. Wtedy zacząłem zacząłem robić bardziej wnikliwą analizę. Sprawdziłem czy mam adres DNS serwera za pomocą komendy ipconfig /all | find „DNS”:

Pusto… Przełączam się z hotspota na router i wpisuję tę samą komendę:

Wygląda na to, że Xiaomi gubi po drodze DNS, bo Internet w telefonie działa aż miło. Ustawiam więc adres serwera DNS ręcznie i zapominam o sprawie. Na „deja vu” czekałem do kolejnego momentu, gdy byłem zmuszony skorzystać z hotspota. W tym momencie wypowiedziałem temu wojnę.

W pierwszym przypadku przeszukałem Dziennik Zdarzeń (EventViewer) w poszukiwaniu zdarzeń odpowiedzialnych za połączenie się komputera z siecią bezprzewodową. Znalazłem całkiem sensowne wpisy w rozwijając drzewko „Dzienniki aplikacji i usług” -> Microsoft -> Windows -> Network Profile. Wdzięcznie nazwany log „Działa” ukazał się moim oczom i zacząłem szperać. Bardzo szybko natrafiłem na dwa EventID: 10000 i 10001. Pierwszy oznacza podłączenie się do sieci, drugi rozłączenie od niej:

Zobaczcie, widać wyraźnie do jakiej sieci się łączymy i ten fakt wykorzystamy, na pomoc głodnej karcie sieciowej przychodzi Windowsowy cron, czyli Harmonogram zadań! Poprzez polecenie Run i wpisując „taskschd.msc” ujawnia nam się odpowiednia konsola. Klikamy na „Utwórz zadanie” i przechodzimy przez całe menu. W pierwszej zakładce wystarczy, że nadamy jakaś nazwę:

Teraz powinniśmy przejść do wyzwalaczy, czyli co uruchomi naszą komendę do zmiany adresu DNS. W naszym wypadku konkretny event o identyfikatorze 10000. Klikamy więc na [Dodaj], a następnie uzupełniamy wszystko jak poniżej:

Zatwierdzamy przyciskiem [OK] i przechodzimy do akcji. Tutaj musimy wiedzieć jak zmienić adres serwera DNS za pomocą skryptu. Możemy iść drogą dwojaką – albo PowerShell albo CMD. Zacznijmy może od tej pierwszej opcji:

Aby cokolwiek zmienić z konkretnym interfejsem, musimy znać jego nazwę lub index. Pomoże nam w tym komenda Get-NetIpInterface. Ja dodatkowo wybiorę ifIndex,InterfaceAlias,Dhcp, więc cała komenda wyglada następująco:

Get-NetIPInterface | Select ifIndex,InterfaceAlias,Dhcp

Powinniście otrzymać coś podobnego:

Myślę, że można śmiało założyć, że chodzi nam o interfejs „Wi-Fi” z indeksem 4. Okej, przejdźmy więc do zmiany adresu za pomocą komendy Set-DnsClientServerAddress:

Set-DnsClientServerAddress -InterfaceIndex 4 -ServerAddresses 1.1.1.1 -Validate

Podałem więc numer interfejsu, adres serwera DNS i przełącznik Validate, aby sprawdzić czy serwer będzie odpowiadać. Brak jakiegokolwiek komunikatu oznacza, że wszystko jest w porządku. U mnie test zaliczony, zapisuję więc tę komendę w pliku .ps1.

W harmonogramie zadań przechodzimy na akcję, klikamy na [Nowy…] i wypełniamy ją podobnie jak ja poniżej:

Zawsze polecam umieszczać -ExecutionPolicy z ByPass, jeśli skrypt jest naszego autorstwa, a nie jest podpisany, w końcu nie jest zalecane zmienianie polisy uruchomieniowej na całym systemie. Zatwierdzamy klikając [OK] i możemy zacząć testować.

A teraz rozwiązanie oparte o stary CMD.

Ponownie, najpierw potrzebujemy nazwę interfejsu – netsh int ipv4 show int:

A teraz zmiana adresu DNS – netsh int ipv4 set dnsservers name=”Wi-Fi” static SERWER_DNS primary

Brak błędu oznacza, że nam się to udało 🙂 W harmonogramie zadań wklepujemy powyższą komendę w następujący sposób:

Ponieważ harmonogram zadań potrafi płatać figle i nie wywołać zadania, gorąco polecam zaznaczyć poniższą opcję – w przypadku mocnego obciążenia serwera może się okazać, że czas na uruchomienie już minął, Windows nie odpali więc naszego zadania. Po zaznaczeniu tej opcji mamy pewność, że zadanie jest na 100% zakolejkowane i będzie uruchomione.

Teraz zapisujemy zadanie i możemy testować 😊 Uff, dotarliśmy do końca tego poradnika. Mam nadzieję, że w gdy zajdzie taka potrzeba, to Wam się przyda. Ale z pewnością możecie to potraktować jako ciekawostkę o systemie i meandrach ustawień sieci w Windows.

Jeśli chodzi o telefon, to używałem wtedy Xiaomi Redmi Note 5, problem ustał po jednej z aktualizacji systemu.

Marcin Kuchczyński

Wielki fan automatyzowania wszystkiego, co trzeba wykonać więcej niż 2 razy. Cierpliwie rozwijający się w kierunku rozwiązań chmurowych i raczkujący w sferze sztucznej inteligencji. W IT od 2016 roku.

Leave a Reply