Centrum skryptów - Systemy operacyjne

Jak sprawdzić, czy karta sieci bezprzewodowej jest podłączona do sieci?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak sprawdzić, czy karta sieci bezprzewodowej jest podłączona do sieci?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Zastanawia mnie, jak można sprawdzić, czy dana karta sieci bezprzewodowej jest rzeczywiście podłączona do sieci?

-- MS

Cześć Skrypciarze! Odpowiedź

Cześć, MS. Trafiłeś dziś w naprawdę smutny dzień – oto po 10 dniach zwiedzania, opalania się, opychania się włoskim jedzeniem, nastąpiło to, co niestety zawsze nieuchronnie następuje – mianowicie czas powrotu dla całej skrypciarskiej rodziny... Cała rodzina oczywiście ubolewa, więc co mi pozostało, żeby pocieszyć się chociaż trochę w tak okropny dzień? Właśnie, stare sprawdzone metody na poprawienie humoru, metody, za które w dodatku mi płacą – skrypt!!! I to nie byle jaki – skrypt, dzięki któremu można sprawdzić, czy dana karta sieci bezprzewodowej jest podłączona do sieci:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colItems = objWMIService.ExecQuery _

    ("Select * from Win32_NetworkAdapter Where Name = 'Broadcom 802.11a/b/g WLAN'")



For Each objItem in colItems

    Select Case objItem.NetConnectionStatus

        Case 0 strStatus = "Disconnected"

        Case 1 strStatus = "Connecting" 

        Case 2 strStatus = "Connected" 

        Case 3 strStatus = "Disconnecting" 

        Case 4 strStatus = "Hardware not present" 

        Case 5 strStatus = "Hardware disabled" 

        Case 6 strStatus = "Hardware malfunction" 

        Case 7 strStatus = "Media disconnected" 

        Case 8 strStatus = "Authenticating" 

        Case 9 strStatus = "Authentication succeeded" 

        Case 10 strStatus = "Authentication failed" 

        Case 11 strStatus = "Invalid address" 

        Case 12 strStatus = "Credentials required"

    End Select 

    Wscript.Echo "Net Connection Status: " & strStatus

Next

Gołym okiem widać, ze nie jest to najbardziej skomplikowany skrypt mojego autorstwa, ale klimat śródziemnomorski naprawdę rozleniwia, nawet człowieka, który i tak jest już rozleniwiony do granic rozleniwioności. Taka aura. Bez dywagacji i ubolewań jednak, wracać do skryptu! Większa część kodu oparta jest na twierdzeniu Select Case, które konwertuje zwrócone wartości (takie jak 0) na bardziej zrozumiałe wartości ciągu – na przykład Disconnected (rozłączony). Oprócz tego, niczego ciekawego nie doszukacie się w powyższym skrypcie.

Zaczynamy od połączenia się z usługą WMI na komputerze lokalnym. Czy można sprawdzić status karty sieci bezprzewodowej na komputerze zdalnym? Tak, ale z jednym zastrzeżeniem. Możemy oczywiście spróbować połączyć się z komputerem zdalnym; w tym celu przypisujemy nazwę komputera do zmiennej strComputer:

strComputer = "atl-fs-01"

Jedyna podpuchą jest to, że jeżeli komputer ma tylko jedna kartę sieci bezprzewodowej i jeżeli nie jest ona aktualnie podłączona, to oczywiście nie będzie można się z nim połączyć, nie mówiąc juz o usłudze WMI na takim komputerze. Na tym etapie nie wiemy czy a) komputer jest uruchomiony, ale nie podłączony do sieci, b) jest w ogóle uruchomiony. Najczęściej to rozróżnienie nie będzie dla Was istotne, ale mimo to zwracam uwagę.

Jeżeli system MS działa na standardowej pojedynczej karcie bezprzewodowej, to bardzo łatwo uzyskać informację na jej temat:

Set colItems = objWMIService.ExecQuery _

    ("Select * from Win32_NetworkAdapter Where Name = 'Broadcom 802.11a/b/g WLAN'")

Jak oczywiście juz się domyśliliście, powyższy wiersz kodu pobiera informację tylko o kartach sieciowych (klasy Win32_NetworkAdapter) o wartości nazwy (Name) Broadcom 802.11a/b/g WLAN. Co będzie, jeżeli używamy innej karty bezprzewodowej? Nic prostszego, wystarczy wpisać jej nazwę do naszej do kwerendy WQL. Jeśli na przykład nasza karta ma nazwę My Wireless Adapter, modyfikujemy nasza kwerendę w następujący sposób:

Set colItems = objWMIService.ExecQuery _

    ("Select * from Win32_NetworkAdapter Where Name = 'My Wireless Adapter'")

Co zaś, jeśli używamy wielu kart? Nie martwcie się, na końcu artykułu obiecuję umieścić skrypt zwracający informacje o połączeniu sieciowym wszystkich kart sieci bezprzewodowej w komputerze, bez względu na ich nazwę (musicie tylko dotrwać do końca tego artykułu).

Najpierw jednak musze odpowiedzieć MS. Po kwerendzie wracamy do naszego zestawu rekordów, który zawiera wszystkie karty o nazwie Broadcom 802.11a/b/g WLAN. Od tego miejsca uruchamiamy pętlę For Each, która przechodzi przez całą kolekcje. Wewnątrz pętli używamy twierdzenia Select Case i pobieramy wartość właściwości NetConnectionStatus; ta wartość będzie liczbą całkowitą odnoszącą się do jednego z poniższych stanów:

WartośćStan
0Rozłączony
1W trakcie łączenia
2Połączone
3W trakcie rozłączania
3W trakcie rozłączania
4Brak sprzętu
5Sprzęt wyłączony
6Awaria sprzętu
7Nośnik rozłączony
8Uwierzytelnianie
9Uwierzytelnianie powiodło się
10Uwierzytelnianie nie powiodło się
11Nieprawidłowy adres
12Wymagane poświadczenia

W naszej instrukcji Select Case sprawdzamy wartość NetConnectionStatus, po czym przypisujemy odpowiedni stan do zmiennej strStatus. Na przykład, jeżeli NetConnectionStatus jest równy 0, to uruchamiamy poniższy wiersz kodu:

Case 0 strStatus = "Disconnected"

Następnie, używając wartości przypisanej do zmiennej strStatus, a nie wartości właściwości NetConnectionStatus, wywołujemy echo statusu połączenia:

Wscript.Echo "Net Connection Status: " & strStatus

Powinniśmy otrzymać nastepujący raport:

Net Connection status: Authentication succeeded

Teraz obiecany skrypt, ten, który zwraca informację o połączeniu sieciowym wszystkich kart sieci bezprzewodowej w komputerze, bez względu na ich nazwę. Voila:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\wmi")



Set colItems = objWMIService.ExecQuery("Select * From MSNdis_80211_Configuration")



For Each objItem in colItems



    strName = objItem.InstanceName



    Set objWMIService2 = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



    Set colAdapters = objWMIService2.ExecQuery _

        ("Select * from Win32_NetworkAdapter Where Name = '" & strName & "'")

    

    For Each objAdapter in colAdapters

        Select Case objAdapter.NetConnectionStatus

            Case 0 strStatus = "Disconnected"

            Case 1 strStatus = "Connecting" 

            Case 2 strStatus = "Connected" 

            Case 3 strStatus = "Disconnecting" 

            Case 4 strStatus = "Hardware not present" 

            Case 5 strStatus = "Hardware disabled" 

            Case 6 strStatus = "Hardware malfunction" 

            Case 7 strStatus = "Media disconnected" 

            Case 8 strStatus = "Authenticating" 

            Case 9 strStatus = "Authentication succeeded" 

            Case 10 strStatus = "Authentication failed" 

            Case 11 strStatus = "Invalid address" 

            Case 12 strStatus = "Credentials required"

        End Select 



        Wscript.Echo strName

        Wscript.Echo "Net Connection Status: " & strStatus

        Wscript.Echo

    Next

Next

Nie będziemy go omawiać szczegółowo w tym momencie. Tylko to, co najważniejsze:

Używając poniższego wiersza kodu łączymy się z obszarem nazw root\wmi:

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\wmi")

Następnie wybieramy wszystkie wystąpienia klasy MSNdis_80211_Configuration, da nam to informację zwrotną na temat wszystkich kart bezprzewodowych zainstalowanych na danym komputerze (łącznie z wirtualnymi):

Set colItems = objWMIService.ExecQuery("Select * From MSNdis_80211_Configuration")

Dla każdej karty bezprzewodowej pobieramy wartość właściwości InstanceName, przechowujemy ją w zmiennej strName, po czym pobieramy informacje na temat rzeczywistych kart sieciowych o danej nazwie:

Set objWMIService2 = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colAdapters = objWMIService2.ExecQuery _

    ("Select * from Win32_NetworkAdapter Where Name = '" & strName & "'")

Teraz zostawiam już Was samych ze skryptem. Uruchomcie go i zobaczcie, co się stanie. Ja juz muszę lecieć, bo zniecierpliwiona skrypciarska żona już czeka w gondoli i w oczach ma coś raczej zbliżonego do laserów niż uśmiechu. Czas więc uciekać... Do usłyszenia z siedziby firmy Microsoft!

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne