background image

 Rozdział 5 

Zaawansowane konfigurowanie TCP/IP 
przy pomocy Rejestru i języka Perl 

Większość codziennych zadań administracyjnych w Windows NT wyko-
nuje się za pomocą narzędzi systemowych umieszczonych w grupie 
Administrative

  Tools oraz narzędzia  Network w Control  Panel. Zmiany do-

konywane przez te narzędzia są zapisywane w Rejestrze, będącym we-
wnętrzną bazą danych zawierającą informacje o konfiguracji systemu. 

Zdarzają się jednak sytuacje, w których przydatne jest dokonanie zmiany 
w konfiguracji lub usunięcie usterki poprzez bezpośrednią edycję Reje-
stru. Można to zrobić przy pomocy edytora Rejestru lub języka progra-
mowania, jak np. C/C++, Perl lub Basic. Bezpośrednia edycja Rejestru ma 
sens wtedy, jeśli chcemy zmienić konfigurację pojedynczych kompute-
rów; jeśli zamierzamy dokonać takich samych zmian w przypadku więk-
szej ilości komputerów, wówczas wygodniej jest napisać specjalny pro-
gram. W wielu systemach używa się w tym celu języka Perl - chociaż 
trudniejszy do opanowania od języka Basic, jest za to dużo elastyczniej-
szy i ma więcej możliwości. Niniejszy rozdział opisuje sposób edytowa-
nia Rejestru przy pomocy języka Perl. 

Architektura i rozmieszczenie informacji w Rejestrze 

Rejestr jest wewnętrzną bazą danych, używaną w systemach Windows 9x 
i Windows NT do przechowywania informacji o konfiguracji systemu. 
W jej skład wchodzą również parametry dotyczące TCP/IP i innych pro-
tokołów. Rejestru używa się do następujących celów: 

„

Przechowywanie informacji wykorzystywanych przy starcie systemu 

„

Przechowywanie danych dotyczących ogólnej konfiguracji systemu 

„

Zarządzanie parametrami konfiguracyjnym sterowników urządzeń 

„

Przechowywanie danych konfiguracyjnych zainstalowanych aplikacji 
i narzędzi systemowych 

background image

 

 

Rozdział 5 

136 

„

Wspomaganie administratora systemu podczas dokonywania zmian 
w konfiguracji systemu Windows NT. 

Rejestr jest zorganizowany w drzewiastą strukturę, przypominającą kata-
logi i pliki w systemie plików. Węzły tego drzewa noszą nazwę kluczy, 
a jego  liście nazwę wpisów. Klucz może zawierać podklucze, podobnie 
jak katalog może zawierać podkatalogi. Klucze i podklucze służą głównie 
do grupowania informacji w kategorie. Rysunek 5.1 przedstawia struktu-
rę Rejestru tak, jak pokazuje ją edytor rejestru (Regedt32.exe w Windows 
NT i Regedit.exe w Windows 9x). Programu Regedit.exe można używać 
także w Windows NT - pozwala to na przeglądanie Rejestru w stylu zna-
nym z Eksploratora Windows. 

Rejestr składa się z kilku hierarchicznych poddrzew, opisujących właści-
wości lokalnego komputera. Zawierają one informacje o komputerze 
i zdefiniowanych kontach użytkowników. W Rejestrze znajdują się na-
stępujące poddrzewa (patrz rysunek 5.2): 

„HKEY_LOCAL_MACHINE. Określa konfigurację komputera w momencie 

startu systemu.

 

„HKEY_CLASSES_ROOT

. Używane jest głównie do zapewnienia kom-

patybilności z poprzednimi wersjami Windows. Obsługuje powiąza-
nia aplikacji z typami plików. W rzeczywistości jest to symboliczne łą-
cze (wskaźnik) do podklucza: 

HKEY_LOCAL_MACHINE\Software\ Classes

Rysunek 5.1 

Struktura Rejestru. 

 

background image

Zaawansowane konfigurowanie TCP/IP przy pomocy Rejestru i języka Perl 

137 

„HKEY_CURRENT_USER

. Zawiera profil zalogowanego obecnie użyt-

kownika. 

„HKEY_USERS

. Teoretycznie powinno zawierać szczegóły dotyczące 

zalogowanych do systemu użytkowników. W rzeczywistości zawiera 
tylko dwa profile: użytkownika domyślnego i użytkownika zalogo-
wanego lokalnie. 

„HKEY_CURRENT_CONFIG

. Używane do przechowywania profili 

konfiguracji sprzętu. Profile można wybierać w momencie startu sys-
temu. 

Nazwy głównych kluczy Rejestru zaczynają się od HKEY, aby zaznaczyć, 
że są to klucze-uchwyty (handle key), których można używać w progra-
mach jako identyfikatorów poddrzew. Wszystkie poprzednio wymienio-
ne nazwy poddrzew zaczynają się od tego przedrostka. 

Wpisy Rejestru składają się z nazwy wpisu, typu wpisu oraz wartości. 
Każdy wpis w Rejestrze posiada jeden z typów opisanych w tabeli 5.1. 
Nazwy typów zaczynają się od przedrostka REG_, natomiast przyrostek 
_SZ

 oznacza łańcuch znaków zakończony zerem. Rozmiar wpisu jest 

ograniczony do 1 MB, co jest wystarczające dla większości aplikacji - jeśli 
aplikacja potrzebuje większych rozmiarów wpisu, może rozbić dane na 
kilka fragmentów. Wartości od 0 do 7FFFFFFF (szesnastkowo) są zare-
zerwowane do użycia przez  system. Wartości od 80000000 do FFFFFFFF 
(szesnastkowo) są zarezerwowane do użycia przez aplikacje. 

Rysunek 5.2 

Poddrzewa 
w Rejestrze Win-
dows NT 

 

background image

 

 

Rozdział 5 

138 

Tabela 5.1 Typy danych używane przez wpisy w Rejestrze 

Typ danych 

Opis 

REG_SZ 

Jest to wartość tekstowa, będąca sekwencją znaków. 
Przykładem wpisu tego typu może być nazwa komputera: 
ComputerName : REG_SZ : NTUS. Administrator systemu 
może w prosty sposób zmieniać tego typu wpisy. 

REG_DWORD 

Jest to wartość numeryczna o długości czterech bajtów 
(podwójne słowo). Parametry urządzeń, usług oraz liczbowe 
wartości konfiguracyjne są wyrażone przy pomocy tego typu 
danych. Edytor Rejestru może wyświetlać takie wartości 
w formacie dziesiętnym, szesnastkowym lub dwójkowym. 
Przykładem wpisu tego typu może być adres pamięci dla 
karty sieciowej: MemoryAddress : REG_DWORD : 
0xd0000. Przedrostek 0x oznacza, że wartość podana jest 
szesnastkowo. Jest to najpopularniejszy sposób 
wyświetlania wartości typu REG_DWORD. 

