Niezależnie od jakości zarządzanej sieci bezprzewodowej, poprawności jej struktury, godzin spędzonych nad dopieszczaniem konfiguracji, przychodzi moment, w którym coś przestaje działać i trzeba szybko zebrać informacje o urządzeniu klienckim. W przypadku systemu Windows pomocne okazuje się narzędzie netsh – nie tylko do zbierania informacji, lecz także do konfiguracji samego urządzenia!
O narzędziu słów kilka
Netsh jest wbudowanym narzędziem dostępnym w systemie Windows począwszy od wersji Windows 2000. Umożliwia ono wyświetlanie i modyfikowanie ustawień sieciowych urządzenia z odpowiednim systemem operacyjnym, korzystając z dedykowanych komend w CLI. Jest to zatem alternatywa dla graficznego podejścia, mająca swoje plusy (o czym w dalszej części).
Korzystanie z netsh możliwe jest pośrednio poprzez Wiersz Poleceń (cmd.exe) lub Windows PowerShell (powershell.exe) wywołując komendę netsh, a także bezpośrednio poprzez aplikację netsh (netsh.exe) dostępną w katalogu */Windows/System32/. Uruchomienie netsh i wyświetlenie dostępnych komend przy użyciu ’?’ wygląda tak:
C:UsersNSS> netsh
netsh>
netsh>?
The following commands are available:
Commands in this context:
.. - Goes up one context level.
? - Displays a list of commands.
abort - Discards changes made while in offline mode.
add - Adds a configuration entry to a list of entries.
advfirewall - Changes to the `netsh advfirewall' context.
alias - Adds an alias.
bridge - Changes to the `netsh bridge' context.
bye - Exits the program.
commit - Commits changes made while in offline mode.
delete - Deletes a configuration entry from a list of entries.
dhcpclient - Changes to the `netsh dhcpclient' context.
dnsclient - Changes to the `netsh dnsclient' context.
dump - Displays a configuration script.
exec - Runs a script file.
exit - Exits the program.
firewall - Changes to the `netsh firewall' context.
help - Displays a list of commands.
http - Changes to the `netsh http' context.
interface - Changes to the `netsh interface' context.
ipsec - Changes to the `netsh ipsec' context.
lan - Changes to the `netsh lan' context.
mbn - Changes to the `netsh mbn' context.
namespace - Changes to the `netsh namespace' context.
netio - Changes to the `netsh netio' context.
offline - Sets the current mode to offline.
online - Sets the current mode to online.
p2p - Changes to the `netsh p2p' context.
popd - Pops a context from the stack.
pushd - Pushes current context on stack.
quit - Exits the program.
ras - Changes to the `netsh ras' context.
rpc - Changes to the `netsh rpc' context.
set - Updates configuration settings.
show - Displays information.
trace - Changes to the `netsh trace' context.
unalias - Deletes an alias.
wcn - Changes to the `netsh wcn' context.
wfp - Changes to the `netsh wfp' context.
winhttp - Changes to the `netsh winhttp' context.
winsock - Changes to the `netsh winsock' context.
wlan - Changes to the `netsh wlan' context.
The following sub-contexts are available:
advfirewall bridge dhcpclient dnsclient firewall http interface ipsec lan mbn namespace netio p2p ras rpc trace wcn wfp winhttp winsock wlan
To view help for a command, type the command, followed by a space, and then
type ?.
netsh>
Code language: plaintext (plaintext)
Z czego korzystać? Osobiście polecam używać Windows PowerShell gdy:
- jest dostępny na danej wersji Windows OS – PowerShell powstał w roku 2006,
- sprawdzasz lub konfigurujesz coś manualnie – PowerShell ma wiele wspaniałych cech, które poprawiają użytkowanie w porównaniu do CMD, np. dużo dłuższa historia outputu komend, dynamiczne zawijanie/rozwijanie outputu podczas skalowania okna, łatwiejsze kopiowanie i wklejanie tekstu.
Używaj natomiast CMD zamiast PowerShella, gdy planujesz użycie netsh w formie automatycznie uruchamianego skryptu. Dzięki temu skrypt uruchomi się zawsze, niezależnie od wersji systemu Windows.
Jak już wspomniałem netsh związany jest z ustawieniami sieciowymi urządzenia – nie tylko karty LAN czy WLAN, lecz także stosu TCP/IP, wbudowanej funkcjonalności serwera DHCP, firewalla itp. W poniższych przykładach skupiam się na konfiguracji i troubleshootingu klienta bezprzewodowego, ale nic nie stoi na przeszkodzie, aby przynajmniej część tych komend lub samą zasadę działania netsh przełożyć na klienta kablowego.
„Czy wiesz że…?”
W celu poprawnego działania komend (zwłaszcza konfiguracyjnych) zaleca się uruchomienie netsh jako administrator (prawoklik -> Uruchom jako Administrator).
Konfiguracja i wyświetlanie ustawień
Zaczynamy od wyświetlenia dostępnych interfejsów:
netsh interface show interface
Admin State State Type Interface Name
-------------------------------------------------------------------------
Enabled Disconnected Dedicated Ethernet
Enabled Connected Dedicated VMware Network Adapter VMnet1
Enabled Connected Dedicated VMware Network Adapter VMnet8
Enabled Connected Dedicated Wi-Fi
Code language: plaintext (plaintext)
Na liście znajdują się cztery interfejsy – Ethernet, Wi-Fi oraz dwa z VMware. Sprawdźmy aktualną konfigurację interfejsu Wi-Fi:
netsh interface ip show config name=Wi-Fi
Configuration for interface "Wi-Fi"
DHCP enabled: Yes
IP Address: 192.168.5.10
Subnet Prefix: 192.168.5.0/24 (mask 255.255.255.0)
Default Gateway: 192.168.5.1
Gateway Metric: 0
InterfaceMetric: 55
DNS servers configured through DHCP: 192.168.5.1
Register with which suffix: Primary only
WINS servers configured through DHCP: None
Code language: plaintext (plaintext)
Jak widzisz korzystam z DHCP w celu uzyskania adresu IP i ustawień DNS/WINS. Osiągnięcie takiej konfiguracji możliwe jest poprzez podanie komend:
netsh interface ip set address name=Wi-Fi source=dhcp
netsh interface ip set dnsservers name=Wi-Fi source=dhcp
netsh interface ip set winsservers name=Wi-Fi source=dhcp
Code language: plaintext (plaintext)
Odpowiada to poniższej konfiguracji w trybie graficznym:
Oczywiście możliwe jest także statyczne przypisanie przytoczonych parametrów. Osiągniemy to wpisując poniższe komendy:
netsh interface ip set address name=Wi-Fi source=static addr=10.10.0.5 mask=255.255.255.0 gateway=10.10.0.1 gwmetric=0
netsh interface ip set dnsservers name=Wi-Fi source=static addr=10.10.0.1
netsh interface ip set winsservers name=Wi-Fi source=static addr=10.10.0.1
Code language: plaintext (plaintext)
Dzięki temu uzyskamy poniższą konfigurację:
netsh interface ip show config name=Wi-Fi
Configuration for interface "Wi-Fi"
DHCP enabled: No
IP Address: 10.10.0.5
Subnet Prefix: 10.10.0.0/24 (mask 255.255.255.0)
Default Gateway: 10.10.0.1
Gateway Metric: 0
InterfaceMetric: 55
Statically Configured DNS Servers: 10.10.0.1
Register with which suffix: Primary only
Statically Configured WINS Servers: 10.10.0.1
Code language: plaintext (plaintext)
Odpowiada to poniższej konfiguracji w trybie graficznym:
Tak przygotowaną konfigurację można zapisać do pliku w celu późniejszego wczytania. Poniższa komenda zapisze konfigurację z kontekstu interface do pliku o nazwie config.dat:
netsh interface dump > config.dat
Code language: plaintext (plaintext)
Można także zawęzić interesujący nas zakres konfiguracji. Poniższa komenda zapisze tylko konfigurację dotyczącą ipv4 z kontekstu interface:
netsh interface ipv4 dump > config.dat
Code language: plaintext (plaintext)
Konfigurację można wczytać wykonując poniższą komendę:
netsh exec config.dat
Code language: plaintext (plaintext)
Troubleshooting Wi-Fi
W netsh mamy dostęp do kontekstu wlan, a w nim mnóstwo przydatnych informacji dotyczących karty bezprzewodowej, parametrów aktualnego połączenia, sieci Wi-Fi „słyszanych” przez to urządzenie oraz wiele innych. To wszystko może nam pomóc w znalezieniu problemu w sieci WLAN.
Na początek warto sprawdzić z jaką kartą bezprzewodową mamy do czynienia:
netsh wlan show drivers
Interface name: Wi-Fi
Driver : Karta bezprzewodowej sieci LAN 802.11n
Vendor : Ralink Technology, Corp.
Provider : Microsoft
Date : 2015-05-18
Version : 5.0.57.0
INF file : netr28x.inf
Type : Native Wi-Fi Driver
Radio types supported : 802.11b 802.11g 802.11n
FIPS 140-2 mode supported : Yes
802.11w Management Frame Protection supported : Yes
Hosted network supported : Yes
Authentication and cipher supported in infrastructure mode:
Open None
Open WEP-40bit
Open WEP-104bit
Open WEP
WPA-Enterprise TKIP
WPA-Enterprise CCMP
WPA-Personal TKIP
WPA-Personal CCMP
WPA2-Enterprise TKIP
WPA2-Enterprise CCMP
WPA2-Personal TKIP
WPA2-Personal CCMP
Vendor defined TKIP
Vendor defined CCMP
WPA2-Enterprise Vendor defined
WPA2-Enterprise Vendor defined
Vendor defined Vendor defined
Vendor defined Vendor defined
Vendor defined Vendor defined
Authentication and cipher supported in ad-hoc mode:
Open None
Open WEP-40bit
Open WEP-104bit
Open WEP
WPA2-Personal CCMP
Vendor defined Vendor defined
Wireless Display Supported: Yes (Graphics Driver: Yes, Wi-Fi Driver: Yes)
Code language: plaintext (plaintext)
W powyższym outpucie możemy znaleźć między innymi takie informacje:
- producent/model karty bezprzewodowej,
- wersja sterownika i jego data,
- obsługiwane standardy IEEE 802.11,
- wspierane metody uwierzytelniania i szyfrowania.
Taka wiedza pozwoli nam określić możliwości karty bezprzewodowej, zakres obsługiwanych częstotliwości oraz podjąć decyzję o ewentualnym zaktualizowaniu sterownika.
Kolejna komenda da nam trochę dodatkowych informacji o karcie bezprzewodowej. Tak to może wyglądać gdy urządzenie nie jest podłączone do sieci Wi-Fi:
netsh wlan show interfaces
There is 1 interface on the system:
Name : Wi-Fi
Description : Karta bezprzewodowej sieci LAN 802.11n
GUID : da111d5e-d551-4aae-5t28-216556df565b
Physical address : 48:5a:b6:a2:16:11
State : disconnected
Radio status : Hardware On
Software On
Hosted network status : Not available
Code language: plaintext (plaintext)
Dzięki temu dowiadujemy się o adresie MAC karty bezprzewodowej i statusie radia. Ta sama komenda daje bardziej rozbudowany output gdy jesteśmy podłączeni do sieci Wi-Fi:
netsh wlan show interfaces
There is 1 interface on the system:
Name : Wi-Fi
Description : Karta bezprzewodowej sieci LAN 802.11n
GUID : da111d5e-d551-4aae-5t28-216556df565b
Physical address : 48:5a:b6:a2:16:11
State : connected
SSID : TEST_SSID
BSSID : 70:0b:01:1c:24:34
Network type : Infrastructure
Radio type : 802.11n
Authentication : WPA2-Personal
Cipher : CCMP
Connection mode : Profile
Channel : 6
Receive rate (Mbps) : 72
Transmit rate (Mbps) : 72
Signal : 100%
Profile : TEST_SSID
Hosted network status : Not available
Code language: plaintext (plaintext)
Pojawiła się informacja o sieci do której jesteśmy podłączeni – SSID, BSSID, użyte metody uwierzytelniania i szyfrowania, a także siła sygnału oraz data rates. Dzięki tym informacjom możemy sprawdzić do jakiego Access Pointa łączy się to urządzenie (sprawdzając BSSID) i ocenić czy odległość od niego nie jest zbyt duża.
Poniżej ostatnia komenda pokazująca możliwości urządzenia pod względem połączenia bezprzewodowego. Output został przycięty do najciekawszych informacji:
netsh wlan show wirelesscapabilities
Wireless System Capabilities
----------------------------
Number of antennas connected to the 802.11 radio (value not available)
Max number of channels the device can operate on, simultaneously (value not available)
Co-existence Support : Unknown
Wireless Device Capabilities
----------------------------
Interface name: Wi-Fi
(...)
Station : Supported
Soft AP : Supported
Network monitor mode : Supported
Wi-Fi Direct Device : Supported
Wi-Fi Direct GO : Supported
Wi-Fi Direct Client : Supported
Protected Management Frames : Supported
DOT11k neighbor report : Unknown
ANQP Service Information Discovery : Not Supported
Action Frame : Not Supported
Diversity Antenna : Unknown
IBSS : Supported
Promiscuous Mode : Supported
(...)
MAC Randomization : Not Supported
Fast Transition : Not Supported
MU-MIMO : Unknown
Miracast Sink : Unknown
BSS Transition (802.11v) : Unknown
IHV Extensibility Module Configured : Not Supported
Number of Tx Spatial Streams : 0
Number of Rx Spatial Streams : 0
Number of Concurrent Channels Supported : 2
(...)
Code language: plaintext (plaintext)
Pora na rozejrzenie się dookoła 🙂 Poniższa komenda wylistuje sieci „słyszane” przez nasze urządzenie oraz dodatkowe informacje na ich temat:
netsh wlan show networks mode=bssid
Interface name : Wi-Fi
There are 10 networks currently visible.
SSID 1 : TEST_SSID
Network type : Infrastructure
Authentication : WPA2-Personal
Encryption : CCMP
BSSID 1 : 70:0b:01:1c:24:34
Signal : 100%
Radio type : 802.11n
Channel : 6
Basic rates (Mbps) : 1 2 5.5 11
Other rates (Mbps) : 6 9 12 18 24 36 48 54
SSID 2 : UPC1064xxx
Network type : Infrastructure
Authentication : WPA2-Personal
Encryption : CCMP
BSSID 1 : 44:32:c8:32:90:11
Signal : 22%
Radio type : 802.11n
Channel : 1
Basic rates (Mbps) : 1 2 5.5 11
Other rates (Mbps) : 6 9 12 18 24 36 48 54
SSID 3 : UPC4496xxx
Network type : Infrastructure
Authentication : WPA2-Personal
Encryption : CCMP
BSSID 1 : 58:23:8c:7f:b8:56
Signal : 30%
Radio type : 802.11n
Channel : 1
Basic rates (Mbps) : 1 2 5.5 11
Other rates (Mbps) : 6 9 12 18 24 36 48 54
SSID 4 : UPC Wi-Free
Network type : Infrastructure
Authentication : WPA2-Enterprise
Encryption : CCMP
BSSID 1 : 92:5c:14:ab:9b:f2
Signal : 20%
Radio type : 802.11n
Channel : 6
Basic rates (Mbps) : 1 2 5.5 11
Other rates (Mbps) : 6 9 12 18 24 36 48 54
BSSID 2 : fe:94:e3:3f:18:1c
Signal : 16%
Radio type : 802.11n
Channel : 7
Basic rates (Mbps) : 1 2 5.5 11
Other rates (Mbps) : 6 9 12 18 24 36 48 54
Code language: plaintext (plaintext)
Ciekawy przypadek dotyczy SSID 4 : UPC Wi-Free. Jak widzisz są tam widoczne 2 BSSID. Oznacza to tyle, że nasze urządzenie „słyszy” dwa różne radia (w domyśle dwa różne Access Pointy) rozgłaszające to samo SSID.
Poniższa komenda wylistuje wszystkie profile sieci bezprzewodowych zapisane na tym urządzeniu:
netsh wlan show profiles
Profiles on interface Wi-Fi:
Group policy profiles (read only)
User profiles
All User Profile: TEST_SSID
All User Profile: Siec_domowa
All User Profile: Kolejna_Zwyczajna_Siec
Code language: plaintext (plaintext)
Poniższa komenda pokaże szczegóły wybranego profilu razem z odszyfrowanym hasłem dostępu w parametrze Key Content (w przypadku sieci zabezpieczonej PSK):
netsh wlan show profiles name=TEST_SSID key=clear
Profile TEST_SSID on interface Wi-Fi:
=======================================================================
Applied: All User Profile
Profile information
-------------------
Version : 1
Type : Wireless LAN
Name : TEST_SSID
Control options :
Connection mode : Connect manually
Network broadcast : Connect only if this network is broadcasting
AutoSwitch : Do not switch to other networks
MAC Randomization : Disabled
Connectivity settings
---------------------
Number of SSIDs : 1
SSID name : "TEST_SSID"
Network type : Infrastructure
Radio type : [ Any Radio Type ]
Vendor extension : Not present
Security settings
-----------------
Authentication : WPA2-Personal
Cipher : CCMP
Authentication : WPA2-Personal
Cipher : GCMP
Security key : Present
Key Content : hasloDOsieci123!
Cost settings
-------------
Cost : Unrestricted
Congested : No
Approaching Data Limit : No
Over Data Limit : No
Roaming : No
Cost Source : Default
Code language: plaintext (plaintext)
W celu wyświetlenia wszystkich powyższych komend typu show oraz wielu innych wystarczy wykonać poniższą komendę. Output będzie bardzo długi więc warto całość przekierować do pliku tekstowego:
netsh wlan show all > plik.txt
Code language: plaintext (plaintext)
Netsh pozwala również na manipulowanie połączeniem. W celu podłączenia urządzenia do sieci bezprzewodowej należy wykonać poniższą komendę:
netsh wlan connect name=TEST_SSID ssid=TEST_SSID interface=Wi-Fi
Connection request was completed successfully.
Code language: plaintext (plaintext)
Parametr name w powyższej komendzie oznacza nazwę profilu sieci. Odłączenie od aktualnej sieci bezprzewodowej to:
netsh wlan disconnect interface=Wi-Fi
Disconnection request was completed successfully for interface "Wi-Fi".
Code language: plaintext (plaintext)
Natomiast wyłączenie/włączenie karty sieciowej to odpowiednio:
netsh interface set interface name=Wi-Fi admin=disabled
netsh interface set interface name=Wi-Fi admin=enabled
Code language: plaintext (plaintext)
Automatyzacja
Narzędzie netsh posiada interfejs CLI więc warto zainteresować się automatyzacją korzystania z wymienionych komend. Możliwe przypadki użycia to między innymi:
- skrypt wyłączający/resetujący/włączający kartę sieciową,
- skrypt łączący urządzenie z podanym SSID w podanym przypadku,
- generowanie raportów zawierających informacje o wersji sterowników urządzeń w sieci,
- skrypt automatycznie zbierający wszystkie informacje potrzebne do troubleshootingu.
Sposobów na automatyzację jest co najmniej kilka, na pewno można zrobić skrypty dla CMD (*.bat / *.cmd) lub Windows PowerShell (*.ps1). Jednak najciekawiej zapowiada się wykorzystanie do tego Pythona – o pierwszych krokach z Pythonem pisał wcześniej Damian.
Korzystanie z netsh jest bardzo przyjemne. Składnia jest zrozumiała, komendy przejrzyste i przede wszystkim działają tak jak jest to opisane. Na duży plus można zaliczyć możliwość zautomatyzowania tego procesu, a zwłaszcza uczynienie tego kroku przezroczystym dla użytkownika końcowego, który niekoniecznie musi wiedzieć o istnieniu Wiersza Poleceń.
Jak wygenerować raport graficzny
Bardzo ciekawą i mało oczywistą funkcją netsh jest możliwość tworzenia specjalnych raportów dostępnych do przejrzenia w formie pliku HTML. Przeczytasz o tym w naszym darmowym NSSletterze – mailingu dla sieciowców głodnych wiedzy.
Dołączając uzyskasz dostęp również do archiwum – tematykę tego artykułu rozszerzyliśmy w NSSletterze 033. Rozwiń swoją wiedzę już teraz i zapisz się używając formularza poniżej.
Artykuł oryginalnie opublikowany 20. grudnia 2018, a następnie odświeżony i zaktualizowany o nowe informacje 30. października 2023.
Ciekawe przykłady zastosowawnia netsh. Do dzisiaj używałem tylko skryptów do turn on/off karty sieciowej a tutaj widzę szerokie zastosowanie. Przy okazji zauważyłem, że jeden z AP mi nie działa 🙁
Czekam na więcej
No to już się przydało, to dobrze! 🙂 swoją drogą ciekawy use case na sprawdzanie dziania AP.
To samo można wykonać przy pomocy wbudowanych komend w PowerShell – zachęcam do research\’u, a ja mogę wspomóc artykułem w razie potrzeby 😉
Bardzo ciekawy artykuł przydatny do troubleshooting\’u z perspektywy obsługi klienta. Czy planujesz rozszerzenie artykułu o troubleshooting od strony infrastruktury czyli WLC i APka?
Dziękuję Michał 😉 troubleshooting od strony infrastruktury – tu mam nadal zagwozdkę co do formy takiego artykułu, póki co nie widzę innej opcji niż pokazanie tego na przykładzie konkretnego vendora bo i różne możliwości się wtedy pojawiają (czy w takim wypadku interesuje Cię jakiś konkretny sprzęt?). W każdym bądź razie w planach jest 😉
świetny artykuł, dzięki temu artykułowi widzę że wiele problemów mogę rozwiązać bez konieczności wykonywania wizji lokalnej 🙂 więcej takich artykułów!!!
Dzięki Patryk!
Przydatne. Dzięki. 🙂
Dzięki Krzysiek!
a co jeśli polecenie: netsh wlan show profiles name=TEST_SSID key=clear wcale nie wyświetla hasła do wifi? u mnie pokazuje tylko: „długość danych polecenia dostawcy=3276
Możesz spróbować uruchomić wiersz poleceń jako administrator i podesłać cały wynik tej komendy, którą podałeś?
proszę: Microsoft Windows [Wersja 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Wszelkie prawa zastrzeżone.
C:\Windows\system32>netsh wlan show profiles name=TP-Link_Parter key=clear
Profil TP-LINK_Parter w interfejsie Połączenie sieci bezprzewodowej 20:
=======================================================================
Zastosowano: Profil bieżącego użytkownika
Informacje o profilu
——————-
Wersja : 1
Typ : Bezprzewodowa sieć LAN
Nazwa : TP-LINK_Parter
Opcje sterowania :
Tryb połączenia : Połącz automatycznie
Emisja w sieci : połącz nawet, jeśli sieć nie wykonuje emisji
Autoprzełączanie : Jeśli to możliwe, przełącz na bardziej preferowaną
sieć
Ustawienia łączności
———————
Liczba identyf. SSID : 1
Nazwa SSID : „TP-LINK_Parter”
Typ sieci : Infrastruktura
Typ radia : [ Dowolny typ radia ]
Ident. rozsz. dostawcy : [ 0x00 0x80 0x86 ]
Ustawienia zabezpieczeń
—————–
Długość danych rozszerzenia dostawcy: 3276
C:\Windows\system32>
Czy to jest prywatny sprzęt, czy może urządzenie firmowe podłączone do domeny? Póki co nie przychodzi mi do głowy nic innego jak jakaś blokada w rejestrze, która została wypuszczona np. z domeny.
Taki wynik jest gdy do sieci autoryzujesz się certyfikatem a nie hasłem. Widzę tu nie cne zamiary 😀
🤫😂