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
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.
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
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
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.
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ć
Zaawansowane konfigurowanie TCP/IP przy pomocy Rejestru i języka Perl
141
z
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:
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.
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
.
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
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
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
{
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);}
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
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 );
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 );
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
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 ) =
@
_;
$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’,
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 )
{
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 ) =
@
_;
$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ę
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.
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.
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
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.