REG_MULTI_SZ 

Jest to typ danych zawierający wiele wartości tekstowych 
w postaci czytelnej dla użytkownika. Kolejne wartości 
tekstowe są rozdzielone znakiem pustym (ASCII 0); jest to 
konwencja używana w języku C. Przykładem może być tu 
wpis opisujący zależności dla systemu plików CD-ROM: 
DependOnGroup: REG_MULTI_SZ: SCSI CDROM Class. 

REG_EXPAND_SZ Jest 

to 

łańcuch znaków zawierający zmienną, która jest 

zamieniana na rzeczywistą wartość podczas dostępu 
aplikacji do danego wpisu. Wpisem typu 
REG_EXPAND_SZ będzie np. każdy wpis zawierający 
zmienną systemową %SystemRoot%. Zmienna ta określa 
katalog, w którym zainstalowano system Windows NT. 
Kiedy aplikacja pobiera wpis zawierający zmienną 
%SystemRoot%, wówczas zmienna jest zastępowana 
rzeczywistą nazwą katalogu systemowego. Przykładem tego 
typu danych może być ścieżka do sterownika karty 
sieciowej, w której zawarto odniesienie do %SystemRoot%: 
ImagePath: REG_EXPAND_SZ: 
%SystemRoot%\System32\drivers\ CENDIS3.sys 

REG_BINARY Są to dane w formacie binarnym; w ten sposób 

przechowywana jest informacja o konfiguracji sprzętu. 
Edytor Rejestru może wyświetlać wpisy tego typu również 
w formacie szesnastkowym. Edycja wpisów typu 
REG_BINARY jest ryzykowna, jeśli nie posiadamy 
dokumentacji opisującej znaczenie poszczególnych bitów. 
Aby przejrzeć informacje o konfiguracji sprzętu 
przechowywane w formacie binarnym, można skorzystać 
z programu Windows NT Diagnostic (WINMSD.EXE). 
Przykładem tego typu danych może być informacja 
o składnikach urządzenia peryferyjnego: Component 
Information: REG_BINARY: 64 00 00 00 ... 

REG_FULL_RESOURCE

Tego typu używa się do przechowywania danych 

background image

Zaawansowane konfigurowanie TCP/IP przy pomocy Rejestru i języka Perl 

139 

Typ danych 

Opis 

_DESCRIPTOR konfiguracyjnych 

urządzeń sprzętowych. Reprezentuje on 

rekord danych, w którym nazwy pól opisują poszczególne 
składniki tego rekordu. Przykładem mogą być dane 
konfiguracyjne kontrolera dysku twardego: Configuration 
Data: REG_FULL_RESOURCE_DESCRIPTOR:  … 

REG_NONE Używany do oznaczenia niezdefiniowanego typu danych. 
REG_LINK 

Jest to symboliczne łącze Unicode. 

REG_RESOURCE_LIST Używany do przechowywania informacji o sterownikach 

urządzeń Windows NT. 

REG_DWORD_LITTLE_ 
ENDIAN 

Taki sam jak REG_DWORD, ale najbardziej znaczący bajt 
jest umieszczony w wyższym adresie pamięci. 

REG_DWORD_BIG_ 
ENDIAN 

Taki sam jak REG_DWORD, ale najbardziej znaczący bajt 
jest umieszczony w niższym adresie pamięci. 

Parametry protokołu TCP/IP umieszczone są w poddrzewie HKEY_ 
LOCAL_MACHINE

, ich zmiana powoduje więc zmianę wartości wpisów 

tego poddrzewa. Ponieważ HKEY_LOCAL_MACHINE jest najważniej-
szym kluczem Rejestru, jeśli chodzi o konfigurację TCP/IP, w następnym 
podrozdziale omówimy jego strukturę i organizację. 

Poddrzewo HKEY_LOCAL_MACHINE 

HKEY_LOCAL_MACHINE 

zawiera informacje o 

zainstalowanym 

w komputerze sprzęcie i oprogramowaniu, bazę danych o kontach użyt-
kowników oraz informacje o konfiguracji systemu. Przykładami mogą tu 
być informacje o typie magistrali, kartach rozszerzeń, pamięci, sterowni-
kach urządzeń i kolejności ich ładowania, ładowanych usługach, danych 
używanych przez aplikacje itp. Informacje zawarte w HKEY_LOCAL_ 
MACHINE

 pozostają takie same, niezależnie od aktualnie zalogowanego 

użytkownika. 

Przechowuje się tu większość informacji o 

systemie. Drzewo 

HKEY_LOCAL_MACHINE

 posiada pięć podkluczy, opisanych w tabeli 

5.2:  HARDWARE,  SAM  (Security Accounts Manager),  SECURITY, 
SOFTWARE

 i SYSTEM. Podklucze SECURITY,  SOFTWARE,  SYSTEM 

i SAM nazywane są gałęziami i posiadają odpowiadające im pliki 
w katalogu  %Katalog Systemowy%\System32\Config. Tabela 5.3 przedsta-
wia standardowe pliki gałęzi w systemie Windows NT. 

background image

 

 

Rozdział 5 

140 

Tabela 5.2 Gałęzie w HKEY_LOCAL_MACHINE 

Nazwa gałęzi Opis 

HARDWARE Opisuje 

fizyczną konfigurację komputera, sposób używania 

sterowników urządzeń przez sprzęt, sterowniki trybu jądra, 
mapy urządzeń i mapy zasobów. Dane przechowywane w tym 
kluczu są ulotne, tzn. są tworzone od nowa podczas każdego 
startu systemu. Program Windows NT Diagnostic 
(WINMSD.EXE) może je wyświetlić w łatwiejszym do 
zrozumienia formacie; większość danych  przechowywana jest 
tu w formacie binarnym, który jest trudny do rozszyfrowania. 
Poddrzewo HARDWARE posiada trzy główne podklucze: 
DESCRIPTION, DEVICEMAP i RESOURCEMAP. Klucz 
DESCRIPTION zawiera informacje o sprzęcie wykryte przez 
NTDETECT.COM i program wykonawczy Windows NT. 
Klucz DEVICEMAP zawiera informacje (w specjalnym 
formacie) o klasach sterowników urządzeń. Klucz 
RESOURCEMAP odwzorowuje sterowniki urządzeń na 
używane przez nie zasoby sprzętowe. 

SAM 

Zawiera informacje o kontach użytkowników i grup 
w domenie (dla Windows NT Server) lub w lokalnym 
komputerze (dla Windows NT Workstation). Informacjami 
tymi zarządza się przy pomocy programu administracyjnego 
User Manager, a listę użytkowników i grup można obejrzeć 
w File Manager. Klucz ten jest odwzorowany w kluczu 
HKEY_LOCAL_MACHINE\ SECURITY\SAM, co oznacza, 
że zmiana dokonana w jednym z tych kluczy automatycznie 
pojawia się w drugim. 

SECURITY 

Zawiera informacje o założeniach bezpieczeństwa i prawach 
użytkowników. Używany jest przez podsystem 
bezpieczeństwa Windows NT. 

SOFTWARE 

Zawiera informacje o zainstalowanym w komputerze 
oprogramowaniu oraz różnorodne dane konfiguracyjne - jak 
np. parametry konfiguracyjne protokołu TCP/IP. 

SYSTEM 

Steruje uruchamianiem systemu, ładowaniem sterowników 
urządzeń, uruchamianiem usług Windows NT i innym 
funkcjami systemu operacyjnego. 

Narzędzia umożliwiające przeglądanie i konfigurację 
Rejestru 

Zalecaną metodą konfiguracji Rejestru jest użycie narzędzi służących do 
konfiguracji sieci i administrowania nią. W Windows NT podstawowym 
narzędziem konfiguracji sieci jest program Network w Control Panel. 

Niektóre z czynności konfiguracyjnych wygodniej jest jednak przepro-
wadzić edytując bezpośrednio Rejestr. W tym celu można skorzystać 

background image

Zaawansowane konfigurowanie TCP/IP przy pomocy Rejestru i języka Perl 

141 

programu edytora Rejestru Registry Editor (REGEDIT.EXE lub 

REGEDT32.EXE

). Wszelkich zmian w Rejestrze należy dokonywać z naj-

większą ostrożnością, ponieważ mogą one doprowadzić do zawieszenia 
systemu. Przed dokonaniem poważniejszych zmian należy sporządzić 
zapasową kopię Rejestru (np. używając programu REGBACK). 

Za pomocą edytora Rejestru można również edytować Rejestr zdalnego 
komputera. Jest to przydatne zwłaszcza w sytuacji, w której bezpośredni 
dostęp do zdalnego komputera jest utrudniony. 

Edytor Rejestru pracuje w trybie interaktywnym; stosuje się go głównie 
do wprowadzania zmian w pojedynczym komputerze. Jeśli identycznych 
zmian należy dokonać w Rejestrach wszystkich komputerów w sieci, 
a w trakcie tej operacji nie jest wymagana współpraca użytkownika, 
wówczas wygodniej jest napisać własny program lub skrypt. Może to być 
np. program w C/C++ dokonujący zmian poprzez interfejs programowy 
Rejestru lub skrypt w języku Perl używanym w systemach Win32 (Win-
dows NT i Windows 9x), odczytujący lub modyfikujący Rejestr. 

Inną wygodną metodą modyfikacji Rejestru jest stworzenie specjalnych 
plików tekstowych, zawierających parametry Rejestru, które należy 
zmienić. Po napisaniu pliku przyklad.reg, zawierającego edytowane war-
tości, używamy polecenia regedit przyklad.reg aby przepisać jego zawar-
tość do Rejestru. 

Pozostałe podrozdziały są wprowadzeniem do używania edytora rejestru 
i języka skryptów Perl. 

Tabela 5.3 Standardowe gałęzie Rejestru 

Nazwa gałęzi Związane z gałęzią pliki 

HKEY_LOCAL_MACHINE\SAM SAM, 

SAM.LOG 

HKEY_LOCAL_MACHINE\SECURI
TY 

SECURITY, SECURITY.LOG 

HKEY_LOCAL_MACHINE\SOFTWA
RE 

SOFTWARE, SOFTWARE.LOG 

HKEY_LOCAL_MACHINE\SYSTEM SYSTEM, 

SYSTEM.ALT 

HKEY_CURRENT_USER 

USER###, USER###.LOG, ADMIN###, 
ADMIN###.LOG 

HKEY_USERS\DEFAULT DEFAULT, 

DEFAULT.LOG 

Przeglądanie parametrów związanych z 

TCP/IP przy pomocy 

Edytora rejestru 

Parametry związane z TCP/IP są przechowywane w Rejestrze pod na-
stępującym kluczem: 

background image

 

 

Rozdział 5 

142 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip 

Klucz ten zawiera parametry TCP/IP dla całego systemu, takie jak nazwa 
hosta, nazwa domeny, serwery nazw, opcje wykrywania routerów itd. 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName 

Klucz ten definiuje nazwę komputera używaną przez system. Odwzoro-
wanie adresu IP w kluczu powinno być zgodne z adresem IP komputera 
o danej nazwie. 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root 

Klucz ten zawiera informacje o stanie kart sieciowych w systemie. Profil 
sprzętowy Windows NT może zawierać wiele definicji kart sieciowych, 
ale nie wszystkie karty muszą rzeczywiście funkcjonować lub nawet być 
zainstalowane. Klucza tego można użyć, aby stwierdzić, które karty sie-
ciowe są aktywne. 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 

Klucz ten zawiera parametry i powiązania kart sieciowych. System uży-
wa tylko parametrów aktywnych kart sieciowych. 

Edytor rejestru można uruchomić wykonując program REGEDT32.EXE. 
Wszystkie parametry związane z TCP/IP znajdują się w podkluczu 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet

CurrentControlSe

t

 jest 

symbolicznym  łączem (wskaźnikiem) do klucza o nazwie takiej, jak np. 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet001

 lub 

HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet002

. Zwrot control  set 

oznacza tu zbiór parametrów koniecznych do poprawnego uruchomienia 
systemu. Przechowuje się kilka kopii zbioru parametrów, co umożliwia 
wyłączenie błędnego zbioru i przywrócenie poprawnie funkcjonującej 
kopii. Kopia zbioru, na którą wskazuje 

HKEY_LOCAL_MACHINE\SYSTEM\Current ControlSet

 jest określona w kluczu 

HKEY_LOCAL_MACHINE\SYSTEM\ Select

. Wpisy pod tym kluczem są typu 

REG_DWORD

 i obejmują: 

„Current

: Zawiera numer zbioru parametrów, na który obecnie wskazu-

je HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet. 

„Default

: Zawiera numer domyślnego zbioru parametrów. 

„Failed

: Zawiera numer ostatniego zbioru parametrów, który okazał się 

błędny. 

„LastKnownGood

: Zawiera numer ostatniego zbioru parametrów, który 

okazał się poprawny. Zbiór parametrów uważa się za poprawny, jeśli 
powiodło się uruchomienie komputera i użytkownik mógł się zalo-
gować do systemu. 

background image

Zaawansowane konfigurowanie TCP/IP przy pomocy Rejestru i języka Perl 

143 

Rysunek 5.3 

Wpisy pod kluczem 
HKEY_LOCAL_ 
MACHINE\SYSTE
M\ Select. 

 

 

Rysunek 5.3 przedstawia wpisy znajdujące się pod kluczem 
HKEY_LOCAL_MACHINE\SYSTEM\Select

. Na rysunku można zobaczyć, 

że numerem bieżącego zbioru parametrów jest 1, co odpowiada kluczowi 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet001

. Numer do-

myślnego zbioru parametrów (wartość  1) jest taki sam, jak bieżącego. 
Numer błędnego zbioru parametrów wynosi  0, co oznacza, że  żaden 
zbiór nie okazał się  błędny. Numerem ostatniego zbioru parametrów, 
który okazał się poprawny, jest 2. Odpowiada to kluczowi 
HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet002

background image

 

 

Rozdział 5 

144 

Rysunek 5.4 

Klucz HKEY_LOCAL_ 
MACHINE\SYSTEM\ 
CurrentControlSet\ 
Services\Tcpip 

 

Rysunek 5.5 

Klucz HKEY_LOCAL_ 
MACHINE\SYSTEM\ 
CurrentControlSet\ 
Control\ComputerName 

 

background image

Zaawansowane konfigurowanie TCP/IP przy pomocy Rejestru i języka Perl 

145 

Rysunek 5.6 

Klucz HKEY_LOCAL_ 
MACHINE\SYSTEM\ 
CurrentControlSet\ 
Enum\Root 

 

Rysunek 5.7 

Klucz HKEY_LOCAL_ 
MACHINE\SYSTEM\ 
CurrentControlSet\ 
Services 

 

Dostęp do Rejestru przy użyciu języka Perl 

Perl jest skryptowym językiem programowania wywodzącym się ze śro-
dowiska UNIX. Zaprojektowano go jako narzędzie do wykonywania 

background image

 

 

Rozdział 5 

146 

zadań systemowych w UNIX, ale można go używać w dowolnym syste-
mie operacyjnym. Język Perl przeniesiono na wiele platform - może rów-
nież pracować w Windows NT i Windows 9x. 

Perl dla systemów Win32 można otrzymać od wydawców CD-ROM, jak 
Walnut Creek lub InfoMagic, Inc. Standardową dystrybucję  języka Perl 
można znaleźć pod internetowym adresem: 

http://www.perl.com/CPAN 

Skrypty Perl operujące na Rejestrze umożliwiają automatyzację zadań 
związanych z administracją i konfiguracją sieci. Jest to przydatne zwłasz-
cza wtedy, kiedy te same zadania są wykonywane na wielu kompute-
rach. 

Kolejne podrozdziały omawiają  użycie języka Perl w celu zautomatyzo-
wania różnorodnych zadań związanych z konfiguracją Rejestru. 

Konfigurowanie TCP/IP przy użyciu języka Perl 

Niniejszy podrozdział omawia kilka przykładowych skryptów Perl od-
czytujących i zmieniających parametry Rejestru Windows NT. Przykłady 
napisano w języku Perl w wersji 5, nazywanym również Perl5. 

Aby wypróbować poniższe przykłady, należy zainstalować w kompute-
rze język Perl5 wraz z rozszerzeniami dla Win32, które wchodzą w skład 
standardowej dystrybucji Perl5 dla systemów Win32. 

Odczytywanie aktywnej nazwy komputera 

Rozważmy sytuację, w której chcemy odczytać z Rejestru aktywną nazwę 
komputera. Pisanie skryptu tylko w tym celu jest niepotrzebne, ponieważ 
nazwę komputera można łatwo odczytać używając interfejsu graficznego 
Windows NT. Uzyskanie aktywnej nazwy komputera może być jednak 
przydatne w sytuacji, kiedy stanowi ona część skryptu zmieniającego lub 
konfigurującego nazwę komputera. 

Oto skrypt Perl odczytujący aktywną nazwę komputera: 

$status = NTRegOpenKeyEx (&HKEY_LOCAL_MACHINE, 
'SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerNam
e', 
&NULL, &KEY_ALL_ACCESS, $hkey); 
if ($status) 

 

print "Otwieram klucz ComputerName 1:\n"; 


else 

background image

Zaawansowane konfigurowanie TCP/IP przy pomocy Rejestru i języka Perl 

147 

 

print "Nie można otworzyć klucza ComputerN

ame!\n"; 

 exit; 

 
NTRegQueryValueEx( $hkey, 'ComputerName', &NULL, $type, 
$oldcomputername); 
Print "Aktywna nazwa komputera jest: $oldcomputername\n"; 
NTREGCloseKey( $hkey ); 

Pierwsze polecenie skryptu NTRegOpenKey()  służy do otwarcia klucza 
określonego przez drugi parametr: 

$status = NTRegOpenKeyEx (&HKEY_LOCAL_MACHINE, 
'SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerNam
e', 
&NULL, &KEY_ALL_ACCESS, $hkey); 

Otwierany klucz znajduje się pod kluczem podstawowym, 
HKEY_LOCAL_MACHINE

, określonym przez pierwszy parametr. 

Uchwyt do otwartego klucza, $hkey, jest zwracany w ostatnim parame-
trze. Uchwyt ten jest używany przy kolejnych operacjach na Rejestrze 
i pozostaje  ważny aż do momentu zamknięcia klucza. Trzeci parametr 
jest zarezerwowany; zamiast niego przekazuje się wartość pustą (NULL). 
Czwarty parametr określa operacje, które można przeprowadzać na klu-
czu. W tym przypadku KEY_ALL_ACCESS oznacza, że dopuszczalne są 
wszystkie możliwe operacje. KEY_ALL_ACCESS jest symboliczną stałą 
o wstępnie zdefiniowanej wartości. Ponieważ Perl nie dopuszcza stoso-
wania symbolicznych stałych,  KEY_ALL_ACCESS jest w rzeczywistości 
podprogramem zwracającym stałą wartość. Podprogramy w Perl wywo-
łuje się przez poprzedzenie ich nazwy symbolem '&' - stąd zapis 
&KEY_ALL_ ACCESS

, oznaczający wywołanie  pdprogramu  KEY_ALL_ 

ACCESS().

 Poniżej podano pozostałe możliwe wartości dla operacji na 

kluczu, wraz z definicjami podprogramów: 

sub DELETE {(0x00010000);} 
sub READ_CONTROL {(0x00020000);} 
sub WRITE_DAC {(0x00040000);} 
sub WRITE_OWNER {(0x00080000);} 
sub SYNCHRONIZE {(0x00100000);} 
sub STANDARD_RIGHTS_REQUIRED {(0x000F0000);} 
sub STANDARD_RIGHTS_READ {(&READ_CONTROL);} 
sub STANDARD_RIGHTS_WRIGHT {(&READ_CONTROL);} 
sub STANDARD_RIGHTS_EXECUTE {(&READ_CONTROL);} 
sub STANDARD_RIGHTS_ALL {(0X001F0000);} 
sub SPECIFIC_RIGHTS_ALL {(0X0000FFFF);} 
sub ACCESS_SYSTEM_SECURITY {(0X01000000);} 
sub MAXIMUM_ALLOWED {(0X02000000);} 
sub GENERIC_READ {(0X080000000);} 
sub GENERIC_WRITE {(0X40000000);) 
sub GENERIC_EXECUTE {(0X20000000);} 
sub GENERIC_ALL {(0X10000000);} 
sub KEY_QUERY_VALUE {(0X0001);} 
sub KEY_SET_VALUE {(0X0002);} 
sub KEY_CREATE_SUB_KEY{ (0X0004);} 
sub KEY_ENUMERATE_SUB_KEYS {(0X0008);} 

background image

 

 

Rozdział 5 

148 

sub KEY_NOTIFY {(0X0010);} 
sub KEY_CREATE_LINK {(0X0020);} 
sub KEY_READ {((&STANDARDRIGHTS_READ|&KEY_QUERY_VALUE| 

&KEY_ENUMERATE_SUB_KEYS|&KEY_NOTIFY)&(~&SYNCHRONIZE));} 

sub KEY_WRITE 
{((&STANDARD_RIGHTS_WRITE|&KEY_SET_VALUE|&KEY_CREATE_SUB_KEY) 

&(~&SYNCHRONIZE));} 

sub KEY_EXECUTE {((&KEY_READ)&(~SYNCHRONIZE);} 
sub KEY_ALLACCESS{((&STANDARD_RIGHTS_ALL|&KEY_QUERY_VALUE| 

&KEY_SET_VALUE|&KEY_CREATE_SUB_KEY|&KEY_ENUMERATE_SUB_KEYS| 

&KEY_NOTIFY|&KEY_CREATE_LINK)&(~&SYNCHRONIZE));} 

Słowo kluczowe sub oznacza początek podprogramu. Po sub umieszcza 
się nazwę podprogramu, a następnie w nawiasach klamrowych ({}) jego 
treść. Ponieważ do uprzednio wymienionych podprogramów nie przeka-
zuje się  żadnych parametrów, możliwy jest zapis &KEY_ALL_ACCESS 
zamiast &KEY_ALL_ACCESS(). 

Pozostałymi podprogramami zwracającymi stałą wartość, użytymi jako 
parametry w 

funkcji NTRegOpenEx(),  są  HKEY_LOCAL_MACHINE 

i NULL, zwracające odpowiednio wartości 0x80000002 i 0. Wyglądają one 
następująco: 

sub HKEY_LOCAL_MACHINE {( 0x80000002 );} 
sub NULL { (0);} 

Podprogram  HKEY_LOCAL_MACHINE zwraca wstępnie zdefiniowany 
uchwyt do klucza Rejestru: 0x80000002. Oto lista zdefiniowanych uchwy-
tów do kluczy Rejestru: 

sub HKEY_CLASSES_ROOT {( 0x80000000 );} 
sub HKEY_CURRENT_USER {( 0x80000001 );} 
sub HKEY_LOCAL_MACHINE {( 0x80000002 );} 
sub HKEY_USERS {( 0x80000003 );} 
sub HKEY_PERFORMANCE_DATA {( 0x80000004 );} 
sub HKEY_PERFORMANCE_TEXT {( 0x80000004 );} 
sub HKEY_PERFORMANCE_NLSTEXT {( 0x80000004 );} 

Wartość zwracana przez procedurę NTRegOpenEx() jest wartością skalar-
ną, przechowywaną w zmiennej skalarnej $status. W języku Perl zmienne 
mogą posiadać pojedynczą wartość lub zbiór wartości. Obiekty 
o pojedynczych  wartościach przechowuje się w zmiennych skalarnych, 
których nazwę zawsze poprzedza symbol '$'. Obiekty zawierające zbiór 
wartości nazywane są listami wektorów i 

przechowuje się je 

w zmiennych tablicowych, których nazwę zawsze poprzedza symbol '@'. 
Innym rodzajem obiektu zawierającego zbiór wartości jest zmienna mie-
szana (hash), będąca indeksowaną tablicą. Nazwa zmiennej mieszanej 
rozpoczyna się od symbolu '%'. 

Jeśli procedura zwraca różną od zera wartość skalarną, zazwyczaj ozna-
cza to pomyślne wykonanie operacji, natomiast wartość 0 oznacza błąd 

background image

Zaawansowane konfigurowanie TCP/IP przy pomocy Rejestru i języka Perl 

149 

w jej wykonaniu. W omawianym skrypcie Perl testuje się wartość zwra-
caną przez NTRegOpenEx(), po czym wyświetla odpowiedni komunikat: 

if ($status) 

 

print "Otwieram klucz ComputerName 1:\n"; 


else 

 

print "Nie można otworzyć klucza ComputerN

ame!\n"; 

 exit; 

Jeśli procedura NTRegOpenEx()  zawiedzie, wówczas wykonuje się część 
else

 instrukcji if. Polecenie exit powoduje natychmiastowe zatrzymanie 

skryptu Perl z wyjściowym kodem 0. 

Po pomyślnym wykonaniu procedury NTRegOpenEx() wywołuje się pro-
cedurę 

NTRegQueryValueEx()

, aby sprawdzić wartość wpisu 

ComputerName

NTRegQueryValueEx( $hkey, 'ComputerName', &NULL, $type, $oldcomputername); 

Pierwszym parametrem procedury NTRegQueryValueEx() jest uchwyt do 
klucza Rejestru $hkey. Drugi parametr jest nazwą wpisu, którego wartość 
chcemy odczytać. Trzeci parametr jest zarezerwowany; zamiast niego 
przekazuje się wartość pustą (NULL). Czwarty parametr, $type, oznacza 
zwracany typ wartości wpisu. Piąty parametr jest zwracaną wartością 
wpisu. Zwracanego przez procedurę parametru $type można użyć do 
określenia, jakiego typu był sprawdzany wpis. Typ wpisu można spraw-
dzić również w edytorze rejestru, o ile znamy jego nazwę. W języku Perl 
zdefiniowano następujące typy danych Windows NT: 

sub REG_NONE {( 0 )}; 
sub REG_SZ {( 1 )}; 
sub REG_EXPAND_SZ {( 2 )}; 
sub REG_BINARY {( 3 )}; 
sub REG_DWORD {( 4 )}; 
sub REG_DWORD_LITTLE_ENDIAN {( 4 )}; 
sub REG_ DWORD_BIG_ENDIAN {( 5 )}; 
sub REG_LINK {( 6 )}; 
sub REG_MULTI_SZ {( 7 )}; 
sub REG_RESOURCE_LIST {( 8 )}; 
sub REG_FULL_RESOURCE_DESCRIPTOR {( 9 )}; 
sub REG_RESOURCE_REQUIREMENTS_LIST {( 10 )}; 

Na zakończenie skrypt zamyka klucz Rejestru wywołując procedurę 
NTRegCloseKey

, która zwalnia pamięć zajmowaną przez struktury da-

nych związane z otworzonym kluczem: 

NTREGCloseKey( $hkey ); 

background image

 

 

Rozdział 5 

150 

Aby wykonać skrypt Perl, należy określić odpowiednie biblioteki 
i definicje procedur. Można to zrobić dołączając na początku omawiane-
go skryptu następujące linie: 

BEGIN{ 

@

INC = qw( Lib 

   Ext ); 
 
}; 
require "NT.ph"; 

Polecenie BEGIN{} powoduje, że zawarte w nawiasach polecenia zostaną 
wykonane na początku pracy skryptu. W bloku BEGIN zdefiniowano 
listę  @INC, która wymienia katalogi dołączanych plików. Składnia qw() 
oznacza, że zawartość nawiasów (w tym przypadku słowa Lib i Ext) jest 
traktowana jak lista słów w cudzysłowach: 

("Lib", "Ext") 

Polecenie to odpowiada więc następującemu: 

@

INC = ("Lib", "Ext") 

Polecenie  require określa,  że podczas kompilacji zostanie przetworzona 
zawartość pliku "NT.ph", i że zawarte w nim definicje będą znane przed 
przetwarzaniem pozostałych poleceń. 

Pełny skrypt Perl, zawierający powyższe definicje, wygląda więc nastę-
pująco: 

BEGIN{ 

@

INC = qw( Lib 

   Ext ); 
 
}; 
require "NT.ph"; 
 
$status = NTRegOpenKeyEx (&HKEY_LOCAL_MACHINE, 
‘SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerNam
e’, 
&NULL, &KEY_ALL_ACCESS, $hkey); 
if ($status) 

 

print "Otwieram klucz ComputerName 1:\n"; 


else 

 

print "Nie można otworzyć klucza ComputerN

ame!\n"; 

 exit; 

 
NTRegQueryValueEx( $hkey, 'ComputerName', &NULL, $type, 
$oldcomputername); 

Print "Aktywną nazwa komputera jest: $oldcomputername

\n"; 

NTREGCloseKey( $hkey ); 

background image

Zaawansowane konfigurowanie TCP/IP przy pomocy Rejestru i języka Perl 

151 

Jeśli chcemy, aby skrypt mógł pracować tylko w systemie Windows NT, 
wówczas możemy użyć procedury Win32::IsWinNT(), która zwraca nieze-
rową wartość w przypadku pracy skryptu w Windows NT i zero 
w przypadku innych systemów. Przedrostek Win32:: przed IsWinNT() jest 
nazwą modułu Windows 32, w 

którym zdefiniowano procedurę 

IsWinNT

. W celu sprawdzenia, czy skrypt pracuje w Windows NT można 

użyć następującego polecenia if: 

If( Win32::IsWinNT() ) 

 

# Kod specyficzny dla Windows NT 

W omawianym skrypcie znajduje się kod specyficzny dla Windows NT. 
Aby zapewnić,  że zostanie on wykonany tylko w tym systemie, można 
przepisać skrypt następująco: 

BEGIN{ 

@

INC = qw( Lib 

   Ext ); 
 
}; 
require "NT.ph"; 

 

If( Win32::IsWinNT() ) 

$status = NTRegOpenKeyEx (&HKEY_LOCAL_MACHINE, 
‘SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerNam
e’, 
&NULL, &KEY_ALL_ACCESS, $hkey); 
if ($status) 

 

print "Otwieram klucz ComputerName 1:\n"; 


else 

 

print "Nie można otworzyć klucza Co

mputerName!\n"; 

 exit; 

 
NTRegQueryValueEx( $hkey, 'ComputerName', &NULL, $type, 
$oldcomputername); 
Print 

"Aktywną nazwa komputera jest: $oldcomputername

\n"; 

NTRegCloseKey( $hkey ); 

Modyfikowanie adresów IP 

Adres IP karty sieciowej jest przechowywany we wpisie IPAddress pod 
kluczem:  

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\nazwa_karty\Parameters\Tcpip

Aby odczytać ten wpis, można skorzystać z procedur NTRegOpenKeyEx(), 
NTRegQueryValueEx()

  i NTRegCloseKey()  używanych w omawianym po-

przednio skrypcie Perl. Aby zmienić wpis, należy użyć procedury 

background image

 

 

Rozdział 5 

152 

NTRegSetValueEx().

 Następujący skrypt Perl odczytuje, wyświetla i zmie-

nia adres IP: 

BEGIN{ 

@

INC = qw( Lib 

   Ext ); 
 
}; 
require "NT.ph"; 
 
$ip = "144.19.75.2"; # Nowy adres IP 
 
NTRegOpenKeyEx (&HKEY_LOCAL_MACHINE, 
  ‘SYSTEM\CurrentControlSet\Services\El90x2\Parameters\Tcpip’, 
  &NULL, &KEY_ALL_ACCESS, $hkey) ? 
  &log( "Otwieram klucz z wpisem IPAddress dla 3COM 3C905.\n" ): 

  &gripe( "Nie można odnaleźć wpisu IPAddress dla 3COM 3C905!

\n" 

); 
 
NTRegQueryValueEx($hkey, 'IPAddress', &NULL, $type, 
$oldipaddress); 
print 

"Poprzednim adresem IP 3COM 3C905 był: $oldipaddress

\n"; 

 
NTRegSetValueEx($hkey, 'IPAddress', &NULL, $type, $ip) ? 
  &log( "Zmieniono adres IP dla 3COM 3C905 na $ip\n" ): 

  &gripe( "Nie można zmienić adresu IP dla 3COM 3C905!

\n" ); 

 
NTRegQueryValueEx($hkey, 'IPAddress', &NULL, $type, 
$oldipaddress); 
if ( $oldipaddress eq $ip ) 

print "Zweryfikowano adres IP 3COM 3C905 jako: $ip\n"; 


NTRegCloseKey( $hkey ); 

# Podprogramy wyświetlające komunikaty o

 

sukcesie lub błędzie

 


sub log 

 

( $message ) = 

@

_; 

 print 

$message; 


 
sub gripe 

 

( $message ) = 

@

_; 

 warn 

$message; 


 

NTRegOpenKey()

 wywołuje się, aby otrzymać uchwyt $hkey do klucza 

znajdującego się w HKEY_LOCAL_MACHINE. Jeśli zwrócona wartość jest 
niezerowa (sukces), wówczas wywoływany jest podprogram log(). Jeśli 
zaś zwróconą wartością jest zero (błąd), wówczas wywoływany jest pod-
program gripe(). Podprogramy log()  i gripe()  są zdefiniowane na końcu 
skryptu: 

NTRegOpenKeyEx (&HKEY_LOCAL_MACHINE, 
  ‘SYSTEM\CurrentControlSet\Services\El90x2\Parameters\Tcpip’, 

background image

Zaawansowane konfigurowanie TCP/IP przy pomocy Rejestru i języka Perl 

153 

  &NULL, &KEY_ALL_ACCESS, $hkey) ? 
  &log( "Otwieram klucz z wpisem IPAddress dla 3COM 3C905.\n" ): 

  &gripe( "Nie można odnaleźć wpisu IPAddress dla 3COM 3C905!

\n" 

); 

Po otrzymaniu uchwytu do klucza, wartość wpisu IPAddress jest odczy-
tywana przy pomocy NTRegQueryValueEx() i następnie wyświetlana: 

NTRegQueryValueEx($hkey, 'IPAddress', &NULL, $type, 
$oldipaddress); 
print "Poprzednim adresem IP 3COM 3C905 byl: $oldipaddress\n"; 

Następnie używa się procedury NTRegSetValueEx() do ustawienia nowe-
go adresu IP. Liczba i format przekazywanych parametrów są takie same, 
jak w przypadku procedury NTRegQueryValueEx(). Nowy adres IP, prze-
chowywany w 

zmiennej $ip, jest przekazywany w 

wywołaniu 

NTRegSetValueEx()

 jako ostatni parametr: 

NTRegSetValueEx($hkey, 'IPAddress', &NULL, $type, $ip) ? 
  &log( "Zmieniono adres IP dla 3COM 3C905 na $ip\n" ): 

  &gripe( "Nie można zmienić adresu IP dla 3COM 3C905!

\n" ); 

Instrukcje następujące po zmianie wpisu służą do upewnienia się,  że 
wpis został zmieniony zgodnie z oczekiwaniami. Do ponownego odczy-
tania zapisanej właśnie wartości używa się procedury NTRegQueryValue 
Ex()

NTRegQueryValueEx($hkey, 'IPAddress', &NULL, $type, 
$oldipaddress); 
if ( $oldipaddress eq $ip ) 

print "Zweryfikowano adres IP 3COM 3C905 jako: $ip\n"; 


NTRegCloseKey( $hkey ); 

W powyższym przykładzie nowy adres IP był trwale zapisany 
w skrypcie.  Jeśli chcemy umożliwić administratorowi sieci wpisanie ad-
resu IP podczas wykonywania skryptu, możemy wykorzystać zmodyfi-
kowaną wersję skryptu. Wersja ta sprawdza również, czy skrypt pracuje 
w Windows NT, wywołując procedurę Win32::IsWinNT: 

BEGIN{ 

@

INC = qw( Lib 

   Ext ); 
 
}; 
require "NT.ph"; 
 
print <<'--end- - '; 
Skrypt ten zmieni konfiguracje sieci. 

Czy chcesz kontynuować? 

[Y/n] 

--end -  
$in = <STDIN>; 
until ( $in eq "\n" || $in =~ /^y/i ) 

background image

 

 

Rozdział 5 

154 

 

exit if ( $in =~ /^no?\n$/i ); 

 

print "Czy chcesz kontynuować? 

[Y/n]"; 

 

$in = <STDIN>; 


 
print "Wprowadz adres IP:"; 
$ip = <STDIN>; 
 
if (Win32::IsWinNT()) 

NTRegOpenKeyEx (&HKEY_LOCAL_MACHINE, 
  ‘SYSTEM\CurrentControlSet\Services\El90x2\Parameters\Tcpip’, 
  &NULL, &KEY_ALL_ACCESS, $hkey) ? 
  &log( "Otwieram klucz z wpisem IPAddress dla 3COM 3C905.\n" ): 

  &gripe( "Nie można odnaleźć wpisu IPAddress dla 3COM 3C905!

\n" 

); 
 
NTRegQueryValueEx($hkey, 'IPAddress', &NULL, $type, 
$oldipaddress); 
print "Poprzednim adresem IP 3COM 3C905 byl: $oldipaddress\n"; 
 
NTRegSetValueEx($hkey, 'IPAddress', &NULL, $type, $ip) ? 
  &log( "Zmieniono adres IP dla 3COM 3C905 na $ip\n" ): 

  &gripe( "Nie można zmienić adresu IP dla 3COM 3C905!

\n" ); 

 
NTRegQueryValueEx($hkey, 'IPAddress', &NULL, $type, 
$oldipaddress); 
if ( $oldipaddress eq $ip ) 

print "Zweryfikowano adres IP 3COM 3C905 jako: $ip\n"; 


NTRegCloseKey( $hkey ); 
 

 

# Podprogramy wyświetlające komunikaty o

 

sukcesie lub błędzie

 


sub log 

 

( $message ) = 

@

_; 

 print 

$message; 


 
sub gripe 

 

( $message ) = 

@

_; 

 warn 

$message; 

Usuwanie kluczy Rejestru 

W omawianych przykładach nie było potrzeby usuwania żadnego klucza 
Rejestru; podczas konfigurowania parametrów TCP/IP również nie ma 
takiej potrzeby. Usuwanie kluczy może się jednak przydać podczas 
czyszczenia Rejestru z nieaktualnych informacji, jak np. parametrów nie-
używanej już karty sieciowej. W tym celu można wykorzystać procedurę 

background image

Zaawansowane konfigurowanie TCP/IP przy pomocy Rejestru i języka Perl 

155 

NTRegDeleteKey().

 Wcześniej jednak spod usuwanego klucza należy usu-

nąć wszystkie podklucze. Składnia NTRegDeleteKey() jest następująca: 

NTRegDeleteKey(uchwyt, nazwa_klucza) 

Pierwszy parametr jest uchwytem otrzymanym podczas otwierania klu-
cza. Drugi parametr jest łańcuchem znaków będącym nazwą usuwanego 
klucza. 

Wyświetlanie parametrów TCP/IP przy użyciu obiektów Perl 

Podane wyżej przykłady skryptów konfigurujących TCP/IP nie wyko-
rzystywały obiektów Rejestru, które można zdefiniować z języku Perl. 
Wszystkie operacje na Rejestrze były przeprowadzane przy pomocy 
uchwytów do kluczy Rejestru. Perl5 umożliwia stworzenie odniesienia 
do obiektu, dzięki czemu wszystkie operacje przeprowadzane będą przy 
pomocy określonych dla tego obiektu metod. Metody są podobne do 
procedur Perl z tym, że działają na obiektach. 

Rozważmy następujący skrypt Perl, który pracując w systemie Windows 
NT wyświetla wszystkie parametry TCP/IP przechowywane pod klu-
czem 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\ 

Parameters

BEGIN{ 

@

INC = qw( Lib 

   Ext ); 
 
}; 
require "NT.ph"; 
 
use Win32::Registry 
 
$keyname 
="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"; 
$main::HKEY_LOCAL_MACHINE->Open($keyname, $param)|| 
 

die "Open: $!; 

$param->GetValues(\%value_entries); 
 
foreach $k (keys %value_entries) 

 

$key = $value_entries{$k}; 

 

print "$$key[0] = $$key[2]\n"; 


 

Pierwszym interesującym poleceniem jest use: 

use Win32::Registry 

Służy ono do dołączenia pakietu Win32::Registry w celu dalszego użycia. 
Zmienna 

$keyname

 zawiera klucz: 

 SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 

w odniesieniu do klucza 

podstawowego HKEY_LOCAL_ MACHINE. 

background image

 

 

Rozdział 5 

156 

Następne polecenie wykorzystuje obiekt 
$main::HKEY_LOCAL_MACHINE

, wstępnie zdefiniowany w 

module 

Rejestru jako klucz podstawowy HKEY_LOCAL_MACHINE i wykonuje 
metodę Open(): 

$main::HKEY_LOCAL_MACHINE->Open($keyname, $param)|| 
 

die "Open: $!; 

 

Jeśli wartością zwróconą przez metodę Open() jest zero, wykonywane jest 
polecenie die. Zapis '$!' oznacza ostatni kod błędu. 

Zmienna param$ zawiera obiekt odpowiadający otworzonemu kluczowi. 
Używa jej się w następnym poleceniu, aby otrzymać tablicę asocjacyjną 
zawierającą wpisy Rejestru: 

$param->GetValues(\%value_entries); 

Użycie znaku '\' przed %value_entries oznacza, że jest to wskaźnik do 
tablicy asocjacyjnej. Tablica ta po powrocie z metody GetValues()  będzie 
zawierać wpisy Rejestru. Każdy element tablicy składa się z nazwy war-
tości Rejestru i wskaźnika do trzyelementowej listy. Elementami tymi są 
nazwa wpisu, typ danych i wartość wpisu. Polecenie foreach powoduje, 
że zmienna $k wskazuje kolejno na wszystkie wpisy w danym kluczu: 

foreach $k (keys %value_entries) 

 

$key = $value_entries{$k}; 

 

print "$$key[0] = $$key[2]\n"; 


 

Operator keys zwraca tablicę kluczy w tablicy asocjacyjnej %value_entries. 
Następujące polecenie zwraca trzyelementową listę: 

$key = $value_entries{$k}; 

$key[0]

 oznacza pierwszy element na liście, czyli nazwę wpisu; $key[2] 

oznacza trzeci element na liście i jest wartością wpisu. Drugi element 
listy, $key[2], oznacza typ danych Rejestru i nie jest wyświetlany. Nastę-
pujące polecenie print wyświetla więc nazwę wpisu i jego wartość: 

print "$$key[0] = $$key[2]\n"; 

Wykonywanie skryptów Perl 

Skrypty Perl można uruchamiać z linii poleceń przy użyciu następujące-
go polecenia: 

perl nazwa_pliku_perl 

Tekst nazwa_pliku_perl należy zastąpić nazwą pliku zawierającego 
skrypt Perl. 

background image

Zaawansowane konfigurowanie TCP/IP przy pomocy Rejestru i języka Perl 

157 

Możliwe jest również umieszczenie poleceń Perl w pliku wsadowym. 
Poniżej przedstawiono umożliwiający to trik: 

#!c:\winnt\system32\perl5\perl.exe 

@

rem = '--*-Perl-*--'; 

@

rem = ' 

echo off 
if exist perl.exe goto perltutaj 

print Nie można odnaleźć interpretera Perl!

 

print *koniec* 
pause 
goto koniecperl 
:perltutaj 
if exist perl100.dll goto perldlltutaj 

print Nie można odnaleźć perl100.dll!

 

print *koniec* 
pause 
goto koniecperl 
:perldlltutaj 
perl.exe nazwa_pliku_wsadowego %1 %2 %3 %4 %5 %6 %7 %8 %9 
goto koniecperl 
 

@

rem '; 

 
BEGIN 

@

INC = qw( Lib 

     Ext ); 
 
}; 
 
require "NT.ph"; 
 

Tutaj wpisać resztę skryptu Perl

 

 
:koniecperl 
 

Polecenie  #!c:\winnt\system32\perl5\perl.exe na początku pliku jest trakto-
wane jako komentarz przez interpretery poleceń, takie jak Korn Shell lub 
C shell, przeniesione z UNIX na platformę Windows NT. Jeśli używamy 
któregoś z tych interpreterów, wówczas pierwsza linia nakazuje przetwa-
rzać resztę pliku przy pomocy programu c:\winnt\system32\ perl5\perl.exe. 

Następne dwa polecenie są traktowane jako komentarz przez interpreter 
poleceń Win32, CMD.EXE, który jest kompatybilny z interpreterem pole-
ceń MS-DOS: 

@

rem = '--*-Perl-*--'; 

@

rem = ' 

Kolejne polecenia są normalnie przetwarzane przez interpreter poleceń 
Win32: 

echo off 
if exist perl.exe goto perltutaj 

print Nie można odnaleźć interpretera Perl!

 

print *koniec* 
pause 
goto koniecperl 

background image

 

 

Rozdział 5 

158 

:perltutaj 
if exist perl100.dll goto perldlltutaj 

print Nie można odnaleźć perl100.dll!

 

print *koniec* 
pause 
goto koniecperl 
:perldlltutaj 
perl.exe nazwa_pliku_wsadowego %1 %2 %3 %4 %5 %6 %7 %8 %9 
goto koniecperl 
 

@

rem '; 

Sprawdzają one, czy istnieją pliki perl.exe i perl100.dll. Jeśli nie, wyświe-
tlany jest odpowiedni komunikat o błędzie i następuje skok do etykiety 
:koniecperl. Ostatnie polecenie jest traktowane jako komentarz: 

@

rem '; 

Jeśli istnieją pliki perl.exe i perl100.dll, wówczas wykonywane jest pole-
cenie: 

perl.exe nazwa_pliku_wsadowego %1 %2 %3 %4 %5 %6 %7 %8 %9 

Nazwa_pliku_wsadowego musi być taka sama, jak nazwa pliku zawiera-
jącego to polecenie. Argumenty są przekazywane jako %1 do %9. 

Kiedy program perl.exe rozpocznie działanie, będzie przetwarzał plik 
wsadowy jako skrypt Perl. Pierwsza linia zostanie potraktowana jako 
przypisanie tablicy asocjacyjnej do zmiennej: 

@

rem = '--*-Perl-*--'; 

Następnie zinterpretowana zostanie linia: 

@

rem = ' 

Perl zacznie wówczas przeglądać plik w poszukiwaniu zamykającego 
polecenie apostrofu ('), który odnajdzie kilkanaście linii niżej: 

@

rem '; 

W procesie poszukiwania apostrofu ominięte zostaną wszystkie polece-
nia DOS. Pozostałe linie będą interpretowane jako polecenia języka Perl.