Alessandro Marchisio - gennaio 2005 Window Scripting Host • Contenitore per eseguire script in vb o js come semplici file batch (file .js e .vbs) • Stesse potenzialità degli activeX • Può essere eseguito da una finestra di windows (Wscript.exe) o da riga di comando (Cscript.exe) • L’estensione js o vbs richiama il corretto interprete Alessandro Marchisio - gennaio 2005 Window Scripting Host: js • Sintassi javascript • Metodi e funzioni devono essere chiamati con () • Per iterare su collezioni utilizzare un'istanza dell'oggetto Enumerator( collezione ) con i metodi moveFirst(), MoveNext(), item() e AtEnd() • Ricordarsi che il caratere "\" deve essere scritto "\\" function ShowFolders() { fso = WScript.CreateObject("Scripting.FileSystemObject"); e = new Enumerator( fso.getFolder("c:\\").subFolders ); for (; !e.atEnd(); e.moveNext()) WScript.stdOut.writeline( e.item().Name) } Alessandro Marchisio - gennaio 2005 WSH: oggetti predefiniti • WScript è la base o metodo createObject( nomeoggetto ) può creare oggetti come WShell e Network • WshShell o o o gestione chiavi registri, msg popup esegue programmi o accedere a dischi e stampanti di rete • WshNetwork Alessandro Marchisio - gennaio 2005 Wscript.echo • WScript.echo(“stringa da visualizzare”) se lo script è runnato da riga di comando produce una riga o se è richiamato con wscript produce una finestra di dialogo o Alessandro Marchisio - gennaio 2005 WScript.sleep() • WScript.sleep( tempoMsec ) o o blocca l’esecuzione del programma tempoMsec è il tempo espresso in millisecondi o termina in qualsiasi caso il programma dopo temposec secondi • WScript.timeout = temposec Alessandro Marchisio - gennaio 2005 WScript.quit() • WScript.quit( ) termina l’esecuzione del programma è possibile inserire un numero come argomento del metodo o Tale numero sarà restituito alla variabile d’ambiente %errorlevel% o o Alessandro Marchisio - gennaio 2005 WScript.stdOut • Write( stringa ) • writeLine( stringaACapo ) • writeBlankLines( numRigheVuote ) • writeLn() è simile a echo; • E’ possibile andare a capo utilizzando “\n” Quest’oggetto è disponibile solo da riga di comando Alessandro Marchisio - gennaio 2005 WScript.stdIn • read( num caratteri ) • readLine() //fino a ENTER • readAll() //utilizzato con cmd batch WScript.stdOut.writeBlankLines(5) WScript.stdOut.write("Come ti chiami? ") nome = WScript.stdIn.readLine() WScript.stdOut.writeLine("\nHai inserito: " + nome) • skip( num caratteri ) //tralascia • skipLine() • atEndOfFile() atEndOfStream() Alessandro Marchisio - gennaio 2005 WSH environment (ambiente) • • • • • • • ScriptFullName ScriptName Version Build Name FullName Path if (WScript.FullName.indexOf("wscript") != -1) WScript.echo("sto girando da wscript") else WScript.echo("sto girando da cscript") Alessandro Marchisio - gennaio 2005 WHS parametri da riga di comando • WScript.arguments o è la collezione che indica i parametri passati da riga di comando WScript.arguments.length indica il numero dei parametri o WScript.arguments.item( i ) accede all’ i-esimo elemento Gli item si contano sempre a partire da 0 a collezione.length-1 o Alessandro Marchisio - gennaio 2005 Collezione Named • È utilizzata per un semplice parsing di una stringa tipo: (obbligatorio slash e due pti) /sw1:valore /sw2:valore ecc. param = WScript.arguments.named if ( param.exists("velocita") ) WScript.echo("Velocita: " + param.item("velocita")) else WScript.echo("parametro velocita non inserito!") Alessandro Marchisio - gennaio 2005 Wshell: CreateShortcut • Wshell è un oggetto figlio di WScript • createShortcut è un metodo di un oggetto di classe Wshell che permette la creazione di collegamenti. // creazione istanza di oggetto shell WS = WScript.createObject("WScript.Shell") DesktopFolder = WS.specialFolders("SendTo") pathFileColleg = DesktopFolder + "\\Calcolatrice.lnk" //Creazione collegamento collegamento = WS.createShortcut(pathFileColleg) //Arguments,Description,FullName,Hotkey,IconLocation, //TargetPath,windowStyle,workingDirectory (proprietà) collegamento.targetPath = “c:\winnt\system32\calc.exe” collegamento.HotKey = "Ctrl+Shift+c" collegamento.save() Alessandro Marchisio - gennaio 2005 Wshell:Esecuzione eseguibili • Oggetto shell: objShell = WScript.CreateObject("Wscript.Shell") programma= ”winver.exe” modFinestra = 3 aspettaFine = false objShell.run(programma,modFinestra,aspettaFine) modalità finestra puo avere valori da 0 a 10 (massimizzata, minimizzata, con fuoco senza fuoco,ecc.) Il terzo parametro indica se l’esecuzione dello script deve aspettare la terminazione del programma lanciato o se debba proseguire in modo sincrono Alessandro Marchisio - gennaio 2005 Wshell: specialFolder • Metodo che trasforma un percorso "logico" in uno assoluto • percorsi logici: o AllUsersDesktop, AllUsersStartMenu, AllUsersPrograms, AllUsersStartup o Desktop, Favorites, Fonts, MyDocuments, NetHood, PrintHood, Recent, SendTo o StartMenu, Startup, Templates WSh = WScript.createObject("WScript.Shell") WScript.stdOut.write( WSh.specialFolders("MyDocuments") ) Alessandro Marchisio - gennaio 2005 Wshell: variabili %ambiente% • 4 ambienti: USER, SYSTEM, VOLATILE, PROCESS • shell.Environment("ambiente") restituisce una collezione di variabili • La collezione Process contiene tutte le variabili d'ambiente per il processo • Shell.ExpandEnvironmentStrings("stringa con %var%") WSh = WScript.createObject("WScript.Shell") ambiente = WSh.Environment("System") WScript.stdOut.write( ambiente("path") ) ambiente("path") += ";c:\\wsh;" Alessandro Marchisio - gennaio 2005 Wshell: Gestione Registri • shell.RegRead("entry") • shell.RegWrite("entry", valore, "tipo") key = "HKLM\\Software\\Microsoft\\" key += "Windows NT\\CurrentVersion\\CurrentVersion" sh = WScript.createObject("WScript.Shell") WScript.stdOut.writeLine( sh.regRead(key) ) key = "HKLM\\Software\\Microsoft\\" key += "Windows NT\\CurrentVersion\\RegisteredOwner" sh.regWrite(key,"Nuovo proprietario","REG_SZ") HKEY_CURRENT_USER= HKCU HKEY_LOCAL_MACHINE= HKLM HKEY_CLASSES_ROOT=HKCR Alessandro Marchisio - gennaio 2005 Wshell: Visualizzatore Eventi • shell.logEvent( tipo,"descrizione") • Scrive eventi di tipo applicazione. Tipo: 0=Success 1=Error 2=Warning 4=Information 8=AuditSucces 16=AuditFailure objShell = WScript.CreateObject("Wscript.Shell") objShell.LogEvent( 0,"Test Success Event") objShell.LogEvent( 1,"Test Error Event") objShell.LogEvent( 2,"Test Warning Event") objShell.LogEvent( 4, "Test Information Event") objShell.LogEvent( 8, "Test Success Audit Event") objShell.LogEvent( 16, "Test Failure Audit Event") Alessandro Marchisio - gennaio 2005 Wshell: SendKeys • shell.sendkeys( stringa ) • L'applicazione deve avere il fuoco • E' possibile inviare combinazioni di tasti • ALT: % CTRL: ^ Shift: + • {UP} {HOME} {BS}…{F1} INVIO: ~ • shell.appActivate("titoloFinestra") WScript.timeout = 4 sh = WScript.CreateObject("WScript.Shell") sh.Run("Notepad.exe") for (ok = 0; !ok; ) ok = sh.appActivate("Blocco note") sh.sendKeys("Ciao~Ciao%fs") Alessandro Marchisio - gennaio 2005 Wshell: currentDirectory • shell.currentDirectory • Accessibile in lettura e in scrittura • Cambia la directory per la durata del processo sh = WScript.CreateObject("WScript.Shell") out = WScript.stdOut out.writeLine("Directory di partenza: " + sh.currentDirectory) sh.currentDirectory = "I:\\" out.writeLine("Directory attuale: " + sh.currentDirectory) Alessandro Marchisio - gennaio 2005 Wshell: popup • WScript.echo("stringa") non è configurabile • shell.popUp("stringa",timeout, titolo, icone+pulsanti ) • Icone: stop(16) ? (32) ! (48) i (64) • Pulsanti: Ok (0), Ok/Canc (1), Yes/No(4) Abort/Retry/Ignore(2), Yes/No/Cancel (3) retry/cancel (5) sh = WScript.CreateObject("WScript.Shell") out = WScript.stdOut sh.popup("Tra poco scompare\nAffrettati a rispondere",5,"Esempio",48 + 4) out.writeLine("Programma terminato") Alessandro Marchisio - gennaio 2005 Network Drive • mapNetworkDrive(localName,RemoteName, updateProfile, username, password) • removeNetworkDrive( localName, flagSave, flagProfile ) • EnumNetworkDrives() restituisce una collezione con localName, remoteName nwk = WScript.CreateObject("WScript.Network") nwk.mapNetworkDrive("X:", "\\\\lucag\\download",0) Drives = nwk.EnumNetworkDrives() for( i = 0; i < Drives.length; i+=2) WScript.Echo( Drives.Item(i) + "\t" + Drives.Item(i+1) ) nwk.removeNetworkDrive("X:") Alessandro Marchisio - gennaio 2005 Network Printers • AddWindowsPrinterConnection(Risorsa Unc) AddPrinterConnection(localPort, RisorsaUnc) • removePrinterConnection(RisorsaUnc, flagforced, flagProfile ) • EnumPrinterConnections() restituisce una collezione con localName/port e UNCprinter • SetDefaultPrinter(Risorsa Unc) nwk = WScript.CreateObject("WScript.Network") nwk.addPrinterConnection("LPT1:","\\\\marco\\hp2300") //equivale a net use LPT1: \\marco\hp2300 Alessandro Marchisio - gennaio 2005 Network properties • CompterName • UserDomain • Username sola lettura maggiori informazioni di possono ottenere con il protocollo LDAP su ADSI function whoami() { var nwk = WScript.CreateObject("WScript.Network") var out = WScript.stdOut out.writeLine("ComputerName:" + nwk.computerName) out.writeLine("Userdomain:" + nwk.userDomain) out.writeLine("UserName:" + nwk.userName) } whoami() Alessandro Marchisio - gennaio 2005 File System Object: Drives • objFSO = WScript.CreateObject("Scripting.FileSystemObject") • collDrives= objFSO.Drives • DriveObj = objFSO.GetDrive("c:") • DriveObj ha le seguenti proprietà: AvailableSpace, DriveLetter, FileSystem, IsReady, Path, RootFolder, SerialNumber, ShareName, TotalSize, VolumeName, DriveType Alessandro Marchisio - gennaio 2005 File System Object: Folder • objFSO = WScript.CreateObject("Scripting.FileSystemObject") • objFold = objFSO.getFolder(path) • objFold ha le seguenti proprietà: DateCreated, DateLastAccessed, DateLastModified, Drive, IsRootFolder, Name, ParentFolder, Path, ShortName, ShortPath, Size, Type • objFold ha due collezioni: Files e SubFolders Alessandro Marchisio - gennaio 2005 File System Object: Folder • objFSO = WScript.CreateObject("Scripting.FileSystemObject") • objFSO.CreateFolder(pathNewFolder) o se esiste già da errore • objFSO.DeleteFolder(pathNewFolder) • objFSO.CopyFolder(pathSourceFolder, pathDestFolder,flagOverWrite) - xcopy /x • objFSO.MoveFolder(pathSourceFolder, pathDestFolder) o serve anche per rinominare cartelle. Alessandro Marchisio - gennaio 2005 File System Object: File • objFSO = WScript.CreateObject("Scripting.FileSystemObject") • FileObj = objFSO.GetFile(pathFile) • flag = objFSO.FileExists(pathFile) • FileObj.Attributes 1=ReadOnly 2=Hidden 4=System 32=Archive 64=Link 2048=Compresso • Metodi: GetAbsolutePathName, GetParentFolderName, GetFileName, GetBaseName, GetExtensionName, GetFileVersion Alessandro Marchisio - gennaio 2005 File System Object: Writing File • objFSO = WScript.CreateObject("Scripting.FileSystemObject") • FileObj = objFSO.OpenTextFile(pathFile, writeAppend, Scrivi, fmt) write=2 Append=8 scriviFlag=true, crea se non esiste, 0ascii/-1Unicode • FileObj.write("stringa") • FileObj.writeLine("stringa") • FileObj.writeBlankLines(num) • FileObj.close() Alessandro Marchisio - gennaio 2005 File System Object: Reading File • objFSO = WScript.CreateObject("Scripting.FileSystemObject") • Legge solo file Ascii e solo dall'inizio alla fine • Un file aperto in lettura non può essere scritto • Problemi leggendo un file di lunghezza 0, meglio controllare la proprietà size • FileObj = objFSO.OpenTextFile(pathNameFile,1) • FileObj. Read(numCar) .readline() .readAll() skip(), skipLine() • AtEndOfStream Alessandro Marchisio - gennaio 2005 wshController • Permette di eseguire script locali su una macchina remoto • createScript(percorsoScript, computer) • Lo script creato ha metodi execute e proprietà status (0=run,1=runnig,2=end) • Questi script non devono essere interattivi • Metodo ConnectObject(oggetto, "nome") richiama nome_start, nome_error, nome_end Alessandro Marchisio - gennaio 2005 Script sicuri • HKEY_LOCAL_MACHINE\Software\Microsoft \Windows Script Host\Settings\TrustPolicy o o o 0: tutti gli script possono essere eseguiti 1: messaggio di warning 2: solo script "signed" SignObj=WScript.CreateObject("Scripting.Signer") SignObj.SignFile( nomeFile, nomeCertificato ) SignObj.verifyFile( nomeFile, flagShowWarning ) //true-false