Centrum skryptów - Systemy operacyjne

Jak pozyskać informacje o kartach sieciowych zainstalowanych na komputerze?

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 pozyskać informacje o kartach sieciowych zainstalowanych na komputerze?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Gdy korzystam z kwerendy WMI do pobrania listy kart sieciowych na moim laptopie, lista wynikowa obejmuje 32 karty sieciowe. 32! Nie kłamię. Mój laptop nie ma nawet 32 slotów, więc jak może mieć 32 karty sieciowe? W jaki sposób mogę uzyskać informacje o "prawdziwych" kartach sieciowych zainstalowanych na moim laptopie? Wnioskuję, że powinienem mieć tylko dwie karty sieciowe: przewodową i bezprzewodową. Jednak dostaję mnóstwo bzdurnych informacji. Pomocy!

- LB

Cześć Skrypciarze! Pytanie

Cześć, LB,

A zatem potrzebujesz pomocy w poszukiwaniu karty NIC. A próbowałeś już po zmroku? Wtedy najłatwiej jest znaleźć kartę sieciową… (stary żart). Jeśli już mowa o przeszłości, kiedyś aby określić prawdziwą kartę sieciową, wystarczyło znaleźć tę powiązaną z protokołem TCP/IP. Filtrowaliśmy właściwość IPEnabled w klasie WMI Win32_NetworkAdapterConfiguration i uzyskiwaliśmy następujący kod:

PS

        C:\> Get-WmiObject -Class Win32_NetworkAdapterConfiguration `

        -filter "IPEnabled = $true"

Problemy związane z zastosowaniem tej metody w obecnych czasach wynikają z faktu, iż niektóre z pseudo-adapterów, na które się uskarżasz, są również IPEnabled. Powyższe polecenie wyeliminowałoby wiele z nich, ale niekoniecznie wszystkie.

Lepsze rozwiązanie polega na zbadaniu klasy Win32_NetworkAdapter i przeszukaniu właściwości NetConnectionStatus. Przy pomocy tej techniki uzyskujemy tylko te urządzenia adapterów sieciowych, które są naprawdę podłączone do sieci. Wprawdzie niektórym pseudo-adapterom i tak udaje się prześlizgnąć, jednak zdarza się to dużo rzadziej. W tym przykładzie wykorzystamy cmdlet PowerShell Get-WmiObject do uzyskania wszystkich instancji klasy Win32_NetworkAdapter na komputerze. Następnie stworzymy tabelę, która posłuży nam do wyświetlenia danych przechowywanych we właściwości NetConnectionStatus:

PS

        C:\> Get-WmiObject -Class Win32_NetworkAdapter |

        Format-Table

        -Property Name, NetConnectionStatus -AutoSize

Owoc naszej pracy jest dość imponujący. Otrzymujemy atrakcyjną tabelę, która prezentuje listę wszystkich fałszywych i prawdziwych kart sieciowych na naszym laptopie, a także stan połączenia każdego z nich. Oto lista z mojego laptopa:

Wartość NetConnectionStatus
WAN Miniport (L2TP) Stan niezaraportowany
WAN Miniport (PPTP) Stan niezaraportowany
WAN Miniport (PPPOE) Stan niezaraportowany
WAN Miniport (IPv6) Stan niezaraportowany
Intel(R) PRO/1000 PL Network Connection 2
Intel(R) PRO/Wireless 3945ABG Network Connection 0
WAN Miniport (IP) Stan niezaraportowany
Microsoft 6to4 Adapter Stan niezaraportowany
Bluetooth Personal Area Network Stan niezaraportowany
RAS Async Adapter Stan niezaraportowany
isatap.{51AAF9FF-857A-4460-9F17-92F7626DC420} Stan niezaraportowany
Virtual Machine Network Services Driver Stan niezaraportowany
Microsoft ISATAP Adapter Stan niezaraportowany
Bluetooth Device (Personal Area Network) 7
6TO4 Adapter Stan niezaraportowany
Microsoft 6to4 Adapter Stan niezaraportowany
Microsoft Windows Mobile Remote Adapter Stan niezaraportowany
isatap.launchmodem.com Stan niezaraportowany
isatap.{647A0048-DF48-4E4D-B07B-2AE0995B269F} Stan niezaraportowany
Microsoft Windows Mobile Remote Adapter Stan niezaraportowany
WAN Miniport (SSTP) Stan niezaraportowany
WAN Miniport (Network Monitor) Stan niezaraportowany
6TO4 Adapter Stan niezaraportowany
6TO4 Adapter Stan niezaraportowany
Microsoft 6to4 Adapter Stan niezaraportowany
Microsoft Windows Mobile Remote Adapter Stan niezaraportowany
isatap.{C210F3A1-6EAC-4308-9311-69EADBA00A04} Stan niezaraportowany
isatap.launchmodem.com Stan niezaraportowany
Virtual Machine Network Services Driver Stan niezaraportowany
Virtual Machine Network Services Driver Stan niezaraportowany
Teredo Tunneling Pseudo-Interface Stan niezaraportowany
isatap.{647A0048-DF48-4E4D-B07B-2AE0995B269F} Stan niezaraportowany

Jednak łatwo zauważyć dwie słabe strony tego rozwiązania. Po pierwsze większość kart sieciowych w ogóle nie raportuje swojego stanu. Po drugie adaptery raportujące swój stan wykorzystują do tego celu jakiś tajemniczy kod. W konsekwencji powyższa tabela jest mało przydatna! Choć wygląda całkiem nieźle.

Jednak wystarczy włożyć trochę wysiłku, aby odnaleźć w dokumentacji Windows SDK klasę WMI Win32_NetworkAdapter oraz następujące informacje:

Wartość Znaczenie
0 Disconnected (Rozłączony)
1 Connecting (W trakcie łączenia)
2 Connected (Połączony)
3 Disconnecting (W trakcie rozłączania)
4 Hardware not present (Brak sprzętu)
5 Hardware disabled (Sprzęt wyłączony)
6 Hardware malfunction (Awaria sprzętu)
7 Media disconnected (Nośnik rozłączony)
8 Authenticating (Uwierzytelnianie)
9 Authentication succeeded (Uwierzytelnianie powiodło się)
10 Authentication failed (Uwierzytelnianie nie powiodło się)
11 Invalid address (Nieprawidłowy adres)
12 Credentials required (Wymagane poświadczenia)

W ten sposób zbliżamy się do osiągnięcia stanu sieciowej nirwany. Wartość 2 oznacza, że karta sieciowa jest połączona. Następujący kod wykorzystuje efekty dotychczasowej analizy:

Get-WmiObject

        -class win32_networkadapter -filter "NetConnectionStatus = 2" |

        format-list -Property [a-z]*

Jednak nasza euforia nie trwa długo, ponieważ wkrótce uświadamiamy sobie, że mimo iż wyświetliliśmy informacje o połączonych kartach sieciowych, nie posiadamy żadnych informacji konfiguracyjnych. A byliśmy już tak blisko! Przyjrzyjmy się wynikowi wykonania kwerendy:

Rysunek 1.

W związku z tym samo wykorzystanie właściwości NetConnectionStatus klasy Win32_Networkadapter nie wystarczy, musimy również pozyskać informacje konfiguracyjne TCP/IP z klasy WMI Win32_NetworkAdapterConfiguration. To brzmi jak zadanie dla klasy Association. W VBScript stosowanie klasy Association wiązało się z konstruowaniem skomplikowanych kwerend AssociatorsOf (więcej informacji na temat tej metody zawiera książka Microsoft Press Microsoft Windows Scripting with WMI: Self-Paced Learning Guide ).

Natomiast wykorzystując klasę Association w programie Windows PowerShell, uzyskujemy następujący skrypt:

Param($computer

      = "localhost")

      function

      funline ($strIN)

      {

      $num

      = $strIN.length

      for($i=1

      ; $i -le $num ; $i++)

      {

      $funline = $funline + "=" }

      Write-Host -ForegroundColor yellow $strIN

      Write-Host -ForegroundColor darkYellow $funline

      }

      #end funline

      Write-Host

      -ForegroundColor cyan "Network adapter settings on $computer"

      Get-WmiObject

      -Class win32_NetworkAdapterSetting `

      -computername

      $computer |

      Foreach-object

      `

      {

      If( ([wmi]$_.element).netconnectionstatus -eq 2)

      {

      funline("Adapter: $($_.setting)")

      [wmi]$_.setting

      [wmi]$_.element

      } #end if

      } #end

      foreach

Rozpoczynamy od zastosowania parametru wiersza polecenia, który umożliwia nam zdalne uruchamianie skryptu, gdy istnieje taka potrzeba. Do tego celu wykorzystujemy instrukcję Param. Dodatkowo tworzymy funkcję o nazwie funline, która służy do kolorystycznego wyróżnienia danych wynikowych kwerendy. To zwiększa przejrzystość danych wyjściowych, w szczególności gdy kwerenda zwraca dużo informacji:

Param($computer

      = "localhost")

      function

      funline ($strIN)

      {

      $num

      = $strIN.length

      for($i=1

      ; $i -le $num ; $i++)

      {

      $funline = $funline + "=" }

      Write-Host -ForegroundColor yellow $strIN

      Write-Host -ForegroundColor darkYellow $funline

      }

      #end funline

Wyświetlamy nazwę komputera przy pomocy cmdletu Write-Host w sposób zaprezentowany poniżej. Wykorzystujemy kolor cyjanowy, aby tekst korzystnie wyróżniał się na ekranie:

Write-Host

      -ForegroundColor cyan "Network adapter settings on $computer"

Następnie przechodzimy do konstruowania samej kwerendy WMI. Korzystamy z cmdletu Get-WmiObject, a także parametru -computername, który umożliwia nam uruchamianie skryptu na innych komputerach. Potok danych wyjściowych przesyłamy do cmdletu ForEach-Object:

Get-WmiObject

      -Class win32_NetworkAdapterSetting `

      -computername

      $computer |

      Foreach-object

A teraz najtrudniejsza część skryptu. Musimy znaleźć sposób, aby zajrzeć do właściwości netConnectionStatus klasy Win32_NetworkAdapter. Do odwołania się do tej klasy wykorzystamy zwróconą przez kwerendę Association referencję o nazwie element. Aby uzyskać dostęp do klasy Win32_NetworkAdapter, przekazujemy odpowiednią referencję do akceleratora typu [WMI]. Ponieważ referencja odwołuje się do wybranej instancji klasy WMI, a akcelerator typu [WMI] zapewnia dostęp do określonej instancji klasy, możemy pobrać wartość właściwości netConenctionStatus. W związku z tym tworzymy kod, który gdy wartość tej właściwości wynosi 2, wyświetla nazwę karty sieciowej, informacje konfiguracyjne przechowywane we właściwości setting oraz informacje o adapterze przechowywane we właściwości element. Omówiony fragment kodu został zaprezentowany poniżej:

{

      If(

      ([wmi]$_.element).netconnectionstatus -eq 2)

      {

      funline("Adapter: $($_.setting)")

      [wmi]$_.setting

      [wmi]$_.element

      } #end if

Wykonanie tego skryptu spowoduje wyświetlenie informacji dostarczanych przez klasy WMI Win32_NetworkAdapter oraz Win32_NetworkAdapterConfiguration. Wynika z nich, że posiadamy tylko jedną połączoną kartę sieciową. Zobaczcie sami:

Rysunek 2.

Mamy nadzieję, że ten skrypt pomoże Wam w wyszukiwaniu prawdziwych kart sieciowych zainstalowanych na komputerze. Ponadto zaprezentowana metoda może również posłużyć do analizowania szczegółowych informacji dostarczanych przez inne klasy Association. Niektóre z nich będziemy omawiać już wkrótce. LB, dzięki za pytanie i wyluzuj. Tak naprawdę nie masz 32 kart sieciowych na swoim komputerze.

Ed Wilson i Craig Liebendorfer, Skrypciarze

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne