Centrum skryptów - Systemy operacyjne

Jak zmienić dwa początkowe oktety w adresie IP?

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 zmienić dwa początkowe oktety w adresie IP?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak można zmienić początkowe 16 bitów w adresie IP? Pozostałe 16 powinno pozostać niezmienione.

-- LD

Cześć Skrypciarze! Odpowiedź

Cześć, LD. Zanim odpowiemy na to pytanie, jest pewna sprawa, która wymaga wyjaśnienia. W obliczu tego, że praktycznie w każdej sferze życia publicznego (i nie tylko) wybuchł już, lub w niedalekiej przyszłości wybuchnie, jakiś skandal, chcielibyśmy zapewnić wszystkich zainteresowanych, że jeżeli chodzi o Skrypciarzy, nie ma się czego obawiać.

Nie ma takiej siły i nie wydarzyło się jak dotąd nic, co kiedykolwiek mogłoby zakłócić pracę Skrypciarzy i skompromitować nasz zespół. Ktoś kiedyś starał się umieścić jakieś, podobno nasze, niedwuznaczne zdjęcia w Internecie, jednak z przyczyn oczywistych nikt nie dał się nabrać.

Skoro te wyjaśnienia mamy już za sobą, możemy się spokojnie skupić na skrypcie, który zmienia początkowe 16 bitów w adresie IP. Załóżmy, że dysponujemy kilkoma serwerami o adresach IP podobnych do tego:

10.10.1.2

Chcielibyśmy zmienić adresy IP zaczynające się od „10.10” na „192.168”. Innymi słowy, chcemy zamienić adres IP 10.10.1.2 na adres wyglądający następująco:

192.168.1.2

Jak widać, początkowe dwa oktety są zmienione, pozostałe pozostają takie same.

Czy można dokonać tej zmiany za pomocą skryptu? Oczywiście, że tak:

strComputer = "."



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



Set colNetAdapters = objWMIService.ExecQuery _

    ("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled=True")



arrSubnetMask = Array("255.255.255.0")



For Each objNetAdapter in colNetAdapters

    For Each strAddress in objNetAdapter.IPAddress

        arrOctets = Split(strAddress, ".")

        If arrOctets(0) = "10" and arrOctets(1) = "10" Then

            strNewAddress = "192.168." & arrOctets(2) & "." & arrOctets(3)            

            arrIPAddress = Array(strNewAddress)

            errEnable = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)

        End If

    Next

Next

Zobaczmy teraz, jak to działa. Zaczynamy od podłączenia się do usługi WMI. W tym skrypcie, podłączamy się to tej usługi na lokalnym komputerze, jednak możliwe jest także uruchomienie tego skryptu na zdalnym komputerze – trzeba w tym celu przypisać nazwę zdalnego komputera zmiennej strComputer. A czy możliwe jest także uruchomienie tego skryptu na kilku komputerach? Owszem. Służą do tego szablony Multiple/Remote Computer Scripting Templates (j. ang.).

Podłączywszy się już do usługi WMI, znajdujemy kolekcję wszystkich kart sieciowych zainstalowanych na komputerze. Do tego służy poniższy fragment kodu:

Set colNetAdapters = objWMIService.ExecQuery _

    ("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled=True")

Jak widać, nasze zapytanie zawiera tekst: Where IPEnabled = True. W jakim celu uwzględniliśmy ten tekst? No cóż, system operacyjny Windows zawiera różnego rodzaju „wirtualne” karty sieciowe, elementy, które mogą zostać wykryte przez klasę Win32_NetworkAdapterConfiguration. Nie są to prawdziwe karty sieciowe, przynajmniej nie w takim sensie, że są związane z jakąś rzeczywistą kartą sieciową i posiadają przypisany adres IP. Jeżeli używamy skryptu, który stosuje klasę Win32_NetworkAdapterConfiguration, to prawdopodobnie otrzymamy 10 lub więcej elementów, pomimo, że nasz komputer ma zainstalowaną tylko jedną rzeczywistą kartę sieciową. To właśnie karty wirtualne. Ograniczając otrzymane dane do kart sieciowych, których właściwość IPEnabled ma wartość True, eliminujemy wszystko poza „rzeczywistymi” kartami sieciowymi.

Po wysłaniu zapytania i otrzymaniu kolekcji wszystkich kart sieciowych zainstalowanych na komputerze, robimy mały objazd stosując poniższy wiersz kodu w celu utworzenia tablicy o nazwie arrSubnetMask:

arrSubnetMask = Array("255.255.255.0")

Dlaczego? Ponieważ przypisując nowy, statyczny adres IP do komputera, musimy przekazać dwa parametry: nowy adres IP oraz nową maskę podsieci. Obie te wartości muszą zostać przekazane w formie tablic, nawet jeżeli mamy tylko jeden taki adres lub maskę.

A skoro mowa o przypisywaniu adresów IP – robimy, co następuje: Najpierw uruchamiamy pętlę For Each, która przejdzie przez całą kolekcję kart sieciowych. Wewnątrz tej pętli uruchamiamy drugą pętlę For Each, która z kolei przejdzie przez wszystkie adresy IP przypisane do każdej karty sieciowej:

For Each strAddress in objNetAdapter.IPAddress

Wewnątrz tej drugiej pętli, używamy funkcji Split i zamieniamy każdy adres IP na tablicę:

arrOctets = Split(strAddress, ".")

Rozdzielamy go używając kropki jako delimitera i otrzymujemy tablicę (o nazwie arrOctets) składającą się z czterech oddzielnych elementów, z których każdy odpowiada oktetowi w adresie IP. I tak, wychodząc od adresu IP 10.10.1.2, otrzymujemy następujące elementy w naszej tablicy:

  • 10
  • 10
  • 1
  • 2

W tym momencie łatwo jest sprawdzić, czy mamy do czynienia z adresem „10.10”, wystarczy tylko sprawdzić, czy pierwszy element w tablicy (element 0) oraz drugi element w tablicy (element 1) mają wartość 10:

If arrOctets(0) = "10" and arrOctets(1) = "10" Then
Uwaga. W zależności od ustawień naszego komputera, być może wcale nie ma potrzeby stosowania tego kroku. Dodaliśmy go tylko po to, żeby nie zmieniać automatycznie każdego adresu IP przypisanego karcie sieciowej, a jedynie adresy rozpoczynające się od 10.10. Jeżeli chcemy zmienić każdy adres, włączając adresy, które nie znajdują się w podsieci 10.10, możemy pominąć ciąg If-Then.

Co się dzieje, jeżeli znajdziemy adresy rozpoczynające się od 10.10? Stosujemy poniższy wiersz kodu w celu utworzenia nowych adresów IP:

strNewAddress = "192.168." & arrOctets(2) & "." & arrOctets(3)

Widzimy, co się dzieje? Bierzemy ciąg 192.168. i dołączamy: 1) trzeci element z naszej tablicy (1); 2) kropkę; 3) czwarty element z naszej tablicy (2). Dzięki temu otrzymamy wartość strNewAddress równą 192.168.1.2 i będącą nowym adresem IP, który chcemy przypisać do tej karty sieciowej.

Żeby tego dokonać, dodajemy ten nowy adres do tablicy o nazwie arrIPAddress, następnie wywołujemy metodę EnableStatic, za pomocą której przypiszemy nowy adres i maskę podsieci do karty sieciowej:

arrIPAddress = Array(strNewAddress)

errEnable = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)

I to wszystko, co musimy zrobić. Teraz puszczamy pętlę i powtarzamy cały proces dla następnego adresu IP karty (zakładając, że istnieje taki adres). Kiedy już skończymy, uruchamiamy pętlę i powtarzamy te same czynności dla następnej karty z kolekcji.

Zauważmy, że tutaj omówiliśmy jedynie, jak przypisać nowy adres IP (lub, jak niekiedy bywa, adresy IP) do komputera. Podczas zamieniania adresów IP konieczne mogą być jeszcze inne kroki, np. zmiana serwera DNS. Nie będziemy ich tutaj omawiać, jednak praktycznie wszystkie informacje dotyczące kart sieciowych znajdują się w mistrzowskim artykule naszego kolegi Automating TCP/IP Networking on Clients (j. ang.).

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne