Centrum skryptów - Systemy operacyjne

Jak włączyć lub wyłączyć kartę sieciową?

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 włączyć lub wyłączyć kartę sieciową?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! W pracy uzyskuję dostęp do korporacyjnej sieci przy pomocy połączenia sieciowego Ethernet, natomiast w domu korzystam z połączenia bezprzewodowego. Ponieważ nasi administratorzy zabezpieczeń nie zezwalają na posiadanie wielu aktywnych połączeń sieciowych jednocześnie, stale muszę włączać połączenie bezprzewodowe po powrocie do domu i wyłączać je przed rozpoczęciem pracy w biurze. W systemie Windows Vista wymaga to wykonania dwunastu kliknięć. Czy da się stworzyć skrypt, który realizowałby to zadanie?

-TB

Cześć Skrypciarze! Pytanie

Cześć, TB,

Wygląda na to, że administratorzy zabezpieczeń w Twojej firmie znają się na rzeczy. Niezabezpieczony dostęp sieciowy stanowi jedną z głównych dróg przedostawania się złośliwego oprogramowania do sieci. Administratorzy zabezpieczeń zaniedbywaliby swoje obowiązki, gdyby zezwalali na tworzenie pomostu pomiędzy lokalną siecią przewodową a jakimś niezabezpieczonym punktem dostępu bezprzewodowego, który pojawia się w pobliskiej kawiarni. To tak jakby kupić rewelacyjny zamek do drzwi wejściowych i zostawić otwarte okno. Skarżyłeś się na około 12 kliknięć potrzebnych do włączenia lub wyłączenia karty sieciowej (nie liczyłem, więc muszę uwierzyć Ci na słowo). Na szczęście zaletą wykorzystania systemu Windows Vista jest zaktualizowana klasa WMI Win32_NetworkAdapter.

W systemie Windows Vista dostępna jest metoda służąca do włączania i wyłączania karty sieciowej. Aby wykorzystać ją w skrypcie, wystarczy wybrać określoną kartę sieciową, a następnie wywołać odpowiednią metodę. Zadania te realizuje poniższy skrypt:

Param(

$wireless,

$wired,

[switch]$help

)

Function GetHelp()

{

$helpText= `

@"

DESCRIPTION:

NAME: EnableDisableNetworkAdapters.ps1

Enables or Disables Network Adapters on a local machine.



PARAMETERS:

-wireless <enable, disable="", query="">

-wired <enable, disable="", query="">

    -Help displays this help topic

    SYNTAX:

    EnableDisableNetworkAdapters.ps1 -wired query

    Reports basic information about the wired network adapter

    EnableDisableNetworkAdapters.ps1 -wired query -wireless query

    Reports basic information about both the wired and wireless network adapters

    EnableDisableNetworkAdapters.ps1 -wired disable

    Disables the wired network adapter (Requires Admin rights)

    EnableDisableNetworkAdapters.ps1 -wired disable -wireless enable

    Disables the wired network adapter and enables the wireless network adapter (Requires Admin rights)

    EnableDisableNetworkAdapters.ps1 -help

    Prints the help topic for the script

    "@ #end helpText

    $helpText

    } #end GetHelp

    Function GetWireless()

    {

    $filter = "Name LIKE '%Wireless%'"

    NetworkAdapterFactory($wireless)

    }#end GetWireless

    Function GetWired()

    {

    $filter = "Name LIKE '%GigaBit%'"

    NetworkAdapterFactory($wired)

    } #end GetWired

    Function NetworkAdapterFactory($adapter)

    {

    $wmi = Get-WmiObject -Class Win32_NetworkAdapter `

    -filter $filter

    switch ($adapter)

    {

    "query" { $wmi }

    "enable" { $wmi.enable() }

    "disable" { $wmi.disable() }

    DEFAULT {

    Write-Host -foregroundcolor red "unrecognized parameter."

    GetHelp

    Exit

    }

    } #end switch

    } #end NetWorkAdapterFactory

    # --- POCZĄTEK ---

    If($help) { GetHelp ; exit }

    if($wireless) { GetWireless }

    if($wired) { GetWired }

    If(!$wireless -or !$wired) { GetHelp ; exit }

Rozpoczynamy od wykorzystania instrukcji param, dzięki której skrypt będzie akceptował parametry wiersza polecenia. Tworzymy trzy parametry: $wireless, $wired oraz $help Parametr $help stanowi przełącznik, który będzie wpływać na skrypt tylko wtedy, gdy zostanie dostarczony w wierszu polecenia. Pozostałe parametry pozwalają na wykorzystanie bezprzewodowej lub przewodowej karty sieciowej. Ta sekcja kodu została zaprezentowana poniżej:

Param(

    $wireless,

    $wired,

    [switch]$help

    )

Kolejnym zadaniem jest stworzenie funkcji, która wyświetli pomoc dla skryptu. Funkcja ta wykorzystuje ciąg here, który w tym skrypcie służy do wyświetlania tekstu. Aby stworzyć ciąg here, należy rozpocząć linię znakiem @, po którym następuje znak cudzysłowu. Ciąg here zostaje zakończony tymi samymi znakami wpisanymi w odwrotnej kolejności. Do przypisania ciągu here do zmiennej wykorzystujemy składnię:

$hereString = @"

This is a string

"@

Styl funkcji GetHelp jest zgodny ze stylem pomocy wyświetlanej przez cmdlet GetHelp Informacje Helptext są podzielone na trzy części: Description, Parameters oraz Syntax Funkcja GetHelp została zaprezentowana poniżej:

Function GetHelp()

{

  $helpText= `

@"

 DESCRIPTION:

 NAME: EnableDisableNetworkAdapters.ps1

 Enables or Disables Network Adapters on a local machine. 



 PARAMETERS: 

 -wireless <enable, disable, query>

 -wired <enable, disable, query>

 -Help displays this help topic



 SYNTAX:

 EnableDisableNetworkAdapters.ps1 -wired query

 Reports basic information about the wired network adapter



 EnableDisableNetworkAdapters.ps1 -wired query -wireless query

 Reports basic information about both the wired and wireless network adapters



 EnableDisableNetworkAdapters.ps1 -wired disable

 Disables the wired network adapter (Requires Admin rights)



 EnableDisableNetworkAdapters.ps1 -wired disable -wireless enable

 Disables the wired network adapter and enables the wireless network adapter (Requires Admin rights)



 EnableDisableNetworkAdapters.ps1 -help



 Prints the help topic for the script

"@ #end helpText

  $helpText

} #end GetHelp

Gdy skrypt wyświetla informacje ze zmiennej Helptext, prezentuje je w czytelny, uporządkowany sposób. Wynik wykonania funkcji GetHelp został pokazany poniżej:

Rysunek 1

Kolejnym zadaniem realizowanym w ramach tego skryptu jest stworzenie dwóch, podobnych do siebie funkcji. O wywołaniu tych funkcji decydują parametry wiersza polecenia. Gdy określimy, że chcemy pracować z kartą bezprzewodową (podając parametr –wireless), wywołana zostanie funkcja GetWireless Stworzony zostanie filtr dla kwerendy WMI i wykonana zostanie funkcja NetworkAdapterFactory, do której przekazana zostanie wartość znajdująca się w parametrze wiersza polecenia $wireless. Funkcja GetWired realizuje dokładnie to samo zadanie dla karty sieci przewodowej. Zostanie ona wywołana, gdy w wierszu polecenia wprowadzimy parametr -wired. Warto zauważyć, że projekt skryptu uwzględnia również możliwość podania w tym samym wierszu polecenia obu parametrów -wired oraz -wireless W ten sposób możemy przy pomocy tego samego polecenia włączyć jedno połączenie sieciowe i wyłączyć drugie. Wspomniane dwie funkcje zostały zaprezentowane poniżej:

Function GetWireless()

{

 $filter = "Name LIKE '%Wireless%'"

 NetworkAdapterFactory($wireless)

}#end GetWireless



Function GetWired()

{

 $filter = "Name LIKE '%GigaBit%'"

 NetworkAdapterFactory($wired)

} #end GetWired

Główna funkcja skryptu nosi nazwę NetworkAdapterFactory. Funkcja ta akceptuje filtr, który został stworzony w funkcji GetWired lub GetWireless. Gdy cmdlet Get-WmiObject zwróci odpowiednią instancję klasy Win32_NetworkAdapter, umieszczamy wynikowy obiekt zarządzania w zmiennej $wmi. Następnie określamy akcję, która ma zostać podjęta w zależności od przekazanych parametrów wiersza polecenia. Gdy chcemy pozyskać szczegółowe informacje o karcie sieciowej, instrukcja switch wyświetla informacje znajdujące się w zmiennej $wmi. Gdy chcemy włączyć kartę sieciową, wywołujemy metodę enable. Gdy podczas wykonania skryptu określona została wartość disable, wywołujemy metodę disable. Jeśli żadna z opcji instrukcji switch nie odpowiada wartości zmiennej, wywołujemy funkcję GetHelp i wychodzimy ze skryptu. Omówiona część skryptu została zademonstrowana poniżej:

Function NetworkAdapterFactory($adapter)

{

 $wmi = Get-WmiObject -Class Win32_NetworkAdapter `

 -filter $filter

 switch ($adapter)

 {

  "query" { $wmi }

  "enable" { $wmi.enable() }

  "disable" { $wmi.disable() }

  DEFAULT { 

           Write-Host -foregroundcolor red "unrecognized parameter." 

           GetHelp 

           Exit 

          }

 } #end switch

} #end NetWorkAdapterFactory

Efekt włączenia lub wyłączenia karty sieciowej jest prezentowany przy użyciu domyślnego widoku. Można przechwycić dane wynikowe i udoskonalić sposób ich wyświetlania, co prawdopodobnie będzie wymagało zastosowania dodatkowych funkcji. Warto przynajmniej rozważyć przefiltrowanie właściwości systemowych. Oto wynik wykonania skryptu:

Rysunek 1

Główna część skryptu odpowiada za analizę parametrów wiersza polecenia. Jeśli istnieje zmienna $help, oznacza to, że skrypt został uruchomiony z wykorzystaniem przełącznika -help. W związku z tym wywołujemy funkcję GetHelp i wychodzimy ze skryptu. Jeśli istnieje zmienna $wireless, skrypt został uruchomiony z parametrem -wireless, a zatem wywołujemy funkcję getWireless, aby stworzyć odpowiedni filtr WMI, a następnie przekazujemy wartość do funkcji NetworkAdapterFactory. Podobną procedurę realizujemy w przypadku obecności zmiennej $wired. Ten kod decyduje o sposobie wykonania skryptu. Na zakończenie sprawdzamy, czy określone zostały parametry $wireless lub $wired Jeśli nie zostały one dostarczone, wywołujemy funkcję GetHelp (pomimo iż nie podano parametru –help). Dzięki temu skrypt wyświetli pomoc, nawet gdy zostanie uruchomiony bez parametrów wiersza polecenia:

If($help) { GetHelp ; exit }

if($wireless) { GetWireless }

if($wired) { GetWired }

If(!$wireless -or !$wired) { GetHelp ; exit }

TB, to było świetne pytanie. Skrypt ten można na wiele sposobów udoskonalać tak, aby ułatwić jego stosowanie lub interpretowanie prezentowanych wyników. Mamy nadzieję, że prawidłowo zastosowana automatyzacja wyzwoli w Tobie bardziej pozytywne nastawienie do administratorów zabezpieczeń.

Ed Wilson i Craig Liebendorfer, Skrypciarze

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne