Dit artikel is eerder verschenen in 'Windows en Netwerken', editie oktober 2000

De Windows Script Host – baas boven batch

Om een systeem fatsoenlijk te kunnen beheren is het nodig om allerlei aspecten op simpele wijze te kunnen automatiseren. Systemen als Unix, VMS, MVS, OS/2, enz. hebben hier van oudsher geen problemen mee gehad, maar de Microsoft systemen hebben het moeten doen met het van DOS meegekregen Batch. Hoewel geschikt voor de wat meer simpele taken heeft Batch niet de tand des tijds weerstaan. Batch bezit een aantal belangrijke tekortkomen die in de laatste versies van Windows NT wel enigszins zijn ondervangen maar dit blijft toch een (spreekwoordelijk) doekje voor het bloeden. Batch blijft beperkt tot simpele scripts waar niet al te veel intelligentie in gebouwd hoeft te worden. Dit is jammer omdat, zeker voor beheerders scripting van onschatbare waarde is gebleken.

Microsoft heeft de toepassing van scriptalen altijd onderschat waardoor er al jaren door bedrijven of open source organisaties aan alternatieven wordt gesleuteld. Voorbeelden hiervan zijn winbatch, Perl en Kixtart. Waarom is scripting zo belangrijk zult u zeggen, je kunt toch altijd een programma schrijven? Het schrijven van programma's heeft echter een aantal nadelen : Ze zijn niet in leesbare vorm aanwezig zijn op de productie systemen zodat je ze niet op werking kunt controleren. Het langer duurt om aanpassingen door te voeren omdat de toepassingen speciaal gecompileerd moeten worden en de gebruikte programmeertaal – zoals  C++ – leent zich vaak niet optimaal voor beheerstoepassingen. Scripts daarentegen zijn direct en ter plekke aan zijn te passen, en de gebruikte scripttaal is beter geschikt voor beheerstoepassingen, zoals bijvoorbeeld het aanmaken van een netwerkdrive.

Voordelen van Scripting zijn vooral te vinden in het snel kunnen creëren en makkelijk aan kunnen passen als wel het hergebruiken van code. Toepassing hiervan vind je dan ook veel in:

  1. CGI (Webserver toepassingen): van eenvoudige kleine scripts die data verwerken of bijzonder ingewikkelde scripts zoals complete bulletin board systemen en dynamisch gegenereerde sites.
  2. loginscripting
    Het gereedmaken van clientcomputers voor gebruikt, drivemappings maken, installaties uitvoeren en andere aanpassingen aan de werkomgeving maken.
  3. systeembeheer scripts.
    Automatisch genereren van accounts, bijvoorbeeld aan de hand van de personeelsdatabase. Automatiseren van processen zoals Backups.

De laatste tijd is de houding Microsoft richting scripting van beleid veranderd,  wat geleid heeft tot de ontwikkeling van Windows Scripting Host (WSH). De basis van hiervan is terug te leiden tot Internet Explorer 3. Het gaat hier om ActiveX scripting,, een interface waarmee diverse scriptalen kunnen communiceren met applicaties. Van oorsprong was dit internet explorer waarmee vanuit een DHTML pagina code uitgevoerd kon worden in de browser van een client en later ook in Internet Information Server. De architectuur van systeem beperkte de scripts wel in hun mogelijkheden, met name omdat  internet explorer scripts maar beperkte interactie kunnen hebben met het systeem.

Om als een vervanging van Batch te kunnen dienen moesten scripts in staat zijn om ook interactiever te worden anders zijn ze nutteloos voor de toepassingen waar Batch nu juist voor bedoeld is. Door nu WSH te ontwikkelen als applicatie die activeX scripting ondersteund werd er een wereld aan mogelijkheden ontsloten voor de scriptalen die ActiveX ondersteunen. In eerste instantie begonnen als add-on applicaties zijn de scripting interfaces nu een geïntegreerd onderdeel van het operating system. De WSH komt standaard mee in alle versies van Windows 2000, Windows 98 en ME  en is ook als update voor Windows 95 en Windows NT4 gratis de dowloaden bij Microsoft.

Figuur 1: De scriptinterfaces in windows

Standaard levert microsoft twee talen die ActiveX ondersteunen, VBScript en JScript. Het is echter zonder meer mogelijk om andere talen te gebruiken, zoals bijvoorbeeld Perl, Python of Rexx.

Eén van de belangrijkste ActiveX scripting engines is VBScript. VBScript is afgeleid van Visual Basic en is in feite een soort 'baby basic'met slechts een deel van de functionaliteit van VB.  Dit heeft ook alles met  het design van ActiveX scripting  te maken. Het is ontworpen om te draaien vanuit een webbrowser en is daardoor beperkt in zijn methoden om interactie met de buitenwereld aan te gaan, het genereren van een simpel piepje uit de PC speaker kan al een behoorlijk karwei betekenen. Dat wil echter niet zeggen dat VBScript niet krachtig zou zijn, doordat in principe van alle ActiveX componenten gebruik gemaakt kan worden en door WSH beschikbaar gestelde interfaces kunnen behoorlijk geavanceerde scripts worden gegenereerd.

Het is de moeite waard om de systeem interactie die door WSH mogelijk wordt gemaakt nader te belichten. Er zijn verschillende objecten –providers – die aspecten van het systeem vertegenwoordigen.  Neem bijvoorbeeld de Active Directory Services Interface (ADSI) provider, die de verbinding met alle directory services mogelijk maakt. Dit zijn natuurlijk Microsoft's eigen Active Directory en Windows NT, maar ook Novell's NDS of Lotus Notes. Alle objecten die door deze directory services geexporteerd worden zijn te benaderen met ADSI. Denk aan accounts, mailboxen, AD details etc. Het is bijvoorbeeld prima mogelijk om met ADSI een server tot Domain Controler te promoveren. Naast de ADSI provider is ook de WMI provider erg interessant. Deze provider verzorgt de toegang tot eigenschappen van allerlei systeem objecten zoals drivers, harddisks, processen, etc. Dit is natuurlijk heel krachtig voor systems management activiteiten, en WMI wordt en zal ook steeds meer ingebouwd worden in producten zoals HP openview, Tivoli en SMS. De meest gebruikte provider echter is de standaard Script Host provider. Deze geeft toegang tot het filesysteem, register, de commandline, etc. Ook is toegang tot alle op het systeem aanwezige applicaties mogelijk, zolang deze tenminste COM-enabled zijn. Dit betreft vrijwel alle grote en veel kleinere applicaties zoals Office, Explorer, Notepad, etc. Deze applicaties zijn dan aan te roepen alsof het extensies van de WSH zijn. Een simpel voorbeeld zou kunnen zijn om een inventarisatie met WMI te maken, en Word te gebruiken om er een net document van te maken het te printen. Als de bestaande functionaliteit niet voldoende is dan kan deze onbeperkt uitgebreid worden met zelf ontwikkelde COM objecten. COM objecten zijn niet afhankelijk van programmeertaal, en kunnen zelfs met de WSH zelf gemaakt worden.

Windows Script Host bestaat in twee vormen, cscript.exe en wscript.exe. Ze zijn functioneel equivalent, maar cscript.exe is commandline georiënteerd en geeft zijn uitvoer naar een shell window, en wscript.exe geeft zijn uitvoer in popup windows. WSH scripts hebben geregistreerde extensies zoals .vbs voor VBScript, .js voor JavaScript, etc. Deze extensies zijn standaard verbonden met wscript.exe. Dus als een script wordt gestart door te dubbelklikken zal wscript.exe gebruikt worden om het script uit te voeren.

Een andere interessante functionaliteit van de WSH is de mogelijkheid om scripts te versleutelen. Dit kan prettig zijn wanneer er gevoelige informatie in een script zichtbaar is of in een klant-leverancier relatie waarbij de broncode niet wordt overgedragen. Wanneer de versleutelde code wordt uitgevoerd zal WSH de file eerst intern decoderen voordat hij aan de eigenlijke VBScript interpreter wordt aangeboden. Let wel, er is hier geen sprake van echte encryptie. Iemand met diepgaande kennis van zaken is in staat een versleuteld script te decoderen.

Om de kracht van scripting te demonstreren zullen we U een aantal voorbeelden laten zien wat sleutelelementen van scripting inzichtelijk maakt. In figuur 2 ziet u een eenvoudig loginscript wat een aantal netwerkverbindingen aanlegt en controleert of deze zijn gelukt. Een aantal belangrijke elementen komt hier gelijk naar voren die het verschil tussen WSH en Batch gelijk duidelijk maken. We zien het gebruik van een subroutine, het creëren van een object en de afhandeling van mogelijke fouten. Dit zijn nu precies een aantal beperkingen waar een batchprogrammeur tegen aanloopt.

    Const ERR_DRIVE_IN_USE = -2147024811`

    'We gaan nu een aantal netwerkverbindingen maken waarbij we een subroutine inschakelen
    Maakschijf  "H:", "
    \\Server01\Applicaties"
    Maakschijf  "I:", "
    \\Server01\Data"

    'De nu volgende subroutine maakt de netwerkverbinding aan
    Sub Maakschijf (Schijf,Pad)

    'Hieronder creeeren we het object wat we nodig hebben voor netwerktoegang.
    Dim Netwerk,, bericht, shell
    Set Netwerk = wscript.Createobject("wscript.network")

    'Neem de foutcontrole over
    On error resume next

    Netwerk.mapnetworkdrive schijf, pad
    If Err.number <> 0 then
      If Err.Number = ERR_DRIVE_IN_USE Then
      Bericht = "Schijf"& Schijf & " " & "kon niet verbinden met " & Pad & " omdat er al een verbinding was"
    Else
      Bericht = "Schijf"& Schijf & " " & "kon niet verbinden met " & Pad & " vanwege fout: " & Err.Description
    End if
    Set shell = wscript.createobject ("Wscript.shell")
    Shell.popup Bericht
    End if
    End sub

figuur 2, login.vbs

Een andere interessante toepassing van WSH is het inschakelen van een applicatie. Het script in figuur 3 controleert een aantal servers op openstaande shares en plaatst deze in een excelsheet.

In het script benaderen we via ADSI een server en vragen de shareinformatie op, vervolgens plaatsen we dit in een door ons geopend excel werkboek wn maken deze als laatste zichtbaar voor de gebruiker.

    Dim Args,Row,Column,oShare,share

    'Lees de commandline op servernaam/domeinnaam
    Set Args = WScript.Arguments
    if Args.count = 1 then
      sServer=Args(0)
    else
    wscript.quit
    end if

    'Foutencontrole overnemen
    On Error Resume Next

    'Creeer een excelobject
    Set objXL = WScript.CreateObject("Excel.Application")
    Row=1
    Column=1

    'We openen een werkboek en gaan er data in plaatsen
    objXL.Workbooks.Add
    objXL.Cells(Row,Column).Value = "Resultaat van server "
    wscript.echo "Controleer " & sServer & " op shares."

    'We gaan nu data ophalen om in het werkboek te kunnen plaatsen
    set oShare= GetOBJect("WinNT://" & sServer &"/lanmanserver")
    if Err.Number <> 0 then
      wscript.echo "Er ging iets fout, de melding was: " & Err.Description
    end if
    Row = Row+1
        ' Write the share information to Excel
        For each share in oShare
           objXL.Cells(Row,Column).Value = Server
           objXL.Cells(Row,Column+1).Value = share.path
           objXL.Cells(Row,Column+2).Value = share.name
           objXL.Cells(Row,Column+3).Value = share.description
           Row=Row+1
        Next
    wscript.echo("Klaar met zoeken. Het resultaat wordt nu getoond")

    'Als laatsten laten we het resultaat zien.
    objXL.Visible = True

Figuur 3, try_excel.vbs

Als laatste voorbeeld van de flexibiliteit van het WSH model: een script geschreven in de uit de UNIX-wereld afkomstige scripttaal Python. Python begint in de Windows wereld nu ook enige bekendheid te genieten. Python heeft als programmeertaal grote voordelen; het is volledig object georienteerd en is geschikt voor grotere projecten. Python moet apart geïnstalleerd worden, want het wordt niet door Microsoft gemaakt of ondersteund.  Figuur 4 illustreert een subroutine WieBenIk, dat gebruik maakt van de Script Host om de naam van de huidige gebruiker en diens computer te achterhalen.

    # whoami.pys: Wie ben ik, en waar?

    def WieBenIk():
     Netwerk = WScript.CreateObject("Wscript.Network")
     WScript.Echo ("U bent ", Netwerk.UserName, ", aangelogd op ", Netwerk.Computername)

    WieBenIk()

figuur 4, whoami.pys

De WSH is zeer uitgebreid toepasbaar, maar heeft zijn grenzen. De talen die beschikbaar zijn voor de WSH zijn in het algemeen niet gecompileerd (d.w.z. in machinetaal omgezet), maar geïnterpreteerd. Dat maakt ze ongeschikt voor processorintensieve taken zoals uitgebreide berekeningen. De standaard talen VBScript en JScript lenen zich ook niet voor grote programma's door het gebrek aan sterke variabele types, beperkte debugmogelijkheden, moeizame file-include etc.

Bij het werken met scripts in de praktijk komen een aantal hulpmiddelen goed van pas. Voor het maken van kleine scripts is het vertrouwde Notepad zonder meer geschikt. Er zijn echter een aantal editors te verkrijgen die het schrijven van scripts makkelijker maken doordat ze extra functionaliteit bieden. Een belangrijk aspect is het zogenaamde 'syntax highlighting', ook bekend van Visual Studio. Hierbij krijgen de diverse elementen in het script, zoals variabelen, strings, constanten, gereserveerde woorden, enz., een andere kleur. Dit vergroot de overzichtelijkheid waardoor het eenvoudiger wordt om fouten op te sporen. Andere extra's zijn automatisch inspringen waar nodig, ingebouwde taal referenties etc. Uiteraard is Visual Studio te gebruiken voor het schrijven van scripts, maar is wellicht een paardenmiddel. Een kleine, maar handige editor is textpad, die 'syntax highlighting' ondersteunt. Een integrale ontwikkelomgeving speciaal voor scripts in allerlei talen is PrimalScript. Deze heeft bijvoorbeeld een ingebouwde OLE-browser, standaard voorbeelden in allerlei talen, veel documentatie, etc.

Ondanks de beperkingen van WSH is het een uitermate krachtig middel voor het automatiseren van beheerstaken maar ook voor de ontwikkeling van kleine toepassingen, door de uitgebreide set aan interfaces zijn er eigenlijk weinig beperkingen die gesteld worden aan de mogelijkheden. Stap dus in de wereld van scripting, slechts je eigen verbeelding is je beperking!

Resources:

 

W. Kasdorp is als consultant werkzaam bij CMG Finance B.V. (E-mail: willem.kasdorp@cmg.nl)

W. Verveen is verbonden aan Highway Back-office Consulting een werkmaatschappij van de Ormer groep die gespecialiseerde ondersteuning biedt voor Windows NT en back-office applicaties, daarnaast beheert hij Win2K Wereld
E-mail: w.verveen@ormer.nl
Web: http://www.boc.highway.nl en http://www.win2kwereld.nl