nms.jpg
Celem prezentacji jest przedstawienie technik skryptowych i przekrój możliwości, jakie daje wbudowany w systemy Windows mechanizm Widows Scripting Host. Liczne przykłady powinny zainteresować zarówno osoby znające WSH słabo, jak i te, które miały z tym już do czynienia więcej.
Poniższy tekst jest uzupełnieniem do prezentowanych slajdów. Nie jest oddzielnym artykułem i nie nie odpowiada pełnej prezentowanej treści. Dodatkowe informacje, więcej linków, oraz pełny przegląd znajduje się w pliku prezentacji.

Informacje Ogólne

WSH jest mechanizmem umożliwiającym pisać zaawansowane skrypty dla systemów Windows. Jest jednym z podstawych narzędzi każdego administratora. Pozwala na automatyzację codziennie wykonywanych prac, tworzenie skryptów do przetwarzania hurtowego (bulk processing) – np. masowe zakładanie kont w domenie (ADSI), szczegółowe odpytywanie systemu (raportowanie) i tworzenie alertów (WMI). Ogólnie mówiąc jest wspaniałym środkiem do tworzenia własnych narzędzi w stosunkowo prosty sposób.
WSH jako takie nie jest językiem programowania – każdy może wybrać taki język skryptowy, jaki lubi najbardziej. Standardowo w systemie są komponenty potrafiące interpretować JavaScript oraz VBScript, ale po doinstalowaniu odpowiedniej biblioteki może to być również python, perl lub inny język skryptowy. Znaczenie 'WSH jest łatwe’ będzie więc zależne od wyboru języka i na pewno wymaga od piszącego znajomości co najmniej podstaw programowania. Wybierając język należy się również zastanowić nad repozytorium przykładów. W internecie można znaleść tysiące gotowowych skryptów, które po łatwo dostostosować do swoich potrzeb – większość z nich jest jednak pisanych w VBS. Teoretycznie przepisanie na inny język nie stanowi wielkiego problemu, wymaga jednak dużo lepszej biegłości od piszącego.

Podstawową wadą jest brak inteface’u, dającego możliwość interakcji z użytkownikiem inaczej niż za pomocą konsoli. Problem ten da się poniekąd ominąć [co będzie zaprezentowane później], ponadto VBS jako jedyny posiada prymitywne funkcje pozwalające na zbudowanie prostego interface’u – są one jednak niedostępne w żadnym innym języku.
Należy też zaznaczyć, że teoretycznie za pomocą WSH da się napisać niemal wszystko – jednak jest to mechanizm mało wydajny przy bardziej złożonych operacjach, ponieważ korzysta z wielu róznych komponentów. Jego prostota może stać się wadą przy bardziej złożonych problemach – z powodu ograniczeń języków skryptowych.

Budowa WSH

WSH potrafi interpretować różne języki, ponieważ cały mechanizm opiera się na wykorzystaniu obiektów COM/DCOM zarejestrowanych w systemie. Cały system Windows, można w przybliżeniu wyobrazić sobie jako setki binarnych komponentów, powiązanych ze sobą wzajemnymi relacjami. Obiekty te znane są pod różnymi nazwami, jako że ewoluowały wraz z kolejnymi wersjami systemamu. Ogólnie są to obiekty Common Object Model (COM), wersja COM+ oraz Distributed COM, które wyewoluowały z technologii OLE (Object Linking and Embedding), a ich najbardziej znane podzbiory to OLEDB, ADODB, ActiveX, DirectX etc.

Obsługiwane rodzaje plików

WSH obsługuje pliki z rozszeżeniem vbs oraz js na tej podstawie stwierdzając, którego użyć parsera. Pliki można zakodować dość prymitywnym, odwracalnym algorytmem, aby ukryć kod programu. Pliki takie mają rozszeżenia vbe (zakodowany vbs) oraz jse (zakodowany js).
Aby ustawić parametry uruchomienia dla WSH, można stworzyć wplik o takim właśnie rozszeżeniu, będący odpowiednikiem pliku pif dla programów.
Bardzo ciekawą funkcją jest możliwość tworzenia plików w XMLu, pozwalająca tworzyć uniwersalne biblioteki poprzez możliwość include’owania plików. Dzięki temu, można również łączyć pliki napisane w różnych językach. Plik definicji ma wtedy rozszeżenie wsf.
Skrypt może również być zarejestrowany w systemie jako komponent COM (tzw. scriptlet) – ma on wtedy rozszeżenie wsc.

DEMO

WSH ma dwa tryby działania, które różnią się standardowym strumieniem wyjścia. WScript – który pokazuje wyniki jako messageBox, oraz CScript, który wyświetla komunikaty na konsoli. Więcej informacji w tym atykule.

skrypty 'helloWorld' napisane w VBS i JS pokazujące możliwość wykorzystania róznych języków i różnice składni:

prosty plik wsf pokazujący strukturę XML pozwalająca na tworzenie bibliotek:

  • mylib.vbs prosty plik definiujący dwie zmienne
  • testJob.wsf plik XML includujący vbs. defaultowo wykonane zostanie pierwsze zadanie. Jeśli uruchomi się z parametrem //job:JOB_NAME wykonane zostanie zdefiniowane zadanie. W tym przypadku uruchomienie bez parametry lub 'testJob.wsf //job:first' powinno wyświetlić text 'jakiś text', uruchomienie 'testJob.wsf //job:second' powinno wyświetlić text 'inny text'.

enkrypcja/dekrypcja:

WSH Object Model

Ciężko powiedzieć czy skrypty WSH mają budowę obiektową czy strukturalną, ponieważ jest to mieszanka różnych mechanizmów. WSH, sam w sobie, ma budowę obiektową. Ponieważ jednak sam skrypt może być napisany w różnym języku – wygląda to dość dziwnie i wprowadza trochę zamieszania podaczas początkowej fazy nauki.
Cały model obiektowy WSH można obejrzeć np. na stronach Microsoftu. Jak widać mechanizm ten daje podstawową funkcjonalość przydatną zwłaszcza przy tworzeniu loginskryptów – mapowanie dysków sieciowych, uruchamianie aplikacji, tworzenie skrótów etc. Posiada również obiekt 'WshController’ pozwalający na utworznie instancji sktyptu na zdalnej maszynie.

  • testSendKeys.vbs – prosty skrypt pokazujący metodę 'run' oraz 'sendKeys'. Otwiera okno notepada, wpisuje do niego text, następnie otwiera okno cmd i wypisuje komendę formatującą dysk – należy więc uważać przy uruchomieniu, aby sobie nie sformatować dysku!
  • nroot dTools.vbs – przykład zastosowania metody 'run'
  • mapGDrive.vbs – przykładowy skrypt mapujący dysk sieciowy
  • enumDrives.vbs – zastosowanie metod 'enumNetworkDrives' oraz 'enumNetworkPrinters' listując zmapowane dyski i drukarki.

wykorzystanie ActiveX

Wykorzystanie obiektów ActiveX w skrypcie jest teoretycznie możliwe, ale nie jest proste. Narzędziem służącym do wyświetlenia dostępnych obiektów jest OleView, będące częścią resourceKit’a oraz instalowane wraz z wieloma narzędziami developerskimi. Jest ono jednak bardzo trudne do odczytania dla osób nie będących developerami.

oleview1.jpg

Prezentowany przykład pokazuje wykorzystanie obiektu CommonDialog dostępnego w systemie. Biblioteka ta wymaga jednak licencji, która jest instalowana wraz z niektórymi aplikacjami developerskimi, stąd, aby się upewnić, że skrypt uruchmi się na kązdym komputerze, najpierw dodawany jest klucz licencji:

działanie tego rodzaju nie jest zgodne z licencją. Przy wykorzystaniu komponentów na stronach ASP można skorzystać z licencji na stronach Microsoft, jednak przy skryptach commandlineowych jest to jedyny sposób ominięcia problemu.

Poniższy rysunek pokazuje jak w oleview można odczytać dodatkowe parametry z TypeLibraries dla konkretnej klasy:

oleview2.jpg

ADSI, WMI, ADODB

Dalsza część prezentacji jest niemal w całości oparta na wcześniejszych artykułach:

-o((:: sprEad the l0ve ::))o-