WiFi & LAN – razem, a jednak osobno…

W firmie czy w domu często korzystamy z WiFi albo LAN. Zdarza się, że istnienie dwóch jednocześnie podłączonych sieci powoduje kłopoty. Niektórzy producenci laptopów dostarczają odpowiednie oprogramowanie, które umożliwia zarządzanie połączeniami (czy to z poziomu BIOS-u czy też jakiś dodatkowych narzędzi instalowanych w systemie operacyjnym). Spotkałem się z siecią, w której funkcjonowały laptopy firmy X :), nie posiadające takich rozwiązań. Użytkownicy zaś nie byli chętni do współpracy (czyt. nie chcieli ręcznie wyłączać sieci Wi-Fi po podpięciu laptopa do stacji dokującej).
Z pomocą przyszedł PowerShell i WMI 🙂
for (;;)
{
$lan_adapter = Get-WmiObject win32_networkadapter | where {$_.NetConnectionID -match "Local"}
$wlan_adapter = Get-WmiObject win32_networkadapter | where {$_.NetConnectionID -match "Wireless"}
if ($lan_adapter.NetConnectionStatus -eq 2)
{
echo "Wired Network is ON"
}
else
{
echo "Wired Network is OFF"
}
if ($wlan_adapter.NetConnectionStatus -eq 2)
{
echo "Wireless Network is ON"
}
else
{
echo "Wireless Network is OFF"
}
if (($wlan_adapter.NetConnectionStatus -eq 2) -and ($lan_adapter.NetConnectionStatus -eq 2))
{
echo "WiFi & LAN are connected - disabling WiFi"
$wlan_adapter.Disable()
}
if (($lan_adapter.NetConnectionStatus -eq 0) -or ($lan_adapter.NetConnectionStatus -eq 3) -or ($lan_adapter.NetConnectionStatus -eq 7) -and ($wlan_adapter.NetConnectionStatus -eq 0) )
{
echo "Lan is disconnected - enabling WiFi"
$wlan_adapter.Enable()
}
Start-Sleep 1
}

Słówko wyjaśnienia na temat klasy Win32_NetworkAdapter: Nie wszystkie właściwości tej klasy są uzupełnione i dostępne, wobec czego ja w powyższym skrypcie stosuję właściwość NetworkConnectionID.
Powyższy skrypt wyświetli komunikat z wynikiem. Jeśli zajdzie potrzeba uruchomienia go jako serwis, musimy pozbyć się wszelkich komunikatów. W wersji „cichej” kod wygląda następująco:
for (;;)
{
$lan_adapter = Get-WmiObject win32_networkadapter | where {$_.NetConnectionID -match "Local"}
$wlan_adapter = Get-WmiObject win32_networkadapter | where {$_.NetConnectionID -match "Wireless"}
if (($wlan_adapter.NetConnectionStatus -eq 2) -and ($lan_adapter.NetConnectionStatus -eq 2))
{
$wlan_adapter.Disable()| Out-Null
}
if (($lan_adapter.NetConnectionStatus -eq 0) -or ($lan_adapter.NetConnectionStatus -eq 3) -or ($lan_adapter.NetConnectionStatus -eq 7) -and ($wlan_adapter.NetConnectionStatus -eq 0) )
{
$wlan_adapter.Enable() | Out-Null
}
Start-Sleep 1
}

Wykorzystując skrypt ps2exe.ps1 pobrany stąd zamieniłem plik .ps1 na działającego exec’a i dodałem do serwisów Windowsa 🙂 w ten oto krótki sposób:

sc create WiFi_LAN binpath= „C:\scripts\bin\lan_check.exe” displayname= „Wi-Fi and LAN checker (prevent to use Wireless when the LAN wire is connected)” depend= Tcpip start= auto

Tak właśnie wyręczam leniwych użytkowników 😉

 

Piotr Berent

Piotr Berent od 2002 w pocie czoła pracujący w środowisku IT, obecnie freelancer - Inżynier Systemowy. Entuzjasta wirtualizacji, automatyzacji i rozwiązań opartych o narzędzia open-source.

Przeczytaj także...

2 komentarze

  1. Anonim napisał(a):

    mi wyświetla cały czas wired network is off i wireless network is off nie zależnie czy się przełączam miedzy stacja dok, wl/wyl wifi

Dodaj komentarz