Automat doskonały

O mechanizmie Windows Scripting Host pisaliśmy już w CHIP-ie wielokrotnie. Choć WSH może przysporzyć kłopotów (wiele robaków internetowych wykorzystuje engine skryptowy Okienek), to oddaje on nieocenione usługi zarówno administratorom serwerów Windows NT/2000/2003, jak i użytkownikom domowych czy biurowych pecetów.

Niniejszy artykuł jest próbą analizy ciekawych zastosowań WSH. Nie będziemy się w związku z tym zajmowali typowymi czynnościami administracyjnymi, takimi jak usuwanie plików z folderów tymczasowych czy automatyzacja działania aplikacji. W zamian zainteresujemy się specyficznymi możliwościami WSH w środowisku Windows XP oraz nietypowymi i nieco bardziej zaawansowanymi przykładami użycia skryptów systemowych (np. wykorzystaniem tematów Pulpitu Windows XP lub XML-owym formatem zapisu skryptów WSH). Skoncentrujemy się przy tym głównie (choć nie tylko) na charakterystycznych cechach wersji 5.6 mechanizmu skryptowego Microsoftu, użytego po raz pierwszy w Windows XP. Nie zwracamy przy tym większej uwagi na to, czy używany jest VBScript czy JScript – wychodzimy z założenia, że Czytelnik artykułu zna przynajmniej pobieżnie oba języki. W niektórych przypadkach zakładamy również (zupełnie) podstawową znajomość XML-a i technik programowania obiektowego. Jesteśmy przy tym przekonani, że poruszone zagadnienia okażą się przydatne w codziennej pracy naszych Czytelników.

Co nowego w WSH 5.6?

Edycję 5.6 Windows Scripting Host wprowadzono w Okienkach serii XP. Nie znaczy to jednak, że nie można ich używać w pozostałych wersjach Windows – wystarczy pobrać odpowiedni pakiet dla danej edycji Okienek ze strony msdn.microsoft.com/scripting. O tym, że warto to zrobić, przekona najlepiej krótki opis nowych możliwości kolejnego z rzędu engine’u skryptowego Microsoftu.

Jednym z ważniejszych ulepszeń w WSH 5.6 jest obsługa certyfikatów cyfrowych i funkcja ich weryfikacji w skryptach. Administrator maszyny może zdefiniować listę zaufanych źródeł skryptów i nakazać systemowi weryfikację cyfrowego podpisu w każdym uruchamianym pliku VBS czy JS. Dzięki temu zyskujemy relatywnie skuteczne narzędzie zapobiegania rozprzestrzenianiu się robaków internetowych. Reguły wykonywania skryptów kontrolujemy z użyciem znanych każdemu administratorowi zasad grup i zasad systemowych. Certyfikatami zarządzamy natomiast za pomocą przystawki Certyfikaty Konsoli zarządzania (MMC).

Administratorom większych sieci przydaje się inna nowość WSH 5.6, a mianowicie możliwość uruchamiania lokalnych skryptów na zdalnej maszynie (Remote Script Execution). Rzecz jasna, komputer, na którym chcemy uruchomić skrypt, musi być wcześniej tak skonfigurowany, aby umożliwić nam tę operację.

Kolejne usprawnienie to nowy, XML-owy format plików źródłowych ze skryptami WSH (.WSF). Pozwala on m.in. na łączenie programów w różnych językach w jednym skrypcie i importowanie zawartości zewnętrznych zbiorów do kodu skryptu. Dodatkowy plus korzystania z tego formatu to stosunkowo łatwe parsowanie plików ze skryptami.

Importowanie zewnętrznych plików

Ani VBScript, ani JScript, używane w tradycyjnych (tzn. nie-XML-owych) plikach ze skryptami WSH, nie oferują prostej metody importowania zawartości zewnętrznych skryptów – właściwość ta jest znana chociażby z HTML-a (

< SCRIPT src=”nazwa_pliku”>

). Aby osiągnąć taki efekt, musimy albo użyć skryptu w formacie WSF (patrz: następny akapit tego arytkułu), albo uciec się do prostej sztuczki, polegającej na utworzeniu własnej funkcji importującej fragment kodu do bieżącego skryptu:

Function Include(vbsFile)
Set fso = CreateObject
(“Scripting.FileSystemObject”)
Set f = fso.OpenTextFile(vbsFile)
s = f.ReadAll()
f.Close
ExecuteGlobal s
End Function

Funkcja odczytuje zawartość pliku vbsFile i dodaje ją do globalnej przestrzeni nazw skryptu (

ExecuteGlobal

). Jeśli chcemy, aby importowany skrypt miał dostęp tylko do zmiennych lokalnych (w tym przypadku w procedurze Include), należy użyć rozkazu Execute zamiast ExecuteGlobal.

W języku JScript opisywana funkcja będzie miała nieco inną postać, gdyż javascriptowa funkcja eval odpowiada w przybliżeniu funkcji Execute VBScriptu. Dlatego musimy się posłużyć procedurą w rodzaju:

function Include(jsFile) {
fso = new ActiveXObject
(“Scripting.FileSystemObject”);
f = fso.OpenTextFile(jsFile);
s = f.ReadAll();
f.Close();
return s;
}

Funkcja zwraca łańcuch tekstowy, będący zawartością pliku jsFile. W miejscu, w którym ma się znaleźć importowany kod, wpisujemy więc wywołanie naszej funkcji w postaci:

eval(Include(‘myfile.js’))

;.

Więcej:bezcatnews