Sei sulla pagina 1di 162

I LIBRIdi

UN RIFERIMENTO PRATICO PER AUTOMATIZZARE TUTTE LE OPERAZIONI SUL TUO SISTEMA OPERATIVO

60 SCRIPT AMMINISTRATIVI
per Windows
Francesco Lippo

i libri di

60 SCRIPT AMMINISTRATIVI
Francesco Lippo

per Windows

Indice

60 SCRIPT AMMINISTRATIVI

per Windows

INDICE
Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 Cercare un file su pi server . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 Estrarre informazioni da un log . . . . . . . . . . . . . . . . . . . . . . . . . .7 Eliminare le condivisioni nascoste . . . . . . . . . . . . . . . . . . . . . . . .9 Check drive space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 Controllo hotfix su pi server . . . . . . . . . . . . . . . . . . . . . . . . . .14 Ricercare una determinata patch su pi computer . . . . . . . . . . .16 Controllo dei file modificati . . . . . . . . . . . . . . . . . . . . . . . . . . .18 Copia di una cartella su pi server . . . . . . . . . . . . . . . . . . . . . .21 Creare file di log in base alla data . . . . . . . . . . . . . . . . . . . . . . .23 Cancellare file in base alla data . . . . . . . . . . . . . . . . . . . . . . . .24 Cancellare tutte le cartelle tranne le ultime 3 . . . . . . . . . . . . . .26 Controllo del numero distanze di un processo . . . . . . . . . . . . .28 Monitoring degli utenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 Monitoring dei gruppi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33 Monitoring della creazione/cancellazione di file . . . . . . . . . . . .35 Monitoring dei servizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38 Monitoring delle Server Connection . . . . . . . . . . . . . . . . . . . . .41 Monitoring delle condivisioni . . . . . . . . . . . . . . . . . . . . . . . . . .43 Elencare le condivisioni di pi server . . . . . . . . . . . . . . . . . . . . .45 Salvare lelenco delle condivisioni . . . . . . . . . . . . . . . . . . . . . . .47 Eseguire il ping verso un host con e senza WMI . . . . . . . . . . . . .50 Creare un report delle corrispondenze Server Indirizzo IP . . . .52 Creare un report delle corrispondenze Server MAC Address . .55 Ricercare una particolare applicazione DCOM . . . . . . . . . . . . . .58 Inviare una mail con e senza parametri . . . . . . . . . . . . . . . . . . .60 Intercettare levento SHUTDOWN . . . . . . . . . . . . . . . . . . . . . . .64 SQL Server Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .65 DBF Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67 Impostare lexpiration date su un gruppo di utenti . . . . . . . . . .69
I libri di ioPROGRAMMO/100 script amministrativi per Windows

60 SCRIPT AMMINISTRATIVI

per Windows

Indice

Verificare se un giorno equivale ad un weekend . . . . . . . . . . . .71 Elencare gli utenti di un gruppo locale specificato . . . . . . . . . . .73 Leggere una chiave del Registry sul sistema locale . . . . . . . . . .75 Leggere una chiave del Registry su un sistema remoto . . . . . . .76 Disabilitare le Administrative Shares . . . . . . . . . . . . . . . . . . . . .79 Leggere un file INI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82 Scrivere in un file INI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85 Ricercare e disinstallare un programma . . . . . . . . . . . . . . . . . .89 Comparare due file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91 Ricercare una stringa allinterno di una cartella . . . . . . . . . . . . .93 Informazioni sugli attributi di un file . . . . . . . . . . . . . . . . . . . . .96 Avviare uninstallazione remota . . . . . . . . . . . . . . . . . . . . . . . .99 Rinominare tutti i file di una cartella . . . . . . . . . . . . . . . . . . . .102 Rinominare/Spostare una cartella su pi server . . . . . . . . . . . .104 Abilitare le NULL Session Share . . . . . . . . . . . . . . . . . . . . . . .106 Elencare le NULL Session Share . . . . . . . . . . . . . . . . . . . . . . .109 Modificare la password di un utente su pi server . . . . . . . . . .111 Ottenere lelenco dei job schedulati . . . . . . . . . . . . . . . . . . . .113 Ottenere la lista dei processi e dei relativi thread . . . . . . . . . . .115 Impostare lIP Address da statico a dinamico . . . . . . . . . . . . . .118 Ottenere informazioni sulle variabili dambiente . . . . . . . . . . .120 Svuotare la cartella di Prefetch . . . . . . . . . . . . . . . . . . . . . . . .122 Avviare il controllo antivirus su di una cartella . . . . . . . . . . . . .125 Determinare gli utenti in modalit console . . . . . . . . . . . . . . .128 Eliminare una connessione di rete . . . . . . . . . . . . . . . . . . . . .131 Disabilitare una connessione di rete . . . . . . . . . . . . . . . . . . . .134 Elencare i Documenti Recenti . . . . . . . . . . . . . . . . . . . . . . . . .137 Elencare i documenti nel Cestino . . . . . . . . . . . . . . . . . . . . . .138 Controllare labilitazione al controllo remoto . . . . . . . . . . . . .140 Controllare lesecuzione di uno script . . . . . . . . . . . . . . . . . . .143 Eseguire uno script direttamente su macchine remote . . . . . . .146

I libri di ioPROGRAMMO/100 script amministrativi per Windows

Introduzione

60 SCRIPT AMMINISTRATIVI

per Windows

INTRODUZIONE
Chi di voi ha deciso di sfogliare il presente libro per farsene unidea sommaria ed immediata dei suoi contenuti, si accorger subito di quale sia il taglio editoriale dellintero testo. Questa raccolta di script, infatti, nata per lo pi da problematiche reali, raccolte durante il tempo ed opportunamente modificate per renderla maggiormente chiara a ciascuno di voi. Lo scopo di questo testo fornire un supporto a chi deve risolvere problemi analoghi che, spesso, sembrano essere di semplice risoluzione. In questo libro non troverete sicuramente lo script perfetto n tantomeno si pu pensare che ci sia una risposta a tutto. Mi auguro tuttavia che attraverso qualche modifica e la fusione tra due o pi listati mostrati, qualcuno di voi possa essere in grado di portare a termine parte dei propri compiti. Il linguaggio utilizzato per realizzare questi script esclusivamente Visual Basic Script, coadiuvato in molti casi dal potente WMI e qualche volta da ADSI. Prima di lasciarvi, ancora una piccola nota sulle implementazioni che troverete nel testo. Tutti gli script sono stati provati in un ambiente di produzione e su macchine Windows (XP/2000/2003). Per alcuni di essi necessaria lesecuzione su macchine del dominio allinterno delle quali lutente che lancia lo script, ha diritti amministrativi sulla macchina corrente o su quella remota sulla quale opera lo script. In altri casi, invece, sono state previste le istruzioni utili a fornire le credenziali corrette per agire su server remoti. Per tutti quegli script che prevedono lesecuzione di azioni su pi server in sequenza, stato previsto un file contenente lelenco dei nomi o degli IP di questi sistemi.
I libri di ioPROGRAMMO/100 script amministrativi per Windows

60 SCRIPT AMMINISTRATIVI

per Windows

Introduzione

Il nome preimpostato in tali script semplicemente ElencoServer.txt (previsto nella stessa cartella ove presente lo script avviato) ed al suo interno, su ciascuna riga, va inserito il nome del server (o lindirizzo IP sul quale agire). Buona lettura.

I libri di ioPROGRAMMO/100 script amministrativi per Windows

Cercare un file su pi server

60 SCRIPT AMMINISTRATIVI

per Windows

CERCARE UN FILE SU PI SERVER


Questo script si occupa di ricercare un determinato file, denominato per ipotesi MyLibrary.dll, che sarebbe contenuto allinterno della System Directory del sistema sul quale si sta operando. Questo script, come molti altri mostrati in seguito, prelevano la lista delle macchine su cui operare da un file denominato ElencoServer.txt, riposto per ipotesi allinterno della stessa directory ove si trova il file VBS. Una delle difficolt che si potrebbero incontrare nella realizzazione di script simili a questo quella di determinare, per ogni sistema, lesatto percorso di questa directory (Windows potrebbe essere installato su C:\ o su D:\, la cartella potrebbe essere Windows o WinNT, ecc.). Per determinare questa informazione esistono diverse strade, tra cui quella di ricorrere ad unapposita classe WMI denominata Win32_OperatingSystem che contiene, oltre a questa informazione, molte altre che potrebbero essere utili. Al termine, lo script genera un file di log che riporta i risultati ottenuti.
Option Explicit Dim FSO Dim SystemDir Dim LogFile Dim LeggiFile Dim ServerCorrente Dim Item Dim objWMIService Dim colItems ' Oggetto File System Object ' Memorizza la System Directory ' Puntatore al file di log ' Puntatore al file che contiene l'elenco dei server ' Server su cui operare ' Generico item della collection colItems ' Oggetto WMI ' Collection d'informazioni della classe Win32_OperatingSystem Const wbemFlagReturnImmediately = &H10 Const wbemFlagForwardOnly = &H20
I libri di ioPROGRAMMO/60 script amministrativi per Windows

60 SCRIPT AMMINISTRATIVI

per Windows

Cercare un file su pi server

' Preleva l'elenco dei server su cui effettuare il controllo Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Controlla se il file di log esiste o occorre crearlo If (FSO.FileExists("Check.log")) Then Set LogFile = FSO.OpenTextFile("Check.log",8) Else Set LogFile = FSO.CreateTextFile("Check.Log", True) End If ' Leggi il file con l'elenco dei server e, per ognuno, cerca il file ' Per ipotesi, immaginiamo di dover cercare il file MyLibrary.DLL ' contenuto sotto %systemdir%\System32. Do While Not LeggiFile.AtEndOfStream ' Preleva il nome del server su cui operare ServerCorrente = LeggiFile.ReadLine ' Preleva le informazioni sulla System Directory Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & ServerCorrente & "\root\CIMV2") Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly) For Each Item In colItems SystemDir = Item.SystemDirectory Next ' SystemDir contiene qualcosa del tipo C:\Windows\System32. ' Per costruire la stringa correttamente, sostituiamo C: con C$ SystemDir = Replace (SystemDir,":","$")

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Estrarre informazioni da un log

60 SCRIPT AMMINISTRATIVI

per Windows

' Controlliamo ora se il file esiste If (FSO.FileExists("\\" & ServerCorrente & "\" & SystemDir & "\MyLibrary.DLL")) then LogFile.WriteLine (ServerCorrente & " " & SystemDir & " SI") Else LogFile.WriteLine (ServerCorrente & " " & SystemDir & " NO") End If Loop LogFile.Close LeggiFile.Close Set FSO = Nothing Set LogFile = Nothing Set objWMIService = Nothing Set colItems = Nothing Set LeggiFile = Nothing

ESTRARRE INFORMAZIONI DA UN LOG


Questo script desempio basato su un problema reale che si dovuto risolvere ossia quello di leggere da un file di log determinate informazioni, estraendo ad ogni ricorrenza della stringa Failed after 3 retries questa e la riga precedente e generando di conseguenza un nuovo file di log pulito. Il log di partenza, per semplice informazione, rappresentava il log di una migrazione di file da un sistema allaltro. La riga Failed after 3 retries veniva scritta allinterno del log subito dopo quella del file (completo di percorso) che si stava tentando di copiare.
Option Explicit
I libri di ioPROGRAMMO/60 script amministrativi per Windows

60 SCRIPT AMMINISTRATIVI

per Windows

Estrarre informazioni da un log

Dim FSO Dim RigaA Dim RigaB Dim LeggiFile Dim LogFile

' Oggetto File SystemObject ' Generica riga del file ' Generica riga del file ' Puntatore al file da leggere ' Puntatore al file di log ' Nome del file da controllare

Dim FileDaControllare

' Nome del file da controllare. In alternativa pu essere ' passato come parametro (da implementare...) FileDaControllare = "FileDaControllare.log" ' Apriamo il file da leggere Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile(FileDaControllare) ' Controlliamo l'esistenza del file di log If (FSO.FileExists("Check.log")) Then Set LogFile = FSO.OpenTextFile("Check.log",8) Else Set LogFile = FSO.CreateTextFile("Check.Log", True) End If ' Leggiamo l'intero file di input. Se troviamo la riga ' "Failed after 3 retries." allora riportiamo nel log ' la riga del file d'input immediatamente precedente Do While Not LeggiFile.AtEndOfStream RigaA = LeggiFile.ReadLine RigaB = LeggiFile.ReadLine If RigaB = "Failed after 3 retries." Then LogFile.WriteLine (RigaA & vbCrlf & RigaB & vbCrlf)

10

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Eliminare le condivisioni nascoste

60 SCRIPT AMMINISTRATIVI

per Windows

End If Loop Wscript.Echo "Ricerca tentativi falliti terminata." LeggiFile.Close LogFile.Close Set FSO = Nothing Set LeggiFile = Nothing Set LogFile = Nothing

ELIMINARE LE CONDIVISIONI NASCOSTE


Il problema delle condivisioni nascoste certamente uno tra quelli che maggiormente possono creare problemi ad un sistemista. Questo perch, mentre da un lato si pu prevenire la condivisione delle cosiddette Administrative Share (che vedremo in un altro script), dallaltro non possibile impedire che vengano impostate share nascoste sui sistemi diverse da questultime. Per essere sicuri di eliminare tutte le condivisioni nascoste di un sistema (quelle per intenderci che riportano il suffisso $) possiamo ricorrere a WMI, avviando una query che, servendosi della classe Win32_Share, cerchi proprio questo genere di nomi di condivisione. Al termine dellavvio dello script, tutte le condivisioni nascoste, esclusa la IPC$, verranno eliminate. Al riavvio, per, si tenga presente che, se non diversamente predisposto con alcune modifiche al Registry, tutte le restanti share amministrative (ADMIN$, C$, ecc.) verranno comunque ripristinate.
Option Explicit
I libri di ioPROGRAMMO/60 script amministrativi per Windows

11

60 SCRIPT AMMINISTRATIVI

per Windows

Check drive space

Dim strComputer Dim objWMIService Dim colShares Dim objShare strComputer = "."

' Computer sul quale operare ' Oggetto WMI ' Collection delle condivisioni ' Generico item della collection colShares

' Estrai le informazioni sulle condivisioni nascoste Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colShares = objWMIService.ExecQuery ("Select Name from Win32_Share Where Name LIKE '%$'") ' Elenca le share nascoste (togli per default la IPC$) Wscript.Echo "Sono state rilevate " & colshares.Count -1 & " condivisioni nascoste" ' Cancella le condivisioni nascoste If colShares.Count-1 = 0 Then Wscript.Echo "Non risultano condivisioni nascoste" Else For Each objShare In colShares objShare.Delete Next Wscript.Echo "Le condivisioni sono state eliminate" End If Set objWMIService = Nothing Set colShares = Nothing

CHECK DRIVE SPACE


Questo script genera un file di log che riporta le informazioni
12
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Check drive space

60 SCRIPT AMMINISTRATIVI

per Windows

sullo spazio disco di ciascuna partizione rilevata. Questo genere di controlli viene fatta solitamente per prevenire situazioni di crash dovute proprio al riempimento di un drive. Per ottenere i dati necessari al controllo, viene sfruttato semplicemente loggetto FSO (File System Object) peraltro importantissimo e presente in tutti i restanti script del libro.
Option Explicit Dim FSO Dim LogFile Dim Drv Dim DriveType Dim DrvTotSpc Dim DrvName Dim DriveInfo ' Oggetto File System Object ' Puntatore al file di log ' Oggetto Drive ' Tipo di drive ' Drive specification ' Specifica spazio disco ' Nome del volume ' Messaggio con le informazioni da inviare a video Set FSO = CreateObject("Scripting.FileSystemObject") ' Controlla l'esistenza del file di log If (FSO.FileExists("CheckDrive.log")) Then Set LogFile = FSO.OpenTextFile("CheckDrive.log",8) Else Set LogFile = FSO.CreateTextFile("CheckDrive.Log", True) End If ' Scansiona i drive alla ricerca della informazioni For Each Drv In FSO.Drives If Drv.IsReady Then Select Case Drv.DriveType Case 0: DriveType = "Unknown"
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Dim DriveSpecification

13

60 SCRIPT AMMINISTRATIVI

per Windows

Check drive space

Case 1: DriveType = "Rimovibile" Case 2: DriveType = "Fisso" Case 3: DriveType = "Network" Case 4: DriveType = "CD-ROM" Case 5: DriveType = "RAM Disk" End Select If Drv.DriveType = 4 Then DriveSpecification = "N/A" Elseif Drv.FreeSpace < 1024^2 Then DriveSpecification = FormatNumber(Drv.FreeSpace /1024,0) & " KB" Elseif Drv.FreeSpace < 10240^2 Then DriveSpecification = FormatNumber(Drv.FreeSpace /(1024^2),2) & " MB" Else DriveSpecification = FormatNumber(Drv.FreeSpace /(1024^2),0) & " MB" End If If Drv.TotalSize < 1024^2 Then DrvTotSpc = FormatNumber(Drv.TotalSize /1024,0) &" KB" Elseif Drv.TotalSize < 10240^2 Then DrvTotSpc = FormatNumber(Drv.TotalSize /(1024^2),2) &" MB" Else DrvTotSpc = FormatNumber(Drv.TotalSize /(1024^2),0) &" MB" End If If Drv.VolumeName = "" Then DrvName = "(None)" Else DrvName = Drv.VolumeName End If

14

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Controllo hotfix su pi server

60 SCRIPT AMMINISTRATIVI

per Windows

' Crea la stringa che andr nel log. Volendo possibile scartare ' una certa tipologia di drive. DriveInfo = strDriveMsg & "Drive " & Drv.DriveLetter & " Spazio Libero: " & DriveSpecification & vbCrlf ' Scrivi nel log le informazioni LogFile.WriteLine DriveInfo End If Next LogFile.Close Set FSO = Nothing Set LogFile = Nothing

CONTROLLO HOTFIX SU PI SERVER


La presenza o meno di determinate hotfix installate su un certo sistema pu essere determinante in certi ambienti di produzione.Attraverso lutilizzo classico della classe WMI Win32_QuickFixEngineering possiamo ottenere diverse informazioni. Questo script legge il server su cui operare dal file ElencoServer.txt e genera un opportuno log con le informazioni rilevate.
Option Explicit Dim LeggiFile Dim objWMIService Dim colListFixes Dim FSO Dim LogFile ' Puntatore al file contenente la lista dei server ' Oggetto WMI ' Collection contenente la lista delle hotfix ' Oggetto File System Object ' Puntatore al file di log
I libri di ioPROGRAMMO/60 script amministrativi per Windows

15

60 SCRIPT AMMINISTRATIVI

per Windows

Controllo hotfix su pi server

Dim hotfix Dim ServerCorrente

' Generica hotfix ' Server su cui operare

' Preleva l'elenco dei server su cui effettuare il controllo Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Controlla se il file di log esiste o occorre crearlo Set FSO = CreateObject("Scripting.FileSystemObject") If (FSO.FileExists("ReportHotfix.log")) Then Set LogFile = FSO.OpenTextFile("ReportHotfix.log",8) Else Set LogFile = FSO.CreateTextFile("ReportHotfix.Log", True) End If ' Crea il report con tutte le hotfix di ciascun server Do While Not LeggiFile.AtEndOfStream ServerCorrente = LeggiFile.ReadLine ' Ottieni la lista delle hotfix via WMI Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & ServerCorrente & "\root\cimv2") Set colListFixes = objWMIService.ExecQuery ("Select Description,HotFixID,InstallDate,InstalledBy from Win32_QuickFixEngineering") LogFile.WriteLine "-----------------------------------------------------------------" LogFile.WriteLine vbTab & ServerCorrente LogFile.WriteLine "-----------------------------------------------------------------"

16

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Ricercare una determinata patch su pi computer

60 SCRIPT AMMINISTRATIVI

per Windows

' Crea il report con le hotfix trovate For Each hotfix In colListFixes LogFile.WriteLine "Description: " & hotfix.Description & vbTab _ & "Hotfix ID: " & hotfix.HotFixID & vbTab _ & "Installation Date: " & hotfix.InstallDate & vbTab _ & "Installed By: " & hotfix.InstalledBy Next LogFile.WriteLine "-----------------------------------------------------------------" Loop LogFile.Close LeggiFile.Close Set objWMIService = Nothing Set colListFixes = Nothing Set FSO = Nothing Set LogFile = Nothing

RICERCARE UNA DETERMINATA PATCH SU PI COMPUTER


Analogamente al problema delle hotfix questo script consente di ottenere informazioni sulle patch installate sul sistema. In particolare, avviando lo script con lID della patch da ricercare, si ottengono i dati voluti.
Option Explicit Dim ServerCorrente Dim objWMIService ' Computer sul quale operare ' Oggetto WMI
I libri di ioPROGRAMMO/60 script amministrativi per Windows

17

60 SCRIPT AMMINISTRATIVI

per Windows

Ricercare una determinata patch su pi computer

Dim colListFixes Dim LeggiFile Dim LogFile Dim FSO Dim PatchID

' Collection delle patch ' Puntatore al file che contiene l'elenco dei server ' Puntatore al file di log ' Oggetto File System Object ' ID della patch

' Controlla se viene passato allo script l'ID della patch If Wscript.Arguments.Count = 0 Then Wscript.Echo "E' necessario specificare l'ID della patch da ricercare!" Wscript.Quit End If PatchID = Wscript.Arguments(0) ' Preleva l'elenco dei server su cui effettuare il controllo Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Controlla se il file di log esiste o occorre crearlo If (FSO.FileExists("CheckPatch.log")) Then Set LogFile = FSO.OpenTextFile("CheckPatch.log",8) Else Set LogFile = FSO.CreateTextFile("CheckPatch.Log", True) End If ' Leggi il file con l'elenco dei server e per ognuno controlla l'esistenza ' della patch. LogFile.WriteLine "SERVER;PATCH" Do While Not LeggiFile.AtEndOfStream

18

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Controllo dei file modificati

60 SCRIPT AMMINISTRATIVI

per Windows

ServerCorrente = LeggiFile.ReadLine ' Ricerca la patch via WMI Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & ServerCorrente & "\root\cimv2") Set colListFixes = objWMIService.ExecQuery ("Select HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = '" & PatchID & "'") ' Crea il report con l'elenco delle macchine che hanno ' o no la patch indicata. If colListFixes.Count > 0 Then LogFile.WriteLine ServerCorrente & ";" & "SI" Else LogFile.WriteLine ServerCorrente & ";" & "NO" End If Loop LeggiFile.Close LogFile.Close Set objWMIService = Nothing Set colListFixes = Nothing Set FSO = Nothing Set LogFile = Nothing Set LeggiFile = Nothing

CONTROLLO DEI FILE MODIFICATI


Generalmente le tante applicazioni di un ambiente di produzione generano ciascuna un proprio log con le informazioni di loro pertinenza. Talvolta, per, pu accadere che per qualche raI libri di ioPROGRAMMO/60 script amministrativi per Windows

19

60 SCRIPT AMMINISTRATIVI

per Windows

Controllo dei file modificati

gione lapplicativo si fermi o non riesca a scrivere i dati nel proprio log, senza che nessuno se ne accorga. Se normalmente questi file sono aggiornati a cadenza periodica, possiamo predisporre un controllo aggiuntivo su di essi, ad intervalli regolari di tempo, per controllare se sono stati modificati. Il codice seguente, dunque, si assicura che i file .log, contenuti in C:\LOGFolder, siano aggiornati ogni 10 minuti. Con i commenti inseriti dovrebbe essere semplice modificarne il comportamento in base alle proprie esigenze.
Option Explicit Dim FSO ' Oggetto File System Object

Dim FolderObject ' Oggetto Folder Dim FilesObject ' Collection di file Dim IntervalUnit ' Unit di misura del tempo Dim LOGFolder ' Cartella del log

' Preleva tutti i files nella directory puntata da LOGFolder LOGFolder = "C:\LogFiles" Set FSO = CreateObject("Scripting.FileSystemObject") Set FolderObject = FSO.GetFolder(LOGFolder) Set FilesObject = FolderObject.Files ' Definisci un intervallo di controllo e l'unit di tempo (per esempio 10 min.) INTERVAL = 10 ' Crea un oggetto Dictionary per memorizzare la corrispondenza ' tra l'unit di tempo e il parametro da passare alla funzione ' DateDiff(). ' I possibili valori sono:

20

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Controllo dei file modificati

60 SCRIPT AMMINISTRATIVI

per Windows

' yyyy Year 'q 'm 'y 'd 'w ' ww 'h 'n 's Quarter Month Day of year Day Weekday Week of year Hour Minute Second

Set IntervalUnit = CreateObject("Scripting.Dictionary") IntervalUnit.Add "SECONDI", "s" IntervalUnit.Add "s", "secondi" IntervalUnit.Add "MINUTI", "n" IntervalUnit.Add "n","minuti" IntervalUnit.Add "ORE", "h" IntervalUnit.Add "h","ore" ' ... ' ---------------------------------------------------------------------' Aggiungere righe analoghe alle precedenti se necessario... ' ---------------------------------------------------------------------' ... ' Memorizza la propria scelta (ossia, in definitiva, 10 minuti). ' Saranno quindi controllati tutti i file non modificati negli ultimi ' 10 minuti. IntervalExpr = IntervalUnit("MINUTI") ' Dalla collection files controlla se ci sono file .log For Each file In FilesObject
I libri di ioPROGRAMMO/60 script amministrativi per Windows

21

60 SCRIPT AMMINISTRATIVI

per Windows

Copia di una cartella su pi server

' Se ci sono file con estensione .log If FSO.GetExtensionName(file) = "log" Then ' Controlla la data di ultima modifica e l'ora che non sia superiore a INTERVAL ' Il parametro n della DateDiff specifica che la differenza espressa in MINUTI If DateDiff("n",file.datelastmodified,now)>INTERVAL then ' Scatta allarme Msgbox "Il file " & file.name & " da " & DateDiff(IntervalExpr,file.DateLastModified,now) & _" " & IntervalUnit(IntervalExpr) & "!!!",, "LISTA FILE" End if End if Next ' Elimina gli oggetti appena creati dalla memoria Set FileObject = Nothing Set FolderObject = Nothing Set FSO = Nothing

COPIA DI UNA CARTELLA SU PI SERVER


Com facile intuire, questo script replica una cartella su pi sistemi. Per semplicit la cartella di destinazione sullo stesso drive di quello di partenza ossia C:\. Quasi tutto quello che viene effettuato in questo listato ad opera delloggetto FSO (File System Object).

22

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Copia di una cartella su pi server

60 SCRIPT AMMINISTRATIVI

per Windows

Option Explicit Dim FSO Dim SourceFolder Dim LeggiFile Dim LogFile Dim ServerCorrente ' Oggetto File System Object ' Directory sorgente ' Directory destinataria dei server ' Puntatore al file di log ' Computer sul quale operare ' Puntatore al file che contiene l'elenco

Dim DestinationFolder

' Definisci la cartella da copiare SourceFolder = "C:\SourceFolder" ' Leggi il file che contiene l'elenco dei server su cui copiare la cartella Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Controlla se necessario creare il file di log If (FSO.fileexists("CheckCopy.log")) Then Set LogFile = FSO.OpenTextFile("CheckCopy.log",8) Else Set LogFile = FSO.CreateTextFile("CheckCopy.Log", True) End If ' Leggi il file contenente i server su cui copiare la cartella Do While Not LeggiFile.AtEndOfStream ServerCorrente = LeggiFile.ReadLine DestinationFolder = "\\" & ServerCorrente & "\C$\" On Error Resume Next ' Copia la cartella sul server corrente FSO.CopyFolder SourceFolder,DestinationFolder,True
I libri di ioPROGRAMMO/60 script amministrativi per Windows

23

60 SCRIPT AMMINISTRATIVI

per Windows

Creare file di log in base alla data

If Err.Number <> 0 Then LogFile.WriteLine (ServerCorrente & " Errore! (" & Err.Description & ")") Err.clear Else LogFile.WriteLine (ServerCorrente & " OK!") End If Loop LeggiFile.Close LogFile.Close Set FSO = Nothing Set LeggiFile = Nothing Set LogFile = Nothing

CREARE FILE DI LOG IN BASE ALLA DATA


Ecco come creare un file di log che rispecchi con il nome la data corrente. Malgrado possa sembrare unoperazione semplice, spesso qualcuno riscontra qualche difficolt di realizzazione.
Option Explicit Dim FSO Dim NomeFile Dim LogFile Dim AnnoCorrente Dim MeseCorrente Dim GiornoCorrente ' Oggetto File System Object ' Nome del file da creare ' Nome del file di log ' Anno corrente ' Mese corrente ' Giorno corrente

Set FSO = CreateObject("Scripting.FileSystemObject")

24

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Cancellare file in base alla data

60 SCRIPT AMMINISTRATIVI

per Windows

AnnoCorrente = Year(Date) MeseCorrente = Month(Date) GiornoCorrente = Day(Date) NomeFile = GiornoCorrente & MeseCorrente & AnnoCorrente & ".log" ' Controlla se il file esiste gi If (FSO.FileExists("C:\" & NomeFile)) Then Msgbox "Il file " & Nomefile & " esiste gi!",,"Informazione" Else Set LogFile = FSO.CreateTextFile("C:\" & NomeFile, TRUE) End If LogFile.Close Set FSO = Nothing Set LogFile = Nothing

CANCELLARE FILE IN BASE ALLA DATA


Questo script consente di cancellare file temporanei (per ipotesi .TMP) che non risultino avere una data di creazione pari al mese corrente. Solitamente questo genere di attivit si compiono su cartelle di appoggio che temporaneamente memorizzano dati che poi, per una qualunque ragione, non vengono cancellati.
Option Explicit Dim FSO ' Oggetto File System Object

Dim FolderObject ' Oggetto Folder Dim FilesObject ' Collection di file
I libri di ioPROGRAMMO/60 script amministrativi per Windows

25

60 SCRIPT AMMINISTRATIVI

per Windows

Cancellare file in base alla data

Dim SourceFolder' Cartella sorgente Dim LogFile Dim File ' Puntatore al file di log ' Generico file

' Preleva tutti i files nella directory C:\Temp SourceFolder = "C:\Temp" Set FSO = CreateObject("Scripting.FileSystemObject") Set FolderObject = FSO.GetFolder(SourceFolder) Set FilesObject = FolderObject.Files ' Controlliamo l'esistenza del file di log If (FSO.FileExists("Check.log")) Then Set LogFile = FSO.OpenTextFile("Check.log",8) Else Set LogFile = FSO.CreateTextFile("Check.Log", True) End If ' Controlla se ci sono file che rispettano le caratteristiche richieste For Each File In FilesObject ' Se i file hanno estensione TMP, il mese diverso dal corrente e l'anno = a quello corrente If FSO.GetExtensionName(file)="tmp" And (Month(File.DateCreated)<>Month(Now) Or Year(File.DateCreated)<>Year(Now)) Then LogFile.WriteLine "Il file " & File.Name & " da cancellare..." File.Delete End if Next LogFile.Close

26

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Cancellare tutte le cartelle tranne le ultime 3

60 SCRIPT AMMINISTRATIVI

per Windows

' Elimina gli oggetti appena creati dalla memoria Set FilesObject = Nothing Set FolderObject = Nothing Set FSO = Nothing Set LogFile = Nothing

CANCELLARE TUTTE LE CARTELLE TRANNE LE ULTIME 3


Questo script nato da unesigenza particolare ossia eliminare tutte le sottocartelle contenute allinterno di una cartella principale conservando solo quelle relative agli ultimi 3 giorni. Per ipotesi, le sottocartelle hanno un nome del tipo 20060927 (ossia nel formato AAAAMMGG). Tecnicamente lo script non molto complesso da realizzare. Occorre solo tenere conto della corretta gestione dei giorni precedenti a quello corrente. Con un p di pazienza pu essere migliorato parametrizzando il numero di giorni da mantenere ed inserendo un comodo file di log.
Option Explicit Dim FSO Dim subFolder Dim FolderName Dim Folder Dim NomeSubFolder Dim AnnoCorrente Dim MeseCorrente Dim GiornoCorrente Dim arrFolderName(3) ' Oggetto File System Object ' Oggetto sottocartella ' Nome della cartella principale ' Oggetto Folder ' Nome della sottocartella ' Anno corrente ' Mese corrente ' Giorno corrente ' Array contenente i 3 nomi delle cartelle

Dim DataDaConsiderare ' Data di riferimento

I libri di ioPROGRAMMO/60 script amministrativi per Windows

27

60 SCRIPT AMMINISTRATIVI

per Windows

Cancellare tutte le cartelle tranne le ultime 3

Dim Cont

' Contatore

FolderName = "C:\Script" Set FSO = CreateObject("Scripting.FileSystemObject") Set Folder = FSO.GetFolder(FolderName) ' Prendiamo in considerazione la data di oggi DataDaConsiderare = Now ' Crea l'array che conterr i nomi delle cartelle For Cont = 0 To 2 AnnoCorrente = Year(DataDaConsiderare - Cont) MeseCorrente = Month(DataDaConsiderare - Cont) GiornoCorrente = Day(DataDaConsiderare - Cont) ' Formatta opportunamente il il mese ed il giorno If Len(MeseCorrente) = 1 Then MeseCorrente = "0" & MeseCorrente If Len(GiornoCorrente) = 1 Then GiornoCorrente = "0" & GiornoCorrente ' Nome della sottocartella (AAAAMMGG) NomeSubFolder = AnnoCorrente & MeseCorrente & GiornoCorrente ' Aggiungi all'array dei nomi arrFolderName(Cont) = NomeSubFolder Next ' Per ogni sottocartella di quella principale controlla se il nome

28

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Controllo del numero distanze di un processo

60 SCRIPT AMMINISTRATIVI

per Windows

' uguale ad uno degli item dell'array For Each subFolder In Folder.SubFolders If subFolder.Name <>arrFolderName(0) And subFolder.Name <> arrFolderName(1) And subFolder.Name <>arrFolderName(2) Then ' Cancella la sottocartella subFolder.Delete End If Next Set FSO = Nothing Set subFolder = Nothing Set Folder = Nothing

CONTROLLO DEL NUMERO DISTANZE DI UN PROCESSO


Anche questo script, sebbene possa sembrare piuttosto particolare, frutto di una richiesta reale. In particolare, il problema era quello di rilevare periodicamente il numero distanze di un determinato processo (nellesempio abbiamo utilizzato SVCHOST.EXE) ed allertare lamministratore quando tale numero risulta diverso da quello richiesto. Anche qui viene sfruttato WMI ed in particolare viene fatto uso della classe Win32_Process per ottenere il numero esatto distanze.
Option Explicit Dim Processo Dim Istanze Dim strComputer Dim objWMIService Dim ListaProcessi ' Nome del processo da controllare ' Numero delle istanze ' Computer sul quale operare ' Oggetto WMI ' Collection della lista dei processi
I libri di ioPROGRAMMO/60 script amministrativi per Windows

29

60 SCRIPT AMMINISTRATIVI

per Windows

Monitoring degli utenti

strComputer = "." Processo = "svchost.exe" Istanze = 3 ' Ottieni l'elenco delle istanze del processo considerato Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set ListaProcessi = objWMIService.ExecQuery ("SELECT Name FROM Win32_Process WHERE Name='" & Processo & "'") ' Controlla se il numero delle istanze trovate coincide If ListaProcessi.Count <> Istanze Then Wscript.Echo "Il numero delle istanze del processo " & Processo & " non coincide!" Else Wscript.Echo "Il numero delle istanze del processo " & Processo & " coincide!" End If Set objWMIService = Nothing Set ListaProcessi = Nothing

MONITORING DEGLI UTENTI


Attraverso la classe WMI __InstanceOperationEvent possiamo rilevare in tempo reale diversi cambiamenti che avvengono allinterno di un sistema, specificando opportunamente le informazioni da monitorare. Qui stiamo controllando gli eventuali cambiamenti che avvengono sugli utenti (in particolare cancellazione e creazione). Per maggiori dettagli si riporta al sito della Microsoft.
30
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Monitoring degli utenti

60 SCRIPT AMMINISTRATIVI

per Windows

Nota: il controllo rimane attivo sino al riavvio del sistema o sino a quando non viene manualmente distrutto il processo wscript o cscript relativo.
Option Explicit Dim strComputer Dim objWMIService Dim objEventObject Dim Messaggio Dim objShell ' Computer sul quale operare ' Oggetto WMI ' Generico item della collection colMonitoredEvents ' Stringa contenente i dettagli dell'evento ' Oggetto Shell

Dim colMonitoredEvents ' Collection degli eventi di monitoring

Const EVENT_SUCCESS = 0 strComputer = "." ' Avvia il monitoring sulla creazione o eliminazione degli utenti Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ ("SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE " _ & "Targetinstance ISA 'Win32_UserAccount'") Set objShell = Wscript.CreateObject("Wscript.Shell") ' Attendi il verificarsi dell'evento Do While True Set objEventObject = colMonitoredEvents.NextEvent() Select Case objEventObject.Path_.Class
I libri di ioPROGRAMMO/60 script amministrativi per Windows

31

60 SCRIPT AMMINISTRATIVI

per Windows

Monitoring degli utenti

Case "__InstanceCreationEvent" Messaggio = "E' stato creato l'utente: " & UCase(objEventObject.TargetInstance.Name) & vbCrlf Messaggio = Messaggio & "Ecco alcuni dettagli:" & vbCrlf & "------------------------" & vbCrlf Messaggio = Messaggio & "AccountType: " & objEventObject.TargetInstance.AccountType & vbCrlf Messaggio = Messaggio & "Description: " & objEventObject.TargetInstance.Description & vbCrlf Messaggio = Messaggio & "SID: " & objEventObject.TargetInstance.SID Wscript.Echo Messaggio ' Scrivi il messaggio nell'Application Log objShell.LogEvent EVENT_SUCCESS, Messaggio Case "__InstanceDeletionEvent" Messaggio = "E' stato eliminato l'utente: " & UCase(objEventObject.TargetInstance.Name) & vbCrlf Messaggio = Messaggio & "Ecco alcuni dettagli:" & vbCrlf & "------------------------" & vbCrlf Messaggio = Messaggio & "AccountType: " & objEventObject.TargetInstance.AccountType & vbCrlf Messaggio = Messaggio & "Description: " & objEventObject.TargetInstance.Description & vbCrlf Messaggio = Messaggio & "SID: " & objEventObject.TargetInstance.SID Wscript.Echo Messaggio ' Scrivi il messaggio nell'Application Log objShell.LogEvent EVENT_SUCCESS, Messaggio End Select

32

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Monitoring dei gruppi

60 SCRIPT AMMINISTRATIVI

per Windows

Loop Set objWMIService = Nothing Set colMonitoredEvents = Nothing Set objEventObject = Nothing Set objShell = Nothing

MONITORING DEI GRUPPI


Attraverso la classe WMI __InstanceOperationEvent possiamo rilevare in tempo reale diversi cambiamenti che avvengono allinterno di un sistema, specificando opportunamente le informazioni da monitorare. Qui stiamo controllando gli eventuali cambiamenti che avvengono sui gruppi (in particolare cancellazione e creazione). Per maggiori dettagli si riporta al sito della Microsoft. Nota: il controllo rimane attivo sino al riavvio del sistema o sino a quando non viene manualmente distrutto il processo wscript o cscript relativo.
Option Explicit Dim strComputer Dim objWMIService Dim objEventObject Dim Messaggio Dim objShell ' Computer sul quale operare ' Oggetto WMI ' Generico evento ' Stringa che memeorizza i dettagli sull'evento ' Oggetto Shell

Dim colMonitoredEvents ' Collection degli eventi da monitorare

Const EVENT_SUCCESS = 0 strComputer = "."

I libri di ioPROGRAMMO/60 script amministrativi per Windows

33

60 SCRIPT AMMINISTRATIVI

per Windows

Monitoring dei gruppi

' Avvia il monitoring sulla creazione o eliminazione degli utenti Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ ("SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE " _ & "Targetinstance ISA 'Win32_Group'") Set objShell = Wscript.CreateObject("Wscript.Shell") ' Attendi il verificarsi dell'evento Do While True Set objEventObject = colMonitoredEvents.NextEvent() Select Case objEventObject.Path_.Class Case "__InstanceCreationEvent" Messaggio = "E' stato creato il gruppo: " & UCase(objEventObject.TargetInstance.Name) & vbCrlf Messaggio = Messaggio & "Ecco alcuni dettagli:" & vbCrlf & "------------------------" & vbcrlf Messaggio = Messaggio & "Descrizione: " & objEventObject.TargetInstance.Description & vbCrlf Messaggio = Messaggio & "SID: " & objEventObject.TargetInstance.SID Wscript.Echo Messaggio objShell.LogEvent EVENT_SUCCESS, Messaggio Case "__InstanceDeletionEvent" Messaggio = "E' stato eliminato il gruppo: " & UCase(objEventObject.TargetInstance.Name) & vbCrlf Messaggio = Messaggio & "Ecco alcuni dettagli:" & vbCrlf & "------------------------" & vbCrlf

34

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Monitoring della creazione/cancellazione di file

60 SCRIPT AMMINISTRATIVI

per Windows

Messaggio = Messaggio & "Descrizione: " & objEventObject.TargetInstance.Description & vbCrlf Messaggio = Messaggio & "SID: " & objEventObject.TargetInstance.SID Wscript.Echo Messaggio objShell.LogEvent EVENT_SUCCESS, Messaggio End Select Loop Set objWMIService = Nothing Set colMonitoredEvents = Nothing Set objEventObject = Nothing Set objShell = Nothing

MONITORING DELLA CREAZIONE/CANCELLAZIONE DI FILE


Abbiamo visto che, attraverso la classe WMI __InstanceOperationEvent, possiamo rilevare in tempo reale diversi cambiamenti che avvengono allinterno di un sistema, specificando opportunamente le informazioni da monitorare. Ecco di seguito uno script piuttosto particolare perch permette di tenere sotto controllo i cambiamenti che avvengono allinterno di una cartella (nellesempio C:\Windows). Per maggiori dettagli si riporta al sito della Microsoft Nota: il controllo rimane attivo sino al riavvio del sistema o sino a quando non viene manualmente distrutto il processo wscript o cscript relativo.
Option Explicit
I libri di ioPROGRAMMO/60 script amministrativi per Windows

35

60 SCRIPT AMMINISTRATIVI

per Windows

Monitoring della creazione/cancellazione di file

Dim strComputer Dim objWMIService Dim objEventObject Dim NameFile Dim FileNamePos Dim FSO Dim strPartComp Dim FilePath Dim objFile Dim objShell

' Computer sul quale operare ' Oggetto WMI ' Generico evento della collection colMonitoredEvents ' Nome del file ' Variabile d'appoggio ' Oggetto File System Object ' Variabile d'appoggio ' Percorso file ' Generico oggetto di tipo 'file' ' Oggetto Shell

Dim colMonitoredEvents ' Collection degli eventi monitorati

Const EVENT_SUCCESS = 0 strComputer = "." ' Crea l'oggetto FSO per ottenere info sui file creati/eliminati Set FSO = CreateObject("Scripting.FileSystemObject") ' Crea l'oggetto WMI che servir a monitorare la creazione di un file Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") ' Avvia la query che consentir di monitorare la creazione di file all'interno di una cartella. Per impostazione predefinita C:\Windows Set colMonitoredEvents = objWMIService.ExecNotificationQuery ("SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE " _ & "Targetinstance ISA 'CIM_DirectoryContainsFile' AND TargetInstance.GroupComponent= " _

36

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Monitoring della creazione/cancellazione di file

60 SCRIPT AMMINISTRATIVI

per Windows

& "'Win32_Directory.Name=""c:\\\\Windows""'") Set objShell = Wscript.CreateObject("Wscript.Shell") ' Attendi che si verifichi l'evento di creazione o cancellazione di un file Do While True Set objEventObject = colMonitoredEvents.NextEvent() ' Preleva il nome del file eliminando la parte non necessaria... FileNamePos = Instr(objEventObject.TargetInstance.PartComponent,"=") NameFile = Mid(objEventObject.TargetInstance.PartComponent,FileNamePos+1, Len(objEventObject.TargetInstance.PartComponent)) ' Sostituisci i \\ con \ NameFile = Replace(NameFile, "\\","\") ' Mostra l'opportuno msg all'utente Select Case objEventObject.Path_.Class ' CREAZIONE NUOVO FILE... Case "__InstanceCreationEvent" strPartComp = objEventObject.TargetInstance.PartComponent FilePath = Split(strPartComp, "CIM_DataFile.Name=")(1) FilePath = Replace(FilePath, """", "") FilePath = Replace(FilePath, "\\", "\") Set objFile = FSO.GetFile(FilePath) Wscript.Echo "E' stato creato un nuovo file: " & ObjFile.Name
I libri di ioPROGRAMMO/60 script amministrativi per Windows

37

60 SCRIPT AMMINISTRATIVI

per Windows

Monitoring dei servizi

objShell.LogEvent EVENT_SUCCESS, "E' stato creato un nuovo file: " & ObjFile.Name ' ELIMINAZIONE FILE Case "__InstanceDeletionEvent" strPartComp = objEventObject.TargetInstance.PartComponent FilePath = Split(strPartComp, "CIM_DataFile.Name=")(1) FilePath: = Replace(FilePath, """", "") FilePath = Replace(FilePath, "\\", "\") Wscript.Echo "E' stato eliminato il file: " & FilePath objShell.LogEvent EVENT_SUCCESS, "E' stato eliminato il file: " & FilePath End Select Loop Set objWMIService = Nothing Set FSO = Nothing Set colMonitoredEvents = Nothing Set objEventObject = Nothing Set objFile = Nothing Set objShell = Nothing

MONITORING DEI SERVIZI


Per essere allertati in tempo reale sul cambio di stato di un servizio, possiamo utilizzare, anche in questo caso, la classe WMI mostrata negli analoghi script. In questesempio, per, stato parametrizzata la query che attiva questo controllo, permetten38
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Monitoring dei servizi

60 SCRIPT AMMINISTRATIVI

per Windows

do allamministratore di decidere quali servizi monitorare e quale sia il passaggio di stato da considerare. Attraverso i commenti inseriti dovrebbe essere comunque piuttosto banale modificare queste righe di codice per adattarlo alle proprie esigenze. Nota: il controllo rimane attivo sino al riavvio del sistema o sino a quando non viene manualmente distrutto il processo wscript o cscript relativo.
Option Explicit Dim strComputer Dim objWMIService Dim colMonitoredEvents Dim objEventObject Dim ServiceStateToMon Dim ServiceStartModeToMon da monitorare Dim ServiceQuery Dim objShell strComputer = "." ' Monitor delo stato dei servizi: ' ServiceStateToMon ' ' = "Stopped" -> Solo servizi che risultano fermati "Running" -> Solo servizi che risultano avviati "Manual" -> Solo servizi in start Manual ' ServiceStartModeToMon = "Auto" -> Solo servizi in start Automatic ' Query WMI ' Oggetto WMI ' Computer sul quale operare ' Oggetto WMI ' Collection degli eventi da monitorare ' Generico evento nella collection colMonitoredEvents ' Stato del servizio da monitorare ' Start Mode del servizio

Const EVENT_SUCCESS = 0
I libri di ioPROGRAMMO/60 script amministrativi per Windows

39

60 SCRIPT AMMINISTRATIVI

per Windows

Monitoring dei servizi

ServiceStateToMon = "Stopped" ServiceStartModeToMon = "Auto" ' Ottieni la lista dei servizi Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") ' Raccogli tutti gli eventi legati a servizi in automatic che vengono fermati Select Case ServiceStateToMon Case "Stopped" ServiceQuery = "TargetInstance.State='Stopped'" Case "Running" ServiceQuery = "TargetInstance.State='Running'" Case Else Wscript.Echo "Errore nella configurazione dei parametri" Wscript.Quit End Select Select Case ServiceStartModeToMon Case "Auto" ServiceQuery = ServiceQuery & " AND TargetInstance.StartMode='Auto'" Case "Manual" ServiceQuery = ServiceQuery & " AND TargetInstance.StartMode='Manual'" Case Else Wscript.Echo "Errore nella configurazione dei parametri" Wscript.Quit End Select Set colMonitoredEvents = objWMIService.ExecNotificationQuery _

40

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Monitoring dei servizi

60 SCRIPT AMMINISTRATIVI

per Windows

("SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE TargetInstance ISA " _ & "'Win32_Service' AND (PreviousInstance.State <> TargetInstance.State) AND " & ServiceQuery) Set objShell = Wscript.CreateObject("Wscript.Shell") ' Controlla il cambio di stato del servizio secondo i criteri fissati Do While True Set objEventObject = colMonitoredEvents.NextEvent() Select Case objEventObject.Path_.Class Case "__InstanceModificationEvent" Wscript.Echo "Il servizio: " & UCase(objEventObject.TargetInstance.Name) & " stato fermato!" ' Scrivi il messaggio nell'Application Log objShell.LogEvent EVENT_SUCCESS, "Il servizio: " & UCase(objEventObject.TargetInstance.Name) & " stato fermato!" End Select Loop Set objWMIService = Nothing Set colMonitoredEvents = Nothing Set objEventObject = Nothing Set objShell = Nothing

I libri di ioPROGRAMMO/60 script amministrativi per Windows

41

60 SCRIPT AMMINISTRATIVI

per Windows

Monitoring delle Server Connection

MONITORING DELLE SERVER CONNECTION


Lutilizzo della classe WMI __InstanceOperationEvent particolarmente utile anche per rilevare tentativi dintrusione. Ecco un semplice esempio che rileva i tentativi di connessione ad una qualunque risorsa del sistema considerato. Nota: il controllo rimane attivo sino al riavvio del sistema o sino a quando non viene manualmente distrutto il processo wscript o cscript relativo.
Option Explicit Dim strComputer Dim objWMIService Dim Messaggio Dim objEventObject Dim objShell ' Computer sul quale operare ' Oggetto WMI ' Messaggio con i dettagli dell'evento ' Generico evento ' Oggetto Shell

Dim colMonitoredEvents ' Collection degli eventi da monitorare

Const EVENT_SUCCESS = 0 strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ ("SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE " _ & "Targetinstance ISA 'Win32_ServerConnection'") Set objShell = Wscript.CreateObject("Wscript.Shell") ' Attendi il verificarsi degli eventi...

42

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Monitoring delle Server Connection

60 SCRIPT AMMINISTRATIVI

per Windows

Do While True Set objEventObject = colMonitoredEvents.NextEvent() Select Case objEventObject.Path_.Class Case "__InstanceCreationEvent" Messaggio = "C' una nuova sessione da remoto - Utente Remoto: " & UCase(objEventObject.TargetInstance.UserName) & vbCrlf Messaggio = Messaggio & "Ecco alcuni dettagli:" & vbCrlf & "------------------------" & vbCrlf Messaggio = Messaggio & "Computer Name: " & objEventObject.TargetInstance.ComputerName & vbCrlf Messaggio = Messaggio & "Risorse aperte: " & objEventObject.TargetInstance.ShareName & vbCrlf Wscript.Echo Messaggio objShell.LogEvent EVENT_SUCCESS, Messaggio Case "__InstanceDeletionEvent" Messaggio = "La sessione aperta da " & UCase(objEventObject.TargetInstance.UserName) _ & " su " & objEventObject.TargetInstance.ShareName & " stata eliminata" Wscript.Echo Messaggio objShell.LogEvent EVENT_SUCCESS, Messaggio End Select Loop Set objWMIService = Nothing Set colMonitoredEvents = Nothing Set objEventObject = Nothing Set objShell = Nothing
I libri di ioPROGRAMMO/60 script amministrativi per Windows

43

60 SCRIPT AMMINISTRATIVI

per Windows

Monitoring delle condivisioni

MONITORING DELLE CONDIVISIONI


Oltre al controllo sulla creazione di Server Session, possibile controllare il tentativo di modifiche apportate alle condivisioni (creazione, modifica e cancellazione). Anche questo esempio, come i precedenti, sfrutta WMI. Nota: il controllo rimane attivo sino al riavvio del sistema o sino a quando non viene manualmente distrutto il processo wscript o cscript relativo.
Option Explicit Dim strComputer Dim objWMIService Dim objEventObject Dim Messaggio Dim objShell ' Computer sul quale operare ' Oggetto WMI ' Generico evento ' Messaggio contenente i dettagli ' Oggetto Shell

Dim colMonitoredEvents ' Collection eventi da monitorare

Const EVENT_SUCCESS = 0 strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ ("SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE " _ & "Targetinstance ISA 'Win32_LogicalShareSecuritySetting'") Set objShell = Wscript.CreateObject("Wscript.Shell")

44

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Monitoring delle condivisioni

60 SCRIPT AMMINISTRATIVI

per Windows

' Attendi che si verifichi l'evento Do While True Set objEventObject = colMonitoredEvents.NextEvent() Select Case objEventObject.Path_.Class Case "__InstanceCreationEvent" Messaggio = "E' stata creata la share: " & UCase(objEventObject.TargetInstance.Name) & vbCrlf Messaggio = Messaggio & "Ecco alcuni dettagli:" & vbCrlf & "------------------------" & vbCrlf Messaggio = Messaggio & "Descrizione: " & objEventObject.TargetInstance.Description & vbCrlf Wscript.Echo Messaggio objShell.LogEvent EVENT_SUCCESS, Messaggio Case "__InstanceDeletionEvent" Messaggio = "E' stata cancellata la share: " & UCase(objEventObject.TargetInstance.Name) & vbCrlf Messaggio = Messaggio & "Ecco alcuni dettagli:" & vbCrlf & "------------------------" & vbCrlf Messaggio = Messaggio & "Descrizione: " & objEventObject.TargetInstance.Description & vbCrlf Wscript.Echo Messaggio objShell.LogEvent EVENT_SUCCESS, Messaggio End Select Loop Set objEventObject = Nothing Set colMonitoredEvents = Nothing Set objWMIService = Nothing Set objShell = Nothing
I libri di ioPROGRAMMO/60 script amministrativi per Windows

45

60 SCRIPT AMMINISTRATIVI

per Windows

Elencare le condivisioni di pi server

ELENCARE LE CONDIVISIONI DI PI SERVER


Questo script consente di ottenere un file .CSV con la lista delle condivisioni di tutti i server indicati allinterno del file di testo ElencoServer.txt. Come molti altri listati, si serve di WMI e pi precisamente della classe Win32_Share.
Option Explicit Dim ServerCorrente Dim objWMIService Dim lstCondivisioni Dim Condivisione Dim ElencoCondivisioni Dim FSO Dim LeggiFile Dim LogFile ' Computer sul quale operare ' Oggetto WMI ' Lista delle condivisioni ' Generica condivisione ' Stringa contenente i dettagli da visualizzare ' Oggetto File System Object ' Puntatore al file contenente i server su cui operare ' Puntatore al file di log

' Preleva l'elenco dei server su cui effettuare il controllo Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Controlla se il file di log esiste o se occorre crearlo If (FSO.FileExists("ElencoShare.csv")) Then Set LogFile = FSO.OpenTextFile("ElencoShare.csv",8) Else Set LogFile = FSO.CreateTextFile("ElencoShare.csv", True) End If ' Leggi il file con l'elenco dei server e, per ognuno, cerca le condivisioni

46

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Salvare lelenco delle condivisioni

60 SCRIPT AMMINISTRATIVI

per Windows

LogFile.WriteLine "SERVER;NOME;PERCORSO" Do While Not LeggiFile.AtEndOfStream ServerCorrente = LeggiFile.ReadLine ' Ricava l'elenco delle condivisioni Set objWMIService = GetObject("winmgmts:\\" & ServerCorrente & "\root\cimv2") Set lstCondivisioni = objWMIService.InstancesOf("Win32_Share") ' Crea la stringa inserire nel file di log For Each Condivisione In lstCondivisioni ElencoCondivisioni = Condivisione.Name & ";" & Condivisione.Path ' Inserisci i dati nel file di log LogFile.WriteLine ServerCorrente & ";" & ElencoCondivisioni Next Loop LeggiFile.Close LogFile.Close Set objWMIService = Nothing Set lstCondivisioni = Nothing Set FSO = Nothing Set LeggiFile = Nothing Set LogFile = Nothing

SALVARE LELENCO DELLE CONDIVISIONI


Lelenco delle condivisioni di un sistema contenuto allinterno di unopportuna chiave del Registry indicata in testa allo script
I libri di ioPROGRAMMO/60 script amministrativi per Windows

47

60 SCRIPT AMMINISTRATIVI

per Windows

Salvare lelenco delle condivisioni

seguente. Utilizzando la classe WMI StdRegProv quindi possiamo leggere la porzione del Registry ce ci serve allo scopo e salvarla in un file. Nello script mostrato, per semplicit, non stato inserito il salvataggio del secondo ramo del Registry.
Option Explicit ' L'elenco delle condivisioni contenuta sotto: ' HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ LanmanServer\Shares ' Le informazioni di sicurezza sono sotto: ' HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ LanmanServer\Shares\Security Dim strComputer Dim objWMIService Dim colElencoShare2() Dim strKeyPath Dim oReg Dim FSO Dim LogFile Dim ItemShare Dim Cont Dim Cont2 ' Computer sul quale operare ' Oggetto WMI ' Array di share

Dim colElencoShare() ' Array di share ' Percorso nel Registry ' Oggetto Registry ' Oggetto File System Object ' Puntatore al file di log ' Generica share ' Contatore ' Contatore

Const HKEY_LOCAL_MACHINE = &H80000002: strComputer = "." strKeyPath =

48

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Salvare lelenco delle condivisioni

60 SCRIPT AMMINISTRATIVI

per Windows

"System\CurrentControlSet\Services\LanmanServer\Shares" Set FSO = CreateObject("Scripting.FileSystemObject") ' Controlla se il file di log esiste o occorre crearlo If (FSO.FileExists("ElencoShare.log")) Then Set LogFile = FSO.OpenTextFile("ElencoShare.log",8) Else Set LogFile = FSO.CreateTextFile("ElencoShare.log", True) End If ' Crea l'oggetto per la scansione del Registry Set oReg = GetObject("winmgmts:{impersonationLevel= impersonate}!\\" & strComputer & "\root\default:StdRegProv") ' Leggi le impostazioni dal Registry (ossia l'elenco delle condivisioni) oReg.EnumValues HKEY_LOCAL_MACHINE,strKeyPath,colElencoShare Cont = 0 For Each ItemShare In colElencoShare oReg.GetMultiStringValue HKEY_LOCAL_MACHINE,strKeyPath,colElencoShare(Cont), ColElencoShare2 LogFile.WriteLine colElencoShare(Cont) For Cont2 = 0 To Ubound(colElencoShare2) If Cont2 = 0 Then LogFile.Write colElencoShare2(Cont2) Else LogFile.Write "," & colElencoShare2(Cont2) End If Next Cont = Cont + 1
I libri di ioPROGRAMMO/60 script amministrativi per Windows

49

60 SCRIPT AMMINISTRATIVI

per Windows

Eseguire il ping verso un host con e senza WMI

LogFile.WriteLine Next LogFile.Close Set FSO = Nothing Set colElencoShare= Nothing Set LogFile = Nothing Set oReg = Nothing

ESEGUIRE IL PING VERSO UN HOST CON E SENZA WMI


Per simulare un ping esistono diverse strade possibili. Una di queste consiste nellavviare il comando ping rilevandone loutput ed analizzandolo per le azioni successive. Un metodo pi semplice e, forse, pi diffuso, quello di sfruttare lapposita classe WMI Win32_PingStatus. Pi avanti in questo script (ma anche in alcuni altri listati del libro) mostrata una tecnica in grado di avviare tool esterni (in questo caso il comando PING) recuperandone loutput direttamente dallo script.
Option Explicit Dim strComputer Dim ToHost Dim PingResults Dim PingResObj Dim objWMIService Dim objWshShell Dim cmdPingToHost strComputer = "." ' Host di partenza ' Host di destinazione ' Risultati del ping ' Generico elemento della collection PingResults ' Oggetto WMI ' Oggetto Shell ' Comando PING <Nome Host>

50

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Eseguire il ping verso un host con e senza WMI

60 SCRIPT AMMINISTRATIVI

per Windows

ToHost = "127.0.0.1" ' -------------- METODO 1 -------------' Connessione al namespace della macchina locale Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") ' Esegui il ping verso l'host remoto Set PingResults = objWmiService.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" + ToHost + "'") For Each PingResObj In PingResults ' Se l'host risponde... If PingResObj.StatusCode = 0 Then Msgbox "Bytes: " & PingResObj.BufferSize & " Time (ms): " & PingResObj.ResponseTime & " TTL (s): " & PingResObj.ResponseTimeToLive Else Msgbox ToHost & " non risponde" & vbCrlf & "Status code: " & PingResObj.StatusCode End If Next ' -------------- METODO 2 -------------Set objWshShell = CreateObject( "WScript.Shell" ) cmdPingToHost = "PING " & ToHost PingResults = objWshShell.Exec(cmdPingToHost).StdOut.ReadAll() ' Mostra i risultati Msgbox PingResults

I libri di ioPROGRAMMO/60 script amministrativi per Windows

51

60 SCRIPT AMMINISTRATIVI

per Windows

Creare un report delle corrispondenze Server Indirizzo IP

Set PingResults = Nothing Set objWmiService = Nothing Set PingResObj = Nothing Set objWshShell = Nothing

CREARE UN REPORT DELLE CORRISPONDENZE SERVER INDIRIZZO IP


Servendoci di quanto visto nello script che illustra due metodi per lanciare il comando ping verso un host, possiamo realizzarne uno in grado di realizzare un log di tutte le corrispondenze Nome Server IP Address, prelevando i dati relativi ai nomi dei server da unapposito file di input. In pratica, il codice seguente, per ogni sistema da pingare, lancia il comando verso tale host e ne preleva loutput. A questo punto lo scansiona per trovare la prima parentesi quadra che racchiude lindirizzo IP. Se non la trova d errore, altrimenti cerca la parentesi quadra di chiusura e, infine, con questi dati, estrae lindirizzo IP che racchiudono.
Option Explicit Dim PingResults Dim ToHost Dim objWMIService Dim objWshShell Dim cmdPingToHost Dim FSO Dim LeggiFile Dim LogFile Dim FirstBracket Dim SecondBracket ' Stringa contenente l'output del comando PING ' Host di destinazione ' Oggetto WMI ' Oggetto Shell ' Comando PING <Nome Host> ' File di input ' File di log ' Prima parentesi quadra che contiene l'IP ' Seconda parentesi quadra che contiene l'IP ' Oggetto File System Object

52

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Creare un report delle corrispondenze Server Indirizzo IP

60 SCRIPT AMMINISTRATIVI

per Windows

Dim IPAddress

' Indirizzo IP dell'host

Const wbemFlagReturnImmediately = &h10 Const wbemFlagForwardOnly = &h20 ToHost = "127.0.0.1" Set objWshShell = CreateObject( "WScript.Shell" ) ' Creiamo l'oggetto FSO Set FSO = CreateObject("Scripting.FileSystemObject") ' Controlliamo l'esistenza del file di log If (FSO.FileExists("ServerToIP.log")) Then Set LogFile = FSO.OpenTextFile("ServerToIP.log",8) Else Set LogFile = FSO.CreateTextFile("ServerToIP.Log", True) End If ' Apriamo il file di input Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Leggiamo l'intero file di input Do While Not LeggiFile.AtEndOfStream ' Host da risolvere ToHost = LeggiFile.ReadLine ' Lanciamo il ping cmdPingToHost = "PING " & ToHost PingResults = objWshShell.Exec(cmdPingToHost).StdOut.ReadAll() ' Elabora i risultati
I libri di ioPROGRAMMO/60 script amministrativi per Windows

53

60 SCRIPT AMMINISTRATIVI

per Windows

Creare un report delle corrispondenze Server Indirizzo IP

FirstBracket = Instr(PingResults,"[") If FirstBracket <> 0 Then SecondBracket = InstrRev(PingResults,"]") IPAddress = Mid(PingResults, FirstBracket+1, SecondBracketFirstBracket-1) LogFile.WriteLine ToHost & ";" & IPAddress Else LogFile.WriteLine ToHost & ";Sconosciuto" End If Loop LogFile.Close LeggiFile.Close Set PingResults = Nothing Set objWshShell = Nothing Set FSO = Nothing Set LogFile = Nothing Set LeggiFile = Nothing WScript.Echo Ho terminato ' --------------------------------------------------------------------------------------------' Nel caso il server supporti WMI, lindirizzo IP pu anche essere ottenuto cos: ' strComputer = "." ' Set objWMIService = GetObject( "winmgmts:\\" & strComputer & "\root\cimv2") ' Set IPConfigSet = objWMIService.ExecQuery("SELECT IPAddress FROM Win32_NetworkAdapterConfiguration" _ ' & " WHERE IPEnabled = TRUE","WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

54

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Creare un report delle corrispondenze Server MAC Address

60 SCRIPT AMMINISTRATIVI

per Windows

' For Each IPConfig in IPConfigSet ' ' ' ' ' ' If Not IsNull(IPConfig.IPAddress) Then For I = LBound(IPConfig.IPAddress) To UBound(IPConfig.IPAddress) IPAddress = IPConfig.IPAddress(i) Exit For Next End If

' Next ' Wscript.Echo IPAddress ' ---------------------------------------------------------------------------------------------

CREARE UN REPORT DELLE CORRISPONDENZE SERVER MAC ADDRESS


Questo script simile al precedente, ma permette di riportare lelenco dei MAC Address e la descrizione delladattatore di rete rilevato.
Option Explicit Dim Utente Dim Password Dim ToHost Dim objWMIService Dim objWshShell Dim FSO Dim LeggiFile Dim LogFile Dim MACAddresses Dim MACAddress ' Utente per l'accesso al server ' Password per l'accesso al server ' Host di destinazione ' Oggetto WMI ' Oggetto Shell ' Oggetto File System Object ' File di input ' File di log ' Collection di MAC Address ' Stringa che memorizza il MAC Address
I libri di ioPROGRAMMO/60 script amministrativi per Windows

55

60 SCRIPT AMMINISTRATIVI

per Windows

Creare un report delle corrispondenze Server MAC Address

corrente Dim Descrizione Dim objMacAddress Dim objLocator ' Stringa che memorizza la descizione dell'interfaccia di rete ' Generico item della collection di MAC Address ' Oggetto WMI

Const wbemFlagReturnImmediately = &H10 Const wbemFlagForwardOnly = &H20 ToHost = "127.0.0.1" Utente = "MyDomain\Utente" Password = "Password" Set objWshShell = CreateObject( "WScript.Shell" ) ' Creiamo l'oggetto FSO Set FSO = CreateObject("Scripting.FileSystemObject") ' Controlliamo l'esistenza del file di log If (FSO.FileExists("ServerMACAdrress.csv")) Then Set LogFile = FSO.OpenTextFile("ServerMACAddress.csv",8) Else Set LogFile = FSO.CreateTextFile("ServerMACAddress.csv", True) End If ' Apriamo il file di input Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Scrivi l'intestazione del file di log LogFile.WriteLine "SERVER;MAC ADDRESS;DESCRIZIONE" ' Leggiamo l'intero file di input

56

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Creare un report delle corrispondenze Server MAC Address

60 SCRIPT AMMINISTRATIVI

per Windows

Do While Not LeggiFile.AtEndOfStream ToHost = "-" MACAddress = "-" Descrizione = "-" ' Host da contattare ToHost = LeggiFile.ReadLine ' Collegati al server corrente e preleva il MAC ADDRESS Set objLocator = CreateObject("WbemScripting.SwbemLocator") Set objWMIService = objLocator.ConnectServer(ToHost, "root\cimv2", Utente, Password) Set MACAddresses = objWMIService.ExecQuery("SELECT MacAddress, Description FROM " _ & "Win32_NetworkAdapterConfiguration WHERE IPEnabled=True","WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly) On Error Resume Next For Each objMacAddress In MACAddresses MACAddress = objMacAddress.MacAddress Descrizione = objMacAddress.Description LogFile.WriteLine ToHost & ";" & MACAddress & ";" & Descrizione Next Loop
I libri di ioPROGRAMMO/60 script amministrativi per Windows

57

60 SCRIPT AMMINISTRATIVI

per Windows

Ricercare una particolare applicazione DCOM

LogFile.Close LeggiFile.Close Set objWshShell = Nothing Set FSO = Nothing Set LogFile = Nothing Set LeggiFile = Nothing Set objWMIService = Nothing Set objWshShell = Nothing Set objLocator = Nothing Set MACAddresses = Nothing Wscript.Echo "Ho terminato..."

RICERCARE UNA PARTICOLARE APPLICAZIONE DCOM


Quando alcune applicazioni DCOM sono impostate in maniera errata, pu accadere che registrino allinterno dellEvent Log, opportuni messaggi di errori che indicano per il CLSID dellapplicazione che sta causando problemi. Per correggere queste anomalie, un metodo quello di lanciare il tool DCOMCNFG e cercare il CLSID che identifica lapplicativo. Un metodo pi semplice lanciare questo script seguito dal CLSID da ricercare.
Option Explicit Dim strComputer Dim DCOMApp Dim colItems Dim objWMIService Dim objItem strComputer = "." ' Computer sul quale operare ' Memorizza il CLSID dell'applicazione DCOM ' Collection DCOMApplication ' Oggetto WMI ' Generico item della collection colItems

58

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Inviare una mail con e senza parametri

60 SCRIPT AMMINISTRATIVI

per Windows

If Wscript.Arguments.Count = 0 Then DCOMApp = Inputbox ("Inserire il CLSID dell'applicazione:", "Inserimento DCOM CLSID") Else ' Leggi largomento passato allo script che indica il CLSID DCOMApp = Wscript.Arguments(0) End If Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery("Select AppID, Name FROM Win32_DCOMApplication WHERE AppID= '" & DCOMApp & "'") ' Ricerca l'applicazione DCOM con l'ID passato For Each objItem In colItems Wscript.Echo "L'applicazione DCOM con ID " & objItem.AppID & " " & objItem.Name Next Set objWMIService = Nothing Set colItems = Nothing Set objItem = Nothing

INVIARE UNA MAIL CON E SENZA PARAMETRI


Windows XP e Windows 2000 hanno sostituito a CDONTS loggetto CDO per linvio delle mail. Questo script, opportunamente modificato sulla base di unanalogo codice fornito dalla Microsoft, permette di rendere pi flessibile linvio di una mail, consentendo anche linserimento di un allegato. La particolaI libri di ioPROGRAMMO/60 script amministrativi per Windows

59

60 SCRIPT AMMINISTRATIVI

per Windows

Inviare una mail con e senza parametri

rit nelluso di questo script la presenza di parametri di default (contenuti allinterno del codice stesso) e di parametri passati allo script. In sostanza, quando un parametro non viene specificato, lo script lo preleva direttamente da quelli di default (un esempio il nome del server e la porta SMTP solitamente sempre preimpostati). Inoltre, per consentire una maggiore efficienza con questoperazione, stato implementato il controllo sullesistenza del file allegato prima dellinvio. Per ragioni di leggibilit e chiarezza del codice mostrato, i nomi dei parametri da passare da command line, potrebbero sembrare troppo lunghi e, di conseguenza, scomodi. In tal caso si consiglia di modificarli con stringhe pi brevi (ad esempio potremmo mettere TO al posto di MAILTO) facendo per attenzione a modificare sia il nome delle variabili di default che quelli inseriti allinterno dei rispettivi controlli sui parametri dinput.
Option explicit Dim MailMittente Dim Mittente Dim Destinatario Dim FSO Dim Oggetto Dim SMTPserver Dim Testo Dim AttachmentFile Dim objEmail Dim TotArgs Dim Cont ' Contatore ' Mail del mittente ' Descrizione mittente e mail ' Mail del destinatario ' Oggetto File System Object ' Oggetto della mail ' Server SMTP ' Testo della mail ' Allegato della mail ' Oggetto CDO.Message ' Numero argomenti passati

Dim DescrizioneMittente ' Descrizione del mittente

Const SMTP_PORT = 25

60

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Inviare una mail con e senza parametri

60 SCRIPT AMMINISTRATIVI

per Windows

' Controlla se sono stati passati sufficienti argomenti. Gli argomenti vengono ' passati attraverso i seguenti parametri: ' ' MailFrom = Mail del mittente: ' DescrFrom = Descrizione del mittente (es.: Nome Cognome) ' MailTo ' Subject ' BodyMsg ' Attach = Mail del destinatario = Oggetto della mail = Testo della mail = Allegato (="NULL" nel caso non ci fossero allegati)

' SMTPServer = Nome del server di posta per l'invio della mail

' Utilizzare lo script in questo modo: ' Lanciarlo con i parametri necessari specificati in questo modo: ' InvioMail.vbs /MailFrom:francesco.lippo@email.it /DescrFrom:Francesco ... ' Per i parametri non specificati verranno presi da quelli di default ' Valorizziamo i parametri di default MailMittente = "MAIL DEL MITTENTE" DescrizioneMittente = "DESCRIZIONE DEL MITTENTE" Mittente = DescrizioneMittente & " <" & MailMittente & ">" Destinatario = "MAIL DEL DESTINATARIO" Oggetto = "OGGETTO DELLA MAIL" Testo = "TESTO DELLA MAIL" SMTPServer = "NOME DEL SERVER SMTP" AttachmentFile = "NULL" ' Imposta i parametri da utilizzare sfruttando quelli passati ' e quelli di default If Wscript.Arguments.Named.Exists("MailFrom") Then MailMittente
I libri di ioPROGRAMMO/60 script amministrativi per Windows

61

60 SCRIPT AMMINISTRATIVI

per Windows

Inviare una mail con e senza parametri

= Wscript.Arguments.Named("MailFrom") If Wscript.Arguments.Named.Exists("DescrFrom") Then DescrizioneMittente = Wscript.Arguments.Named("DescrFrom") If Wscript.Arguments.Named.Exists("MailTo") Then Destinatario = Wscript.Arguments.Named("MailTo") If Wscript.Arguments.Named.Exists("Subject") Then Oggetto = Wscript.Arguments.Named("Subject") If Wscript.Arguments.Named.Exists("BodyMsg") Then Testo = Wscript.Arguments.Named("BodyMsg") If Wscript.Arguments.Named.Exists("SMTPServer") Then SMTPServer = Wscript.Arguments.Named("SMTPServer") If Wscript.Arguments.Named.Exists("Attach") Then AttachmentFile = Wscript.Arguments.Named("Attach") Mittente = MailMittente & " <" & DescrizioneMittente & ">" ' Creazione oggetto CDO Set objEmail = CreateObject("CDO.Message") ' Impostazione dei campi utili all'invio With objEmail .From = Mittente .To = Destinatario .Subject = Oggetto .Textbody = Testo .Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 .Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/smtpserver") =

62

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Inviare una mail con e senza parametri

60 SCRIPT AMMINISTRATIVI

per Windows

SMTPServer .Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/ smtpserverport") = SMTP_PORT ' Controlla l'ultimo parametro che si riferisce all'allegato. ' Se risulta essere pari a NULL, allora non ci sono allegati. If AttachmentFile <> "NULL" Then Set FSO = CreateObject("Scripting.FileSystemObject") ' Verifica l'esistenza del file da allegare If FSO.FileExists(AttachmentFile) Then .AddAttachment AttachmentFile Else Wscript.Echo "Il file " & AttachmentFile & " che si vuol inviare come allegato non esiste!" Wscript.Echo "L'invio della mail stato interrotto..." Wscript.Quit End If End If ' Update informazioni ed invio mail .Configuration.Fields.Update .Send End With ' Visualizza messaggio di conferma Msgbox "La mail stata inviata.", vbOkonly, "Informazioni" Set objEMail = Nothing Set FSO = Nothing

I libri di ioPROGRAMMO/60 script amministrativi per Windows

63

60 SCRIPT AMMINISTRATIVI

per Windows

Intercettare levento SHUTDOWN

INTERCETTARE LEVENTO SHUTDOWN


Per intercettare lo spegnimento di un server possiamo lanciare una query asincrona sfruttando WMI. Malgrado lutilit di questo script possa essere dubbia, credo sia interessante comprenderne il funzionamento per imparare ad utilizzare gli utilissimi oggetti SwbemSink di WMI.
Option Explicit Dim strComputer Dim objWMIService Dim ObjSink strComputer = "." Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate, (Security)}!\\" & strComputer & "\root\cimv2") ' Crea loggetto swbemsink ed avvia la query asincrona Set ObjSink = Wscript.CreateObject("wbemscripting.swbemsink","objsink_") objWMIService.ExecNotificationQueryAsync ObjSink, "SELECT * FROM Win32_ComputerShutdownEvent" ' Attendi il verificarsi dell'evento... While True Wscript.Echo "Resto in attesa..." Wscript.Sleep 1000 Wend Sub Objsink_OnObjectReady(obj, ctx) Wscript.Echo "Shutdown event!" ' Computer sul quale operare ' Oggetto WMI ' Oggetto WMI SINK

64

I libri di ioPROGRAMMO/60 script amministrativi per Windows

SQL Server Connection

60 SCRIPT AMMINISTRATIVI

per Windows

End Sub Set objWMIService = Nothing Set ObjSink = Nothing

SQL SERVER CONNECTION


Ecco un semplice script che legge una tabella da SQL Server. In realt, la parte probabilmente pi difficile da implementare quella che relativa allimpostazione dei parametri di connessione al DB (utente, password, tabella, ecc.). Una volta stabilita la connessione ad esso, tutto si traduce drasticamente nelle solite operazioni SQL compiute su un qualunque DB.
Option Explicit Dim FSO Dim Conn Dim Tabella ' Oggetto File System Object ' Oggetto ADODB.Connection ' Tabella di SQL Server

Dim FileRubrica ' File che conterr i risultati

' Imposta i parametri per la connessione al server SQL Const UID = "User" Const PWD = "Password" Const Driver = "{SQL Server}" Const Database = "TabellaSQL" Const Server = "." ' Controlla l'esistenza del file di log. Crealo nel ' caso non esistesse. Set FSO = CreateObject("Scripting.FileSystemObject") If (FSO.FileExists("Rubrica.log")) Then
I libri di ioPROGRAMMO/60 script amministrativi per Windows

65

60 SCRIPT AMMINISTRATIVI

per Windows

SQL Server Connection

Set FileRubrica= FSO.OpenTextFile("Rubrica.log",8) Else Set FileRubrica= FSO.CreateTextFile("Rubrica.log", True) End If ' Connettiti al DB SQL Server, sfruttando le credenziali settate in UID e PWD Set Conn = CreateObject("ADODB.Connection") Conn.Open "Driver={SQL Server};Server=" & Server & ";UID=" & UID & ";Pwd=" & PWD & ";Database=" & Database & "" ' Avvia la query di controllo dei terminali In errore QueryStr = "SELECT Nome_Impiegato, Mail FROM Rubrica" Set Tabella = Conn.Execute(QueryStr) ' Leggi l'intera tabella e scrivi nel file i risultati FileRubrica.WriteLine "NOME IMPIEGATO;MAIL" Do While Not Tabella.Eof FileRubrica.WriteLine Tabella.Fields("Nome_Impiegato") & ";" & Tabella.Fields("Mail") ' Passa al record successivo Tabella.MoveNext Loop FileRubrica.Close Set FSO = Nothing Set FileRubrica = Nothing Set Tabella = Nothing Set Conn = Nothing

66

I libri di ioPROGRAMMO/60 script amministrativi per Windows

DBF Connection

60 SCRIPT AMMINISTRATIVI

per Windows

DBF CONNECTION
In alcune realt esistono ancora i vecchi archivi DBF. Anche se apparentemente possono costituire un problema, la loro gestione non molto diversa da quanto visto in precedenza. Pertanto non dovrebbe essere complicato intuirne le differenze.
Option Explicit Dim FSO Dim FileRubrica Dim Conn Dim Tabella Dim Path Dim OpenDBFConn Dim QueryStr ' Oggetto File System Object ' File che conterr i risultati ' Oggetto ADODB.Connection ' Tabella (archivio DBF) ' Percorso del file DBF ' Oggetto ADODB.Connection ' Stringa che identifica la query al DB

Path = "\\Server\C$\Archivio\" ' Controlla l'esistenza del file di log. ' Nel caso non esista, crealo... Set FSO = CreateObject("Scripting.FileSystemObject") If (FSO.FileExists("Rubrica.log")) Then Set FileRubrica= FSO.OpenTextFile("Rubrica.log",8) Else Set FileRubrica= FSO.CreateTextFile("Rubrica.log", True) End If ' Connettiti al DB LOG.DBF Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & Path & ";"& _ "Extended Properties=""DBASE IV;"";" Set OpenDBFConn = Conn
I libri di ioPROGRAMMO/60 script amministrativi per Windows

67

60 SCRIPT AMMINISTRATIVI

per Windows

Impostare lexpiration date su un gruppo di utenti

' Imposta la stringa per la lettura del file Rubrica.dbf ' Per ipotesi viene letto tutto il DB QueryStr = "Select Nome_Impiegato, Mail FROM [Rubrica#dbf]" ' Avvia la query Set Tabella = Conn.Execute(QueryStr) ' Leggi l'intera tabella e scrivi nel file i risultati FileRubrica.WriteLine "NOME IMPIEGATO;MAIL" ' Scrivi il risultato in un file CSV Do While Not Tabella.Eof FileRubrica.WriteLine Tabella.Fields("Nome_Impiegato") & ";" & Tabella.Fields("Mail") ' Passa al record successivo Tabella.MoveNext Loop FileRubrica.Close Set FSO = Nothing Set FileRubrica = Nothing Set Tabella = Nothing Set Conn = Nothing Set OpenDBFConn = Nothing

IMPOSTARE LEXPIRATION DATE SU UN GRUPPO DI UTENTI


Questo script utilizza ADSI per impostare lexpiration date di un gruppo di utenti specificati allinterno di un file dinput. Lo script preleva dal file ElencoDN.txt tutti i Distinguished Name degli
68
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Impostare lexpiration date su un gruppo di utenti

60 SCRIPT AMMINISTRATIVI

per Windows

utenti che devono essere modificati e per ognuno imposta la data indicata nella variabile ExpireDate. Il file ElencoDN.txt formato da righe simili a:
CN=Pippo1,CN=Users,DC=Mydomain,DC=it CN=Pippo2,CN=Users,DC=Mydomain,DC=it Option Explicit Dim FSO Dim LeggiFile Dim LogFile Dim CurrentUserDN Dim ExpireDate Dim objUser ' Oggetto File System Object ' File di input contenente i DN degli utenti ' File di log ' Distinguished Name corrente ' Data per l'expire ' Oggetto ADSI (Utente)

' Imposta la data di expire ExpireDate = "31/12/2006" ' Preleva l'elenco dei server su cui effettuare il controllo Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoDN.txt") ' Controlla se il file di log esiste o occorre crearlo If (FSO.FileExists("ReportDNUser.log")) Then Set LogFile = FSO.OpenTextFile("ReportDNUser.log",8) Else Set LogFile = FSO.CreateTextFile("ReportDNUser.Log", True) End If ' Leggi il file con l'elenco dei Distinguished Name degli utenti ' da modificare Do While Not LeggiFile.AtEndOfStream
I libri di ioPROGRAMMO/60 script amministrativi per Windows

69

60 SCRIPT AMMINISTRATIVI

per Windows

Verificare se un giorno equivale ad un weekend

CurrentUserDN = LeggiFile.ReadLine On Error Resume Next Set objUser = GetObject("LDAP://" & CurrentUserDN) If Err.Number <> 0 Then LogFile.WriteLine CurrentUserDN & " ERRORE" Else objUser.AccountExpirationDate = ExpireDate objUser.SetInfo ' Scrivi nel log LogFile.WriteLine CurrentUserDN & " Expire Date " & ExpireDate End If Loop LogFile.Close LeggiFile.Close Set FSO = Nothing Set LogFile = Nothing Set LeggiFile = Nothing Set objUser = Nothing

VERIFICARE SE UN GIORNO EQUIVALE AD UN WEEKEND


Ecco un comodissimo script che consente di recuperare il giorno di una settimana per consentire dintraprendere le giuste azioni. Questo script, in particolare, utile per comprendere ed apprezzare loggetto Dictionary di VBS, utilizzato anche in altri script ed in questa sede in luogo delle apposite costanti messe
70
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Verificare se un giorno equivale ad un weekend

60 SCRIPT AMMINISTRATIVI

per Windows

a disposizione da VBScript.
Option Explicit Dim DataDaControllare Dim DictWeek ' Data da controllare

' Oggetto Dictionary

' Crea la corrispondenza dei giorni della settimana Set DictWeek = CreateObject("Scripting.Dictionary") DictWeek.Add "DOMENICA", "1" DictWeek.Add "LUNEDI", "2" DictWeek.Add "MARTEDI", "3" DictWeek.Add "MERCOLEDI", "4" DictWeek.Add "GIOVEDI", "5" DictWeek.Add "VENERDI", "6" DictWeek.Add "SABATO", "7" ' Per controllare la data corrente sufficiente: DataDaControllare = now ' Controlla se DataDaControllare corrisponde ad un fine settimana If Weekday(DataDaControllare) = CInt(DictWeek("SABATO")) Or Weekday(DataDaControllare) = CInt(DictWeek("DOMENICA")) Then Msgbox "Fine settimana!",vbOkonly, "Informazione" Else Msgbox "Non un fine settimana!",vbOkonly, "Informazione" End If Set DictWeek = Nothing

I libri di ioPROGRAMMO/60 script amministrativi per Windows

71

60 SCRIPT AMMINISTRATIVI

per Windows

Elencare gli utenti di un gruppo locale specificato

ELENCARE GLI UTENTI DI UN GRUPPO LOCALE SPECIFICATO


Questo problema ossia quello di rilevare gli utenti appartenenti ad un gruppo locale, certamente un classico. In questo script stato predisposto anche il parametro GRP che consente di passare al programma il nome del gruppo da controllare. Queste poche righe di codice sono importanti anche perch viene mostrato come scandire i parametri passati ad un VBS utilizzando le propriet ed i metodi delloggetto Wscript.
Option Explicit Dim strComputer ' Computer sul quale operare Dim Messaggio ' Generico messaggio Dim Gruppo Dim Account ' Gruppo su cui operare ' Generico membro del gruppo

Dim LocalGroup ' Oggetto GROUP ' Lanciare lo script con il parametro /GRP:<Nome del gruppo> ' Per default viene impostato Administrators strComputer = "." Gruppo = "Administrators" ' Controlla se stato specificato il gruppo If Wscript.Arguments.Named.Exists("GRP") Then Gruppo = Wscript.Arguments.Named("GRP") End If Set LocalGroup = GetObject("WinNT://" & strComputer & "/" & Gruppo & ",group") Messaggio = "Elenco dei membri del gruppo " & Gruppo & vbCrlf & vbCrlf

72

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Leggere una chiave del Registry sul sistema locale

60 SCRIPT AMMINISTRATIVI

per Windows

' Crea la stringa con l'elenco degli account locali For Each Account In LocalGroup.Members Messaggio = Messaggio & Account.Name & vbcrlf Next ' Mostra a video l'elenco degli amministratori locali Messaggiobox Messaggio Set LocalGroup = Nothing

LEGGERE UNA CHIAVE DEL REGISTRY SUL SISTEMA LOCALE


Ecco un semplice script per leggere dati dal Registry. In particolare, in questo esempio, abbiamo preso in considerazione due chiavi del Registry che consentono di rilevare la versione dellantivirus McAfee e quella del DAT. In questesempio il tipo di chiave da leggere, in entrambi i casi, REG_SZ e, per questa ragione, stato sufficiente il metodo RegRead() delloggetto Wscript.Shell. In casi pi particolari, come avremo modo di verificare in seguito, questoggetto non pu tornarci utile e dovremo ricorrere, ancora una volta, a WMI.
Option Explicit Dim WSHShell Dim RegKey Dim VirDef Dim EngineVer ' Oggetto WShell ' Chiave del Registry ' Virus Definition ' Engine Version

' Imposta la chiave per leggere le informazioni su McAfee Set WSHShell = CreateObject("WScript.Shell")
I libri di ioPROGRAMMO/60 script amministrativi per Windows

73

60 SCRIPT AMMINISTRATIVI

per Windows

Leggere una chiave del Registry su un sistema remoto

RegKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\TVD\Shared Components\VirusScan Engine\4.0.xx\" ' Leggi le informazioni che trovi nel Registry VirDef = WSHShell.RegRead(RegKey & "szVirDefVer") EngineVer = WSHShell.RegRead(RegKey & "szEngineVer") Wscript.Echo "Engine Version: " & vbTab & EngineVer & vbCrlf & "Virus Definition: " & vbTab &VirDef Set WSHShell = Nothing

LEGGERE UNA CHIAVE DEL REGISTRY SU UN SISTEMA REMOTO


Questo script simile al precedente per quanto riguarda lobiettivo da raggiungere, ma presenta due particolarit: legge il Registry su pi macchine remote e genera un log con le informazioni ottenute. In particolare, per la lettura delle chiavi szVirDefVer e szEngineVer si serve della classe WMI StdRegProv che vedremo essere pi potente dellanalogo oggetto visto nello script precedente.
Option Explicit Dim WSHShell Dim RegKey Dim VirDef Dim EngineVer Dim FSO Dim LeggiFile ' Oggetto WShell ' Chiave del Registry ' Virus definition ' Engine Version ' Oggetto FSO ' Puntatore al file contenente l'elenco dei server

74

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Leggere una chiave del Registry su un sistema remoto

60 SCRIPT AMMINISTRATIVI

per Windows

Dim LogFile Dim ServerCorrente Dim rRegistry Dim strKeyPath

' Puntatore al file di log ' Generico server ' Oggetto WMI ' Percorso del Registry ove reperire le info = &H80000000 ' Non usata qui = &H80000001 ' Non usata qui = &H80000002 = &H80000003 ' Non usata qui

Const HKEY_CLASSES_ROOT Const HKEY_CURRENT_USER Const HKEY_LOCAL_MACHINE Const HKEY_USERS

Const HKEY_CURRENT_CONFIG = &H80000005 ' Non usata qui VirDef = "szVirDefVer" EngineVer = "szEngineVer" ' Preleva l'elenco dei server su cui effettuare il controllo Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Controlla se il file di log esiste o occorre crearlo If (FSO.FileExists("ReportMcAfee.csv")) Then Set LogFile = FSO.OpenTextFile("ReportMcAfee.csv",8) Else Set LogFile = FSO.CreateTextFile("ReportMcAfee.csv", True) End If ' CHIAVE DA LEGGERE: ' HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\TVD\Shared Components\VirusScan Engine\4.0.xx\ ' ->szVirDefVer ' ->szEngineVer

I libri di ioPROGRAMMO/60 script amministrativi per Windows

75

60 SCRIPT AMMINISTRATIVI

per Windows

Leggere una chiave del Registry su un sistema remoto

' Leggi il file con l'elenco dei server e, per ognuno, leggi ' le informazioni che trovi nel Registry LogFile.WriteLine "SERVER;VIRUS DEFINITION; ENGINE VERSION" Do While Not LeggiFile.AtEndOfStream ServerCorrente = LeggiFile.ReadLine Set rRegistry = GetObject("winmgmts:{impersonationLevel =impersonate}//" & _ ServerCorrente & "/root/default:StdRegProv") strKeyPath = "SOFTWARE\Network Associates\TVD\Shared Components\VirusScan Engine\4.0.xx" rRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,VirDef,VirDef rRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,EngineVer,EngineVer LogFile.WriteLine ServerCorrente & ";" & VirDef & ";" & EngineVer & ";" Loop LogFile.Close LeggiFile.Close Set WSHShell = Nothing Set FSO = Nothing Set LeggiFile = Nothing Set LogFile = Nothing Set rRegistry = Nothing

76

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Disabilitare le Administrative Shares

60 SCRIPT AMMINISTRATIVI

per Windows

DISABILITARE LE ADMINISTRATIVE SHARES


Le share amministrative, com facile intuire, rappresentano delle condivisioni nascoste che vengono precaricate allavvio di un sistema proprio per consentire di effettuare operazioni amministrative sulle macchine. In realt, per, questo genere di condivisioni, in alcuni ambienti, sono inutili e, comunque, costituiscono per certi versi un punto debole della sicurezza del sistema stesso. Comunque sia, per evitare che vengano ripristinate ad ogni riavvio del sistema, possiamo disabilitarle intervenendo direttamente sul registro di sistema. La procedura varia leggermente a seconda se la macchina un server o una workstation.
Option Explicit Dim strComputer Dim objWMIService Dim colOperatingSystems Dim objOperatingSystem Dim WshShell Dim strAdminShare Dim SystemType ' Computer sul quale operare ' Oggetto WMI ' Collection d'informazioni sul sistema operativo ' Item della collection colOperatingSystem ' Oggetto WShell ' Chiave del Registry con le impostazioni delle share amministrative ' Identifica il tipo di sistema

Const HKEY_LOCAL_MACHINE = &H80000002 strComputer = "." Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colOperatingSystems = objWMIService.ExecQuery("Select
I libri di ioPROGRAMMO/60 script amministrativi per Windows

77

60 SCRIPT AMMINISTRATIVI

per Windows

Disabilitare le Administrative Shares

ProductType from Win32_OperatingSystem") For Each objOperatingSystem In colOperatingSystems SystemType = objOperatingSystem.ProductType Next ' Per poter disabilitare le Administrative share occorre impostare opportunamente una ' chiave del Registry in questo modo: ' - SERVER ' ' Hive: HKEY_LOCAL_MACHINE ' Key: SYSTEM\CurrentControlSet\Services\LanManServer\Parameters ' Name: AutoShareServer ' Data Type: REG_DWORD ' Value: 0 ' ' - WORKSTATION ' ' Hive: HKEY_LOCAL_MACHINE ' Key: SYSTEM\CurrentControlSet\Services\LanManServer\Parameters ' Name: AutoShareWks ' Data Type: REG_DWORD ' Value: 0 Set WshShell = Wscript.CreateObject("Wscript.Shell") ' Determina se il sistema un SERVER o una WORKSTATION Select Case SystemType Case 1: ' Il sistema una WORKSTATION

78

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Disabilitare le Administrative Shares

60 SCRIPT AMMINISTRATIVI

per Windows

On Error Resume Next ' Leggi le impostazioni dal Registry strAdminShare = WshShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Services\" _ & "LanManServer\Parameters\AutoShareWks") If Err.Number <> 0 Or strAdminShare = "1" Then ' La chiave non esiste.... Tento di risolvere creandola /impostandola Err.clear WshShell.RegWrite "HKLM\SYSTEM\CurrentControlSet\Services\" _ & "LanManServer\Parameters\AutoShareWks",0, "REG_DWORD" End If Case Else ' Il sistema operativo un SERVER On Error Resume Next ' Leggi le impostazioni dal Registry strAdminShare = WshShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Services\" _ & "LanManServer\Parameters\AutoShareServer") If Err.Number <> 0 Or strAdminShare = "1" Then ' La chiave non esiste.... Tento di risolvere creandola /impostandola Err.clear WshShell.RegWrite "HKLM\SYSTEM\CurrentControlSet\Services\" _
I libri di ioPROGRAMMO/60 script amministrativi per Windows

79

60 SCRIPT AMMINISTRATIVI

per Windows

Leggere un file INI

& "LanManServer\Parameters\AutoShareServer",0, "REG_DWORD" End If End Select Set WshShell = Nothing Set objWMIService = Nothing Set colOperatingSystems = Nothing Set objOperatingSystem = Nothing

LEGGERE UN FILE INI


I file .INI non credo abbiamo bisogno di particolari spiegazioni. Erano molto utilizzati con versioni precedenti di Windows, ma tuttora, in alcune realt, sono ancora presenti. In ogni caso, lo script che segue permette di leggere i valori di un qualunque parametro di un file .INI e, sebbene possa sembrare superfluo, la tecnica utilizzata potrebbe tornare utile in altre occasioni.
Option Explicit Dim FSO Dim Sezione Dim Parametro Dim ValParametro Dim Riga Dim SezioneTrovata Dim ParamTrovato Dim LeggiFile ' Oggetto File System Object ' Sezione del file .INI ' Parametro relativo alla sezione considerata ' Valore del parametro letto ' Generica riga del file .INI ' Flag per determinare se la sezione richiesta stata trovata ' Flag per determinare se il parametro richiesto stata trovato ' Puntatore al file .INI

80

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Leggere un file INI

60 SCRIPT AMMINISTRATIVI

per Windows

Sezione = "SEZIONE A" Parametro = "Param1" SezioneTrovata = 0 ParamTrovato = 0 ' Apriamo il file da leggere Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("Configurazione.ini") Parametro = Parametro & "=" Do While (Not LeggiFile.AtEndOfStream) And ParamTrovato = 0 Riga = LeggiFile.ReadLine ' Wscript.Echo Riga If SezioneTrovata = 1 Then ' La sezione stata trovata. Cerchiamo il parametro ' Fermati se incontri prima un'altra sezione. Questo ' significherebbe che il parametro non esiste. If MID(Riga,1,1) = "[" Then Wscript.Echo "Il parametro selezionato non esiste!" Wscript.quit End If ' Cerca all'inizio della riga corrente If Mid(Riga,1,Len(Parametro)) = Parametro Then ValParametro = Mid(Riga,Len(Parametro)+1,Len(Riga)Len(Parametro)) Wscript.Echo "Il parametro " & Parametro & " ha valore " &ValParametro ParamTrovato = 1 End If

I libri di ioPROGRAMMO/60 script amministrativi per Windows

81

60 SCRIPT AMMINISTRATIVI

per Windows

Scrivere in un file INI

End If ' Controlla se la sezione l'abbiamo gi trovata If SezioneTrovata = 0 Then If Riga = "[" & Sezione & "]" Then ' Ho trovato la sezione. Cerchiamo ora il parametro SezioneTrovata = 1 End If End If Loop ' Visualizza un messaggio di errore nel caso di esito negativo If SezioneTrovata = 0 Then Wscript.Echo "Ricerca sezione fallita!" End If If ParamTrovato = 0 Then Wscript.Echo "Ricerca parametro fallita!" End If LeggiFile.Close Set FSO = Nothing Set LeggiFile = Nothing

SCRIVERE IN UN FILE INI


Nello script precedente abbiamo visto come leggere un qualunque file .INI. In questo script viene mostrato come modificarne uno o, meglio, come modificare il valore di un parametro. Malgrado i file .INI siano meno utilizzati di una volta, questo script offre a tutti un valido iuto per comprendere quale possa essere la tecnica per modificare un qualunque file da VBS.
82
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Scrivere in un file INI

60 SCRIPT AMMINISTRATIVI

per Windows

Option Explicit Dim FSO Dim Sezione Dim Parametro Dim Riga Dim NuovoValore Dim FileINI Dim FileINI2 ' Oggetto File System Object ' Sezione da modificare ' Parametro da modificare ' Riga corrente ' Nuovo valore da impostare ' Stringa che contiene il percorso al file INI ' Stringa che contiene il percorso al nuovo file INI ' (quello che riporter le modifiche) Dim ParamTrovato Dim SezioneTrovata Dim LeggiFile Dim NewFileINI ' Flag che indica che il parametro stato trovato ' Flag che indica che la sezione stata trovato ' Puntatore al file .INI ' Puntatore al nuovo file .INI

Sezione = "SEZIONE B" Parametro = "Param1" NuovoValore = "NEW_VAL2" SezioneTrovata = 0 ParamTrovato = 0 FileINI = "Configurazione.ini" FileINI2 = "Configurazione.new" ' Apriamo il file da leggere Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile(FileINI)

I libri di ioPROGRAMMO/60 script amministrativi per Windows

83

60 SCRIPT AMMINISTRATIVI

per Windows

Scrivere in un file INI

' Crea una copia di backup del file INI originale FSO.CopyFile FileINI, "Configurazione.ori" ' Crea un nuovo file .INI che conterr la modifica ' Se ne trovi gi uno, eliminalo If (FSO.FileExists(FileINI2)) Then FSO.DeleteFile FileINI2 End If Set NewFileINI = FSO.CreateTextFile(FileINI2,True) Parametro = Parametro & "=" ' Cerchiamo il parametro da modificare Do While (Not LeggiFile.AtEndOfStream) Riga = LeggiFile.ReadLine If SezioneTrovata = 1 And ParamTrovato = 0 Then ' La sezione stata trovata. Cerchiamo il parametro ' Fermati se incontri prima un'altra sezione. Questo ' significherebbe che il parametro non esiste. If MID(Riga,1,1) = "[" Then Wscript.Echo "Il parametro selezionato non esiste!" Wscript.quit End If ' Cerca all'inizio della riga corrente If Mid(Riga,1,Len(Parametro)) = Parametro And ParamTrovato = 0 Then ParamTrovato = 1 ' Imposta il nuovo valore

84

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Scrivere in un file INI

60 SCRIPT AMMINISTRATIVI

per Windows

Riga = Parametro & NuovoValore End If End If ' Controlla se la sezione l'abbiamo gi trovata If SezioneTrovata = 0 Then If Riga = "[" & Sezione & "]" Then ' Ho trovato la sezione. Cerchiamo ora il parametro SezioneTrovata = 1 End If End If ' Scrivi la riga nel nuovo file NewFileINI.WriteLine Riga Loop ' Visualizza il messaggio nel caso di esito negativo If SezioneTrovata = 0 Then Wscript.Echo "Ricerca sezione fallita!" Wscript.Quit End If ' Adesso elimina il vecchio file INI e rinomina il nuovo Set LeggiFile = Nothing FSO.DeleteFile FileINI Set newFileINI = Nothing FSO.MoveFile FileINI2, FileINI LeggiFile.Close

I libri di ioPROGRAMMO/60 script amministrativi per Windows

85

60 SCRIPT AMMINISTRATIVI

per Windows

Ricercare e disinstallare un programma

Set FSO = Nothing Set LeggiFile = Nothing

RICERCARE E DISINSTALLARE UN PROGRAMMA


Spesso pu essere necessario rimuovere un determinato software che si scoperti essere stato installato clandestinamente. Lo script necessita della stringa precisa del programma incriminato, ottenuta attraverso lutilizzo della classe WMI Win32_Product. Attraverso unopportuna query WMI su questa classe e mediante il metodo Uninstall(), il programma pu essere disnistallato dal sistema.
Option Explicit Dim strComputer Dim objWMIService Dim colSoftware Dim objSoftware ' Computer sul quale operare ' Oggetto WMI ' Collection dei software installati ' Generico item della collection colSoftware ' Nome del programma da disinstallare

Dim NomeProgramma strComputer = "."

NomeProgramma = "<Inserire qui la stringa che identifica il software>" ' Rileva tutti i software installati che corrispondono a quello richiesto Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colSoftware = objWMIService.ExecQuery("Select * FROM Win32_Product WHERE " _

86

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Comparare due file

60 SCRIPT AMMINISTRATIVI

per Windows

& "Name = '" & NomeProgramma & "'") ' Controlla se il programma esiste. Se esiste, allora disinstallalo If colSoftware.Count = 0 Then WScript.Echo "Il programma indicato non stato rilevato." Else ' Disinstalla il programma For Each objSoftware In colSoftware objSoftware.Uninstall() Next ' Verifica che il programma sia stato realmente eliminato Set colSoftware = objWMIService.ExecQuery("Select * FROM Win32_Product WHERE " _ & "Name = '" & NomeProgramma & "'") ' Invia un messaggio If colSoftware.Count = 0 Then Wscript.Echo "Il programma stato rimosso" End If Set objWMIService = Nothing Set colSoftware = Nothing Set objSoftware = Nothing

COMPARARE DUE FILE


Ecco un semplice script che consente di comparare due file. Esso, in realt, sfrutta un tool esterno offerto da Windows e denominato FC (File Compare). Questo codice, come alcuni altri presenti nel libro, offrono un valido spunto per comprendere come possa essere letto loutput di un comando esterno avviato da uno
I libri di ioPROGRAMMO/60 script amministrativi per Windows

87

60 SCRIPT AMMINISTRATIVI

per Windows

Comparare due file

script VBS e comportarsi di conseguenza. Lunica, forse, pecca di tutto questo meccanismo che occorre conoscere a priori il tipo di output che il tool utilizzato produrr. Nellesempio, infatti, si tenuto conto che lo script venga avviato su una macchina Windows XP ITA e che di conseguenza il messaggio ritornato dal comando FC nel caso i due file di input siano uguali, contenga la stringa nessuna differenza riscontrata. Malgrado ci possa sembrare una limitazione, si deve tener conto che in realt medie il sistema operativo installato , al 90%, lo stesso.
Option Explicit Dim FileA Dim FileB Dim OutCompare Dim objWshShell ' Primo file da comparare ' Secondo file da comparare ' Output del comando FC ' Oggetto WShell ' Stringa di conferma del tool FC

Dim cmdToolCompare' Comando da avviare per la comparazione Dim StringaDiConferma FileA = "File1.txt" FileB = "File2.txt" StringaDiConferma = "nessuna differenza riscontrata" Set objWshShell = CreateObject("WScript.Shell") ' Imposta il comando da lanciare cmdToolCompare = "fc " & FileA & " " & FileB OutCompare = objWshShell.Exec(cmdToolCompare).StdOut.ReadAll() ' Se la stringa di conferma esiste, allora i file sono uguali ' In caso contrario, verranno mostrate le differenze

88

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Ricercare una stringa allinterno di una cartella

60 SCRIPT AMMINISTRATIVI

per Windows

If Instr(OutCompare, StringaDiConferma) <> 0 Then Msgbox "OK. I fle sono uguali" Else Msgbox "NOT OK. I file non sono uguali" End If Set objWshShell = Nothing

RICERCARE UNA STRINGA ALLINTERNO DI UNA CARTELLA


Come lo script precedente, ecco un altro esempio che mostra come sfruttare la potenza di tool esterni ed il linguaggio VBS.
Option Explicit Dim colFiles Dim Folder Dim OutFindstr Dim objWshShell ' Gruppo di file su cui operare ' Stringa da cercare ' Cartella all'interno della quale cercare ' Output del comando FC ' Oggetto WShell ' Stringa di conferma del tool FC

Dim StringaDaCercare

Dim cmdToolCompare' Comando da avviare per la comparazione Dim StringaDiConferma Dim FSO Dim LogFile Dim Occorrenze ' Oggetto File System Object ' Puntatore al file che conterr i risultati ' Flag che indica se stato trovato almeno un file ' contenente la stringa indicata Dim FileCorrente Folder = "C:\Temp" colFiles = "*.log" StringaDaCercare = "LIPPO"
I libri di ioPROGRAMMO/60 script amministrativi per Windows

' Generico file che contiene la stringa da cercare

89

60 SCRIPT AMMINISTRATIVI

per Windows

Ricercare una stringa allinterno di una cartella

Occorrenze = 1 Set objWshShell = CreateObject( "WScript.Shell" ) ' Imposta il comando da lanciare per la ricerca ' Il parametro /M stampa solo il nome file, comprensivo ' di path, non appena viene trovata la prima corrispondenza cmdToolCompare = "FINDSTR /M " & StringaDaCercare & " " & Folder & "\" & colFiles OutFindstr = objWshShell.Exec(cmdToolCompare).StdOut.ReadAll() ' Se non stato trovato nulla... If Len(OutFindstr) = 0 Then Occorrenze = 0 Msgbox "Nessuna occorrenza trovata" End If If Occorrenze = 1 Then ' Adesso creati un file temporaneo per i risultati Set FSO = CreateObject("Scripting.FileSystemObject") ' Controlliamo l'esistenza del file di log If (FSO.FileExists("CheckString.log")) Then Set LogFile = FSO.OpenTextFile("CheckString.log",8) Else Set LogFile = FSO.CreateTextFile("CheckString.Log", True) End If ' Scriviamo il contenuto dell'output del comando ' di ricerca nel file di log per analizzarlo in ' seguito. LogFile.WriteLine OutFindstr

90

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Informazioni sugli attributi di un file

60 SCRIPT AMMINISTRATIVI

per Windows

' Impostiamo la modalit di lettura Set LogFile = FSO.OpenTextFile("CheckString.log") ' Leggi il file di output Do While Not LogFile.AtEndOfStream FileCorrente = LogFile.ReadLine ' Ora hai il nome di un file che contiene la stringa indicata. ' Fa qualcosa... ' ... Loop End If LogFile.Close Set objWshShell = Nothing Set FSO = Nothing Set LogFile = Nothing

INFORMAZIONI SUGLI ATTRIBUTI DI UN FILE


Questo un semplicissimo script al quale viene passato il nome di un file, completo di path e viene visualizzato a video lelenco degli attributi. Lo script controlla sia lesistenza del file sia la possibilit che il parametro passato corrisponda ad una directory.
Option Explicit ' ---------------------------------------------------------------------------------' ATTRIBUTI: '
I libri di ioPROGRAMMO/60 script amministrativi per Windows

91

60 SCRIPT AMMINISTRATIVI

per Windows

Informazioni sugli attributi di un file

' Normal ' ReadOnly ' Hidden ' System ' Volume ' Directory ' Archive ' Alias

0 1 2 4 8

Normal file. No Attributes are Set. Read-only file. Attribute Is read/write. Hidden file. Attribute Is read/write. System file. Attribute Is read/write. Disk drive volume label. Attribute Is read-only.

16 Folder Or directory. Attribute Is read-only. 32 File has changed since last backup. Attribute is read/write. 64 Link Or shortcut. Attribute Is read-only. 2048 Compressed file. Attribute Is read-only.

' Compressed

' ---------------------------------------------------------------------------------' Lanciare lo script con il parametro /F seguito dal nome del file. ' Ad esempio: cscript <Nome script> /F:<Nome file> ' ---------------------------------------------------------------------------------Dim FSO Dim objFile Dim FileName ' Oggetto File System Object ' Attributi del file ' Oggetto File sul quale operare ' Nome del file

Dim ElencoAttributi

' Controlla se stato passato il file If WScript.Arguments.Named("F") = "" Then Wscript.Echo "E' necessario specificare un file come parametro" WScript.Quit Else FileName = WScript.Arguments.Named("F") End If Set FSO = CreateObject("Scripting.FileSystemObject") ' Controlla se il file passato esiste If Not FSO.FileExists(FileName) Then

92

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Informazioni sugli attributi di un file

60 SCRIPT AMMINISTRATIVI

per Windows

' Controlla che se per caso una directory If Not(FSO.FolderExists(FileName)) Then WScript.Echo "Il parametro passato non n un file n una directory" WScript.Quit Else Set objFile = FSO.GetFolder(FileName) End If Else Set objFile = FSO.GetFile(FileName) End If ' Mostra l'elenco degli attributi ElencaAttributi objFile Set FSO = Nothing Set objFile = Nothing Sub ElencaAttributi(objFile2) ' Attributi del file. Alcuni sono di sola lettura, altri di lettura/ scrittura ' HIDDEN If (objFile2.Attributes And 2) Then ElencoAttributi = ElencoAttributi & "H" End If ' READ ONLY If (objFile2.Attributes And 1) Then ElencoAttributi = ElencoAttributi & "R" End If ' SYSTEM If (objFile2.Attributes And 4) Then ElencoAttributi = ElencoAttributi & "S" End If
I libri di ioPROGRAMMO/60 script amministrativi per Windows

93

60 SCRIPT AMMINISTRATIVI

per Windows

Avviare uninstallazione remota

' VOLUME If (objFile2.Attributes And 8) Then ElencoAttributi = ElencoAttributi & "V" End If ' DIRECTORY If (objFile2.Attributes And 16) Then ElencoAttributi = ElencoAttributi & "D" End If ' ARCHIVE If (objFile2.Attributes And 32) Then ElencoAttributi = ElencoAttributi & "A" End If ' ALIAS If (objFile2.Attributes And 64) Then ElencoAttributi = ElencoAttributi & "L" End If ' COMPRESSED If (objFile2.Attributes And 2048) Then ElencoAttributi = ElencoAttributi & "C" End If ElencoAttributi = "Attributi: " & ElencoAttributi Msgbox ElencoAttributi End Sub

AVVIARE UNINSTALLAZIONE REMOTA


Unesigenza ricorrente in un ambiente di rete quella dinstal94
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Avviare uninstallazione remota

60 SCRIPT AMMINISTRATIVI

per Windows

lare pacchetti relativi a hotfix e patch che la Microsoft periodicamente rilascia. Se non abbiamo a disposizione server predisposti a questoperazione o, semplicemente vogliamo occuparcene noi, ecco un esempio di come possiamo avviare uninstallazione remota di un applicativo contenuto allinterno di una cartella del server. Malgrado possa sembra uno script scontato si tenga presente che per poter avviare un eseguibile che agisca su di un sistema remoto, non possiamo utilizzare i metodi e gli oggetti visti sinora, ma occorre creare proprio un processo sulla macchina remota. Questa sottigliezza importantissima perch se provassimo ad eseguire metodi Exec() o Run() di oggetti Shell, riscontreremmo risultati inaspettati. La creazione di un processo un procedimento piuttosto semplice e, se sfruttato bene, pu dare molte soddisfazioni.
Option Explicit Dim Utente Dim Password Dim FSO Dim LeggiFile Dim LogFile Dim ServerCorrente Dim objLocator Dim objSvc Dim Processo Dim intProcessID Dim Programma Dim Result ' Nome utente per l'accesso al sistema ' Password dell'utente ' Oggetto File System Object ' File di input contenente i server a cui collegarsi ' File di log ' Server corrente su cui operare ' Oggetto WMI ' Oggetto WMI ' Generico processo ' ID del nuovo processo creato ' Stringa con il path del programma da avviare ' Risultato della creazione del processo

' Imposta i dati relativi alle credenziali da utilizzare Utente = "MyDomain\flippo"


I libri di ioPROGRAMMO/60 script amministrativi per Windows

95

60 SCRIPT AMMINISTRATIVI

per Windows

Avviare uninstallazione remota

Password = "MyPassword" ' Imposta la stringa relativa al programma da installare Programma = "C:\Programmi\MyApp\Setup.exe /silent" ' Preleva l'elenco dei server su cui effettuare il controllo Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Controlla se il file di log esiste o occorre crearlo If (FSO.FileExists("CheckInstall.log")) Then Set LogFile = FSO.OpenTextFile("CheckInstall.log",8) Else Set LogFile = FSO.CreateTextFile("CheckInstall.Log", True) End If LogFile.WriteLine "SERVER;RESULT" ' Leggi il file con l'elenco dei server e, per ognuno avvia ' l'installazione del programma Do While Not LeggiFile.AtEndOfStream ServerCorrente = LeggiFile.ReadLine On Error Resume Next ' Connettiti al server remoto e avvia il programma Set objLocator = CreateObject("WbemScripting.SwbemLocator") Set objSvc = objLocator.ConnectServer(ServerCorrente, "root\cimv2", Utente, Password) Set Processo = objSvc.Get("Win32_Process") Result = Processo.Create(Programma, Null, Null, intProcessID)

96

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Rinominare tutti i file di una cartella

60 SCRIPT AMMINISTRATIVI

per Windows

If Result = 0 Then LogFile.WriteLine ServerCorrente & ";OK" Else LogFile.WriteLine ServerCorrente & ";ERRORE" End If Loop LeggiFile.Close LogFile.Close Set FSO = Nothing Set LeggiFile = Nothing Set LogFile = Nothing Set objLocator = Nothing Set objSvc = Nothing Set Processo = Nothing

RINOMINARE TUTTI I FILE DI UNA CARTELLA


Come fa intuire il nome stesso, questo script permette di rinominare tutti i file di un certo tipo contenuti allinterno di una certa cartella.
Option Explicit Dim FSO Dim SourceFolder Dim colFiles Dim NumberSuffix ' Oggetto File System Object ' Directory sorgente ' Collection di file ' Numero iniziale da impostare come suffisso
I libri di ioPROGRAMMO/60 script amministrativi per Windows

97

60 SCRIPT AMMINISTRATIVI

per Windows

Rinominare tutti i file di una cartella

Dim FileExt Dim objFile Dim FilePrefix Dim NewFileName

' Estensione dei file ' Oggetto "file" ' Prefisso dei nuovi file ' Nuovo nome del file

' Definisci la cartella sulla quale agire SourceFolder = "E:\" ' Definisci il prefisso dei file FilePrefix = "Foto_" ' Definisci il numero da cui cominciare NumberSuffix = 3 ' Definisci l'estensione dei file sui quali operare FileExt = "txt" ' Controlla se la cartella passata come parametro esiste... Set FSO = CreateObject("Scripting.FileSystemObject") If FSO.FolderExists(SourceFolder) Then Set colFiles = FSO.GetFolder(SourceFolder) Else Wscript.Echo "La cartella specificata non esiste" Wscript.Quit End If ' Comincia a rinominare i file For Each objFile In colFiles.Files If FSO.GetExtensionName(objFile) = FileExt Then ' Fa attenzione ai file che si trovano sulla root delle partizioni ' come C:\, D:\, ecc... In tal caso non aggiungere il '\'. If Right(objFile.ParentFolder,1) <> "\" Then

98

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Rinominare/Spostare una cartella su pi server

60 SCRIPT AMMINISTRATIVI

per Windows

NewFileName = objFile.ParentFolder & "\" & FilePrefix & NumberSuffix & FileExt Else NewFileName = objFile.ParentFolder & FilePrefix & NumberSuffix & FileExt End If FSO.MoveFile objFile.Path, NewFileName NumberSUffix = NumberSuffix + 1 End If Next Set FSO = Nothing Set objFile = Nothing

RINOMINARE/SPOSTARE UNA CARTELLA SU PI SERVER


Questo script sposta semplicemente una cartella sorgente in un altro punto del disco ed effettua loperazione su diversi server.
Option Explicit Dim FSO Dim SourceFolder Dim LeggiFile Dim LogFile Dim ServerCorrente Dim DestinationFolder2 ' Oggetto File System Object ' Directory sorgente ' Directory destinataria ' Puntatore al file contenente la lista dei server ' Puntatore al file di log ' Generico server su cui operare ' Directory destinataria impostata secondo la convenzione UNC ' Definisci la cartella da copiare
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Dim DestinationFolder

99

60 SCRIPT AMMINISTRATIVI

per Windows

Rinominare/Spostare una cartella su pi server

SourceFolder = "C:\SourceFolder" DestinationFolder = "C:\DestFolder" ' Leggi il file che contiene l'elenco dei server su cui copiare ' la cartella Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Sostituisci alla dicitura del tipo C: quella tipo C$ (administrative share) DestinationFolder = Replace(DestinationFolder,":","$") ' Controlla se necessario creare il file di log If (FSO.FileExists("ReportMove.log")) Then Set LogFile = FSO.OpenTextFile("ReportMove.log",8) Else Set LogFile = FSO.CreateTextFile("ReportMove.Log", True) End If ' Leggi il file contenente i server su cui copiare la cartella Do While Not LeggiFile.AtEndOfStream ' Determina il server corrente ServerCorrente = LeggiFile.ReadLine ' Determina la directory di destinazione DestinationFolder2 = "\\" & ServerCorrente & "\" & DestinationFolder On Error Resume Next ' Copia la cartella sul server corrente FSO.MoveFolder SourceFolder,DestinationFolder2

100

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Abilitare le NULL Session Share

60 SCRIPT AMMINISTRATIVI

per Windows

If Err.Number <> 0 Then LogFile.WriteLine (ServerCorrente & " Errore! (" & Err.Description & ")") Err.clear Else LogFile.WriteLine (ServerCorrente & " OK!") End If DestinationFolder2 = DestinationFolder Loop LeggiFile.Close LogFile.Close Set FSO = Nothing Set LeggiFile = Nothing Set LogFile = Nothing

ABILITARE LE NULL SESSION SHARE


Non questa la sede per affrontare largomento delle Null Session Share, ma certamente lo script che state per leggere importante per comprendere come operare sulle chiavi del Registry del tipo REG_MULTI_SZ utilizzando la classe WMI vista in alcuni script precedenti. Come sottolineato in testa allo script, maggiori informazioni riguardo questo argomento le potete ottenere direttamente dal sito della Microsoft e precisamente in corrispondenza di http://support.microsoft.com/?scid=kb%3Benus%3B289655&x=19&y=11. Il testo parziale dei passi suggeriti da MS stato inserito come commento allinterno del codice per consentirne una maggiore e pi rapida comprensione.
Option Explicit
I libri di ioPROGRAMMO/60 script amministrativi per Windows

101

60 SCRIPT AMMINISTRATIVI

per Windows

Abilitare le NULL Session Share

' Ecco i passi da eseguire "manualmente" per abilitare le null session (fonte MS) ' http://support.microsoft.com/?scid=kb%3 Ben-us%3B289655&x=19&y=11 ' ' 1. Start Registry Editor (Regedt32.exe). ' 2. Locate the following key in the registry: ' HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanS erver\Parameters\NullSessionShares ' NOTE: NullSessionShares is a REG_MULTI_SZ value. share that you want ' To access with a Null session (For example, Public). locate the following key in the registry: ' HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ LanmanServer\Parameters\NullSessionPipes ' NOTE: NullSessionPipes Is a REG_MULTI_SZ value. ' On a new line in the NullSessionPipes key, type the name of the pipe that you want to access with a null session. ' 5. Locate And click the following key In the registry: ' HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA registry value: ' ' ' Value Name: RestrictAnonymous Data Type: REG_DWORD Value: 0 ' Computer sul quale agire ' 6. On the Edit menu, click Add Value, and then add the following ' 4. If the program uses named pipes and requires null session support, ' 3. On a new line In the NullSessionShares key, type the name of the

Dim strComputer

102

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Abilitare le NULL Session Share

60 SCRIPT AMMINISTRATIVI

per Windows

Dim objWMIService Dim WshShell Dim colNullSessionShare Dim colNullSessionShare2() Dim strKeyPath Dim oReg Dim Cont Dim ItemNullSessionShare

' Oggetto WMI ' Oggetto WShell ' Collection di Null Session Shares ' Array contenente la col lection precedente + il nuovo item ' Percorso nel Registry alle Null Session Share ' Oggetto Registry ' Contatore ' Generico item della collection di null session share

Const HKEY_LOCAL_MACHINE = &H80000002: strComputer = "." ' Crea gli oggetti per la lettura e scrittura del registry Set WshShell = Wscript.CreateObject("Wscript.Shell") strKeyPath = "System\CurrentControlSet\Services\LanmanServer\Parameters" Set oReg = GetObject("winmgmts:{impersonationLevel= impersonate}!\\" & strComputer & "\root\default:StdRegProv") ' Leggi le impostazioni dal Registry (ossia l'elenco delle Null Session Share) colNullSessionShare = WshShell.RegRead("HKEY_LOCAL_ MACHINE\System\CurrentControlSet\Services" _ & "\LanmanServer\Parameters\NullSessionShares") ' Copia ci che trovato in un nuovo array di appoggio
I libri di ioPROGRAMMO/60 script amministrativi per Windows

103

60 SCRIPT AMMINISTRATIVI

per Windows

Elencare le NULL Session Share

Cont = 0 For Each ItemNullSessionShare In colNullSessionShare Cont = Cont + 1 Redim Preserve colNullSessionShare2(Cont) colNullSessionShare2(Cont - 1) = ItemNullSessionShare Next ' Adesso ridimensiona l'array aggiungendo un altro elemento Redim Preserve colNullSessionShare2(Cont) ' Inserisci il nome della Null Session Share ed riscrivi la chiave colNullSessionShare2(Cont) = "SHARE_X$" oReg.SetMultiStringValue HKEY_LOCAL_MACHINE,strKeyPath,"NullSessionShares",colNullSessi onShare2 ' PS: Allo stesso modo si pu procedere per le Null Session Pipes... Set WshShell = Nothing Set objWMIService = Nothing Set colNullSessionShare = Nothing Set oReg = Nothing Set ItemNullSessionShare = Nothing

ELENCARE LE NULL SESSION SHARE


Dopo aver visto come abilitare le Null Session share in un sistema Windows, vediamo come elencare quelle gi presenti. Per semplicit, non stata inserita la porzione di codice relativa alla seconda chiave del Registry menzionata in testa allo script, ma il procedimento da seguire pressocch lo stesso di quello evi104
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Elencare le NULL Session Share

60 SCRIPT AMMINISTRATIVI

per Windows

denziato.
Option Explicit ' Ecco dove sono memorizzate le null session share e le null session pipes(fonte MS) ' http://support.microsoft.com/?scid=kb%3 Ben-us%3B289655&x=19&y=11 ' ' > NULL SESSION SHARE < ' HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Lanman Server\Parameters\NullSessionShares ' > NULL SESSION PIPES < ' HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Lanman Server\Parameters\NullSessionPipes Dim strComputer Dim objWMIService Dim WshShell ' Computer corrente ' Oggetto WMI ' Oggetto Shell

Dim colNullSessionShare ' Collection Null Session Share Dim colNullSessionPipes ' Collection Null Session Pipes Dim Cont ' Semplice contatore

Const HKEY_LOCAL_MACHINE = &H80000002 strComputer = "." Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

I libri di ioPROGRAMMO/60 script amministrativi per Windows

105

60 SCRIPT AMMINISTRATIVI

per Windows

Modificare la password di un utente su pi server

Set WshShell = Wscript.CreateObject("Wscript.Shell") ' Leggi le impostazioni dal Registry ' Null Session Share colNullSessionShare = WshShell.RegRead("HKEY_LOCAL_ MACHINE\System\CurrentControlSet\Services" _ & "\LanmanServer\Parameters\NullSessionShares") ' Elenca le Null Session Share For Cont = 0 To Ubound(colNullSessionShare) Wscript.Echo colNullSessionShare(Cont) Next colNullSessionPipes = WshShell.RegRead("HKEY_LOCAL_ MACHINE\System\CurrentControlSet\Services" _ & "\LanmanServer\Parameters\NullSessionPipes") ' Elenca le Null Session Pipes For Cont = 0 To Ubound(colNullSessionPipes) Wscript.Echo colNullSessionPipes(Cont) Next Set objWMIService = Nothing Set WshShell = Nothing

MODIFICARE LA PASSWORD DI UN UTENTE SU PI SERVER


Questo script consente di modificare la password di un utente locale presente su pi server. Allo stesso modo di quanto visto in precedenti script, questo preleva il nome del server su cui
106
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Modificare la password di un utente su pi server

60 SCRIPT AMMINISTRATIVI

per Windows

operare da un file dinput denominato ElencoServer.txt e per ciascun sistema rilevato, modifica la password servendosi di ADSI e, pi precisamente, del provider WinNT.
Option Explicit Dim Utente Dim FSO Dim LeggiFile Dim LogFile Dim objUser Dim ServerCorrente ' Utente da modificare Utente = "pippo" ' Preleva l'elenco dei server su cui effettuare il cambio password Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Controlla se il file di log esiste o occorre crearlo If (FSO.FileExists("CheckCambioPass.log")) Then Set LogFile = FSO.OpenTextFile("CheckCambioPass.log",8) Else Set LogFile = FSO.CreateTextFile("CheckCambioPass.Log", True) End If ' Leggi il file con l'elenco dei server Do While Not LeggiFile.AtEndOfStream ServerCorrente = LeggiFile.ReadLine On Error Resume Next
I libri di ioPROGRAMMO/60 script amministrativi per Windows

' Utente da modificare ' Oggetto File System Object ' File contenente i server su cui operare ' File di log ' Oggetto ADSI "user" ' Server corrente su cui operare

107

60 SCRIPT AMMINISTRATIVI

per Windows

Ottenere lelenco dei job schedulati

Set objUser = GetObject("WinNT://" & ServerCorrente & "/" & Utente, user) If Err <> 0 Then LogFile.WriteLine ServerCorrente & " Errore! " & Err.Description Err.Clear Else objUser.SetPassword "12345678" objUser.SetInfo LogFile.WriteLine ServerCorrente & " OK!" End If Loop Msgbox "Ho terminato" LeggiFile.Close LogFile.Close Set FSO = Nothing Set LeggiFile = Nothing Set LogFile = Nothing Set objUser = Nothing

OTTENERE LELENCO DEI JOB SCHEDULATI


Questo script elenca tutti i job schedulati su di un sistema semplicemente elencando tutti i file .JOB che si trovano nella cartella %WinDir%\Tasks. La directory dinstallazione di Windows pu essere ottenuta in vari modi. Qui stato sfruttato WMI. Un altro sistema utilizzare unistruzione del tipo WshShell.Expan108
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Ottenere lelenco dei job schedulati

60 SCRIPT AMMINISTRATIVI

per Windows

dEnvironmentStrings("%WINDIR%").
Option Explicit Dim PathJobSchedulati Dim strComputer Dim objWMIService Dim colItems Dim WindowsDir Dim FSO Dim Item Dim FolderObject Dim colFiles Dim file Dim ListaJob strComputer = "." ' Identifica la cartella ove installato Windows ' (questo uno dei vari metodi possibili). Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") Set colItems = objWMIService.ExecQuery("SELECT WindowsDirectory FROM Win32_OperatingSystem") ' Memorizza la cartella ove installato Windows For Each Item In colItems WindowsDir = Item.WindowsDirectory Next ' Preleva tutti i files nella directory %WINDIR%\Tasks PathJobSchedulati = WindowsDir & "\Tasks"
I libri di ioPROGRAMMO/60 script amministrativi per Windows

' Percorso della cartella relativa ai job schedulati

' Computer sul quale operare ' Oggetto WMI ' Collection d'informazioni sul computer ' Percorso installazione Windows ' Oggetto File System Object ' Generico item collection file .JOB ' Oggetto Folder ' Collection dei file .JOB ' Generico file della collection colFiles ' Lista dei file relativi ai job schedulati

109

60 SCRIPT AMMINISTRATIVI

per Windows

Ottenere la lista dei processi e dei relativi thread

Set FSO = CreateObject("Scripting.FileSystemObject") Set FolderObject = FSO.GetFolder(PathJobSchedulati) Set colFiles= FolderObject.Files ' Dalla collection files controlla se ci sono file .job If colFiles.count = 0 Then Wscript.Echo "Non ci sono job schedulati" Wscript.Quit End If For Each file In colFiles ' Se ci sono file .job If FSO.GetExtensionName(file) = "job" Then ListaJob = ListaJob & "--> " & file.Name & vbCrlf End If Next Wscript.Echo "Ecco l'elenco dei job" & vbCrlf & vbCrlf & ListaJob Set colFiles = Nothing Set FolderObject = Nothing Set FSO = Nothing Set objWMIService = Nothing Set colItems = Nothing

OTTENERE LA LISTA DEI PROCESSI E DEI RELATIVI THREAD


Chiunque di noi sa benissimo che ad ogni processo possono essere associati pi thread. Ovviamente ocorre un p di pazienza per ottenere la lista di queste associazioni, ma servendosi di
110
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Ottenere la lista dei processi e dei relativi thread

60 SCRIPT AMMINISTRATIVI

per Windows

due classi WMI, la Win32_Process e la Win32_Thread, queste informazioni sono abbastanza semplici da ottenere. Qui, peraltro, mostrata ancora una volta, la validit delloggetto Dictionary, utilissimo per tener traccia delle informazioni. Senza troppe complicazioni, lo script preleva la lista dei processi attivi mappando nome e ID del processo attraverso un oggetto Dictionary. Il secondo passo simile. Viene effettuata una query sulla collection di thread attivi e, sevendosi dellID del processo (una propriet di questi oggetti), possibile rilevare tramite il Dictionary, la corrispondenza cercata.
Option Explicit Dim ServerCorrente Dim objDict Dim objWMIService Dim colProcesses Dim objProcess Dim ProcessID Dim colThreads Dim objThread Dim FSO Dim LeggiFile Dim LogFile Dim NomeProcesso ' Identifica il server su cui operare ' Oggetto Dictionary utile per la mappatura della ' corrispondenzaProcesso-Thread ' Oggetto WMI ' Collection dei processi ' Singolo processo della collection ' ID del processo ' Collection dei Thread ' Singolo Thread ' Oggetto File System Object ' Puntatore al file contenente l'elenco dei server ' Puntatore al file di log ' Nome del processo

' Preleva l'elenco dei server su cui effettuare il controllo Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Controlla se il file di log esiste o occorre crearlo If (FSO.FileExists("ReportProcess.log")) Then
I libri di ioPROGRAMMO/60 script amministrativi per Windows

111

60 SCRIPT AMMINISTRATIVI

per Windows

Ottenere la lista dei processi e dei relativi thread

Set LogFile = FSO.OpenTextFile("ReportProcess.log",8) Else Set LogFile = FSO.CreateTextFile("ReportProcess.Log", True) End If ' Crea un oggetto Dictionary Set objDict = CreateObject("Scripting.Dictionary") ' Leggi il file contenente l'elenco dei server LogFile.WriteLine "SERVER;PROCESSO;ID PROCESSO;THREAD HANDLE" Do While Not LeggiFile.AtEndOfStream ' Azzera l'oggetto Dictionary objDict.RemoveAll ServerCorrente = LeggiFile.ReadLine ' Collegati alla macchina e preleva la lista dei processi Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & ServerCorrente & "\root\cimv2") Set colProcesses = objWMIService.ExecQuery ("SELECT ProcessID, Name FROM Win32_Process") ' Colleziona le informazioni sui processi, memorizzandoli nell'oggetto Dictionary For Each objProcess In colProcesses objDict.Add objProcess.ProcessID, objProcess.Name Next

112

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Ottenere la lista dei processi e dei relativi thread

60 SCRIPT AMMINISTRATIVI

per Windows

' Preleva la lista di tutti i Thread Set colThreads = objWMIService.ExecQuery ("SELECT ProcessHandle, Handle FROM Win32_Thread") ' Per ogni Thread, preleva le informazioni relative al processo associato ' e, sfruttando l'oggetto Dictionary, mostra i dettagli For Each objThread In colThreads ' Recupera l'ID del processo associato ProcessID = CInt(objThread.ProcessHandle) ' Sfruttando l'ID e l'oggetto Dictionary, preleva il nome del processo NomeProcesso = objDict.Item(ProcessID) ' Scrivi i risultati LogFile.WriteLine ServerCorrente & ";" & NomeProcesso & ";" & ProcessID & ";" & objThread.Handle Next Loop LeggiFile.Close LogFile.Close Set objDict = Nothing Set objWMIService = Nothing Set colProcesses = Nothing Set objProcess = Nothing Set colThreads = Nothing Set objThread = Nothing Set FSO = Nothing Set LeggiFile = Nothing
I libri di ioPROGRAMMO/60 script amministrativi per Windows

113

60 SCRIPT AMMINISTRATIVI

per Windows

Impostare lIP Address da statico a dinamico

Set LogFile = Nothing

IMPOSTARE LIP ADDRESS DA STATICO A DINAMICO


Questo script, molto semplice, imposta lindirizzo IP di un sistema da statico a dinamico.
Option Explicit Dim strComputer Dim objWMIService Dim colNetAdapters Dim objNetAdapter Dim DictErr Dim RetVal ' Server sul quale operare ' Oggetto WMI ' Collection ' Generico item della collection colNetAdapters ' Dictionary Object ' Valore di ritorno del metodo EnableDHCP()

' Definisci loggetto Dictionary per la mappatura codice erroredescrizione Set DictErr = CreateObject("Scripting.Dictionary") ' Inserisci alcuni dei possibili msg di errore (sito MS) legati alloperazione DictErr.Add "0", "Successful completion, no reboot required." DictErr.Add "1", "Successful completion, reboot required." DictErr.Add "64", "Method Not supported On this platform." DictErr.Add "65", "Unknown failure." DictErr.Add "74", "Invalid host name." DictErr.Add "79", "Invalid security parameter." DictErr.Add "80", "Unable To configure TCP/IP service." DictErr.Add "81", "Unable To configure DHCP service." DictErr.Add "82", "Unable To renew DHCP lease."

114

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Ottenere informazioni sulle variabili dambiente

60 SCRIPT AMMINISTRATIVI

per Windows

DictErr.Add "83", "Unable To release DHCP lease." DictErr.Add "91", "Access denied." DictErr.Add "97", "Interface Not configurable." DictErr.Add "100", "DHCP Not enabled On the adapter." strComputer = "." Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colNetAdapters = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=TRUE") If colNetAdapters.Count = 0 Then Wscript.Echo "Non ci sono Network Adapter da configurare" Wscript.Quit End If For Each objNetAdapter In colNetAdapters RetVal = objNetAdapter.EnableDHCP() Msgbox DictErr(Cstr(RetVal)),,"Esito operazione" Next Set colNetAdapters = Nothing Set objWMIService = Nothing Set objNetAdapter = Nothing Set DictErr = Nothing

OTTENERE INFORMAZIONI SULLE VARIABILI DAMBIENTE


Molti degli script che vengono implementati in un ambiente di
I libri di ioPROGRAMMO/60 script amministrativi per Windows

115

60 SCRIPT AMMINISTRATIVI

per Windows

Ottenere informazioni sulle variabili dambiente

produzione necessitano di conoscere particolare parametri come la cartella dinstallazione di Windows o quella temporanea. Oltre ai metodi gi visti, ovviamente esiste quello dinterrogare, se esiste, lopportuna variabile dambiente. Ecco un piccolo script che si occupa di raggiungere lo scopo. In ingresso pu essergli passato il nome della variabile dambiente che si vuol conoscere.
Option Explicit Dim strComputer Dim objWMIService Dim colEnvVariables Dim VarEnv Dim strQuerySuffix ' Computer sul quale operare ' Oggetto WMI ' Collection delle variabili d'ambiente ' Generica variabile d'ambiente ' Secondo pezzo della query WMI (che specifica, eventualmente) ' il nome della variabile da controllare strComputer = "." ' Controlla se viene passato il nome della variabile da cercare ' In caso contrario la lista riguarder tutte le variabili ' d'ambiente. Per passare allo script la variabile PIPPO, ad es., ' lanciarlo con /VAR:PIPPO If Wscript.Arguments.Named.Exists("VAR") Then strQuerySuffix = "WHERE Name = '" & Wscript.Arguments.Named("VAR") & "'" End If Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colEnvVariables = objWMIService.ExecQuery ("SELECT * FROM Win32_Environment " & strQuerySuffix)

116

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Svuotare la cartella di Prefetch

60 SCRIPT AMMINISTRATIVI

per Windows

' Per ciascuna istanza trovata mostra i dettagli (variabile dambiente, profilo, ecc.) ' Si osservi che, a seconda del profilo, esiste una variabile d'ambiente con lo stesso ' nome. For Each VarEnv In colEnvVariables WScript.Echo "->" & VarEnv.Name & "=" & VarEnv.VariableValue WScript.Echo vbTab & vbTab & "PROFILO=" & VarEnv.UserName WScript.Echo vbTab & vbTab & "SYSTEM=" & VarEnv.SystemVariable Next WScript.Echo vbCrLf & "Elenco completato" ' Distruggi loggetto Set objWMIService = Nothing Set colEnvVariables = Nothing

SVUOTARE LA CARTELLA DI PREFETCH


Il prefetching una tecnica in base alla quale Windows XP tenta di aumentare le performance del sistema operativo creando dei file .PF, allinterno di unapposita cartella, per velocizzare lesecuzione dei programmi. Senza entrare troppo nel dettaglio, questo meccanismo finisce ben presto con loccupare spazio disco che dovrebbe essere periodicamente liberato. Ecco un semplicescript che fa questo lavoro. In questesempio, come in qualche altro, stata variata la modalit di accesso al sistema, utilizzando per lappunto, un oggetto WMI istanziato con listruzione CreateObject("WbemScripting.SwbemLocator"). Attraverso esso, come vedremo, vengono passate le informazioni di autenticazione utili ad accedere alla macchina.
I libri di ioPROGRAMMO/60 script amministrativi per Windows

117

60 SCRIPT AMMINISTRATIVI

per Windows

Svuotare la cartella di Prefetch

Option Explicit Dim FSO Dim LeggiFile Dim LogFile Dim ServerCorrente Dim WindowsDir Dim PrefetchFolder Dim objWMIService Dim colItems Dim Item Dim Utente Dim Password Dim objLocator ' Oggetto File System Object ' Puntatore al file che contiene l'elenco dei server ' Puntatore al file di log ' Computer sul quale operare ' Directory d'installazione di Windows ' Cartella di Prefetch ' Oggetto WMI ' Collection d'informazioni classe Win32_OperatingSystem ' Generico item della collection precedente ' Utente utile per l'autenticazione ' Password dell'utente ' Oggetto WMI

Utente = "MyDomain\FLIPPO" Password = "MyPassword" ' Leggi il file che contiene l'elenco dei server su cui copiare ' la cartella Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Controlla se necessario creare il file di log If (FSO.FileExists("Prefetch.log")) Then Set LogFile = FSO.OpenTextFile("Prefetch.log",8) Else Set LogFile = FSO.CreateTextFile("Prefetch.Log", True) End If ' Leggi il file contenente i server su cui copiare la cartella Do While Not LeggiFile.AtEndOfStream

118

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Svuotare la cartella di Prefetch

60 SCRIPT AMMINISTRATIVI

per Windows

' Impostiamo il server su cui operare ServerCorrente = LeggiFile.ReadLine ' Preleva le informazioni sulla Windows Directory ' Connettiti al server remoto e avvia il programma Set objLocator = CreateObject("WbemScripting.SwbemLocator") Set objWMIService = objLocator.ConnectServer(ServerCorrente, "root\cimv2", Utente, Password) Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem") For Each Item In colItems WindowsDir= Item.WindowsDirectory Next ' WindowsDir contiene qualcosa del tipo C:\Windows. ' Per costruire la stringa correttamente, sostituiamo C: con C$ WindowsDir = Replace (WindowsDir,":","$") ' Imposta la cartella di Prefetch PrefetchFolder = "\\" & ServerCorrente & "\" & WindowsDir & "\Prefetch" On Error Resume Next ' Punta ora alla cartella Prefetch sul server corrente FSO.GetFolder(PrefetchFolder) FSO.DeleteFile PrefetchFolder & "\*.pf", True If Err.Number <> 0 Then
I libri di ioPROGRAMMO/60 script amministrativi per Windows

119

60 SCRIPT AMMINISTRATIVI

per Windows

Avviare il controllo antivirus su di una cartella

LogFile.WriteLine (ServerCorrente & " Errore! (" & Err.Description & ")") Err.clear Else LogFile.WriteLine (ServerCorrente & " OK!") End If Loop LeggiFile.Close LogFile.Close Set FSO = Nothing Set LeggiFile = Nothing Set LogFile = Nothing Set objWMIService = Nothing Set objLocator = Nothing Set colItems = Nothing

AVVIARE IL CONTROLLO ANTIVIRUS SU DI UNA CARTELLA


Lo script che stiamo per mostrare, assieme ad alcuni che lo seguiranno, molto particolare. Senza entrare troppo nei dettagli, diciamo che, attraverso lutilizzo di opportuni oggetti (Shell Object), possiamo avviare azioni molto particolari su cartelle, sul cestino, ecc. Largomento senza dubbio difficile da spiegare in questa sede ed in poche righe. Oltretutto esula dallobiettivo che mi sono prefisso scrivendo questo libro e pertanto non aggiunger nullaltro a riguardo. Tuttavia, seguiranno altri script simili che dovrebbero aiutare a comprenderne meglio il funzionamento. Tornando a questo, invece, possiamo solo aggiungere qualche
120
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Avviare il controllo antivirus su di una cartella

60 SCRIPT AMMINISTRATIVI

per Windows

dettaglio importante. Questo codice presuppone che sul sistema ove viene lanciato, esista un software antivirus installato e che, cliccando con il tasto destro del mouse su di una qualunque cartella, si acceda ad un menu ove sia presente la voce Scan for viruses... per lavvio dellantivirus. Solo in questo script stata inserita una lista parziale di costanti con prefisso ssf che consentono di accedere, come vedremo in seguito, ad altri oggetti del sistema operativo. Per maggiori informazioni a riguardo, potete comunque iniziare da http://msdn.microsoft.com/library/default.asp?url=/library/enus/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_programming/objectmap.asp.
Option Explicit Dim objShell Dim objFolder Dim objVerbs Dim ListaVerbi Dim Item Dim objFolderSpec ' Const ssfDESKTOP = 0 ' Const ssfPROGRAMS = 2 ' Const ssfCONTROLS = 3 ' Const ssfPRINTERS = 4 ' Const ssfPERSONAL = 5 ' Const ssfFAVORITES = 6 ' Const ssfSTARTUP = 7 ' Oggetto WShell ' Oggetto Folder ' Generico oggetto "verbo" ' Stringa che memorizza la lista dei verbi ' associati al namespace considerato ' Generico item della collection "Verbs" ' Puntatore alla cartella C:\Windows ' Desktop (including system items) ' Programs section of Start Menu ' Control Panel (no path) ' Printers (no path) ' My Documents ' IE Favorites ' Startup

I libri di ioPROGRAMMO/60 script amministrativi per Windows

121

60 SCRIPT AMMINISTRATIVI

per Windows

Avviare il controllo antivirus su di una cartella

' Const ssfRECENT = 8 ' Const ssfSENDTO = 9 ' Const ssfBITBUCKET = 10 ' Const ssfSTARTMENU = 11 ' Const ssfDESKTOPDIRECTORY = 16 ' Const ssfDRIVES = 17 ' Const ssfNETWORK = 18 ' Const ssfCOMMONSTARTMENU = 22 ' Const ssfCOMMONFAVORITES = 31 ' Const ssfINTERNETCACHE = 32 ' Const ssfCOOKIES = 33 ' Const ssfHISTORY = 34 ' Const ssfPROGRAMFILES = 38 Const ssfDRIVES = 17

' Recent ' SendTo ' Recycle Bin (no path) ' Start Menu ' Desktop directory (no system items) ' My Computer ' Network Neighborhood ' All users start menu ' All Users Favorites ' Temporary Internet Files ' Cookies ' History (no path) ' Program Files

Set objShell = CreateObject("Shell.Application") ' Considera per esempio la cartella C:\WINDOWS Set objFolder = objShell.NameSpace(ssfDRIVES) Set objFolderSpec = objFolder.Parsename("C:\Windows") ' Ottieni la lista dei verbi associata ad essa Set objVerbs = objFolderSpec.Verbs ' Mostra la lista dei verbi legati all'oggetto considerato For Each Item In objVerbs ListaVerbi = ListaVerbi & vbCrlf & Item.Name Next Wscript.Echo ListaVerbi

122

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Determinare gli utenti in modalit console

60 SCRIPT AMMINISTRATIVI

per Windows

' Adesso, tenuto conto che si certi che esiste ' una riga pari a "Scan for viruses..." che consente ' l'avvio dell'antivirus, lanciamolo... objFolderSpec.InvokeVerb "Scan for viruses..." Set objVerbs = Nothing Set objFolder = Nothing Set objShell = Nothing Set objFolderSpec = Nothing

DETERMINARE GLI UTENTI IN MODALIT CONSOLE


Sfruttando WMI e servendosi pi precisamente della sola classe Win32_Process, possiamo determinare se esistono utenti che sono loggati in modalit console ad essa. Lo script mostrato cerca il processo Explorer e ne determina lID di sessione. Se pari a 0, allora ci indica che un utente in modalit console alla macchina. Infine, per ognuna delle macchine inserite nel file dinput, viene registrata unopportuna riga allinterno del report indicato.
Option Explicit Dim UserLogged Dim ConsoleUser Dim OwnerUser Dim OwnerDomain Dim objWMIService Dim objLocator Dim Processes ' Utente in modalit Console ' Nome, completo di dominio, dell'utente in mod. console ' Owner del processo ' Dominio dell'owner del processo ' Oggetto WMI ' Oggetto WMI ' Collection di processi
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Dim DomainUserLogged ' Dominio dell'utente in modalit console

123

60 SCRIPT AMMINISTRATIVI

per Windows

Determinare gli utenti in modalit console

Dim Process Dim Utente Dim Password Dim RetVal Dim FSO Dim LogFile Dim LeggiFile Dim ServerCorrente

' Generico item della collection Processes ' Utente necessario per le credenziali d'accesso ' Password dell'utente per l'accesso ' Memorizza i coidici di ritorno delle funzioni ' Oggetto File System Object ' Report finale ' File con elenco server ' Sistema sul quale si sta operando

' Imposta i parametri di accesso ai server Utente = "MyDomain\Utente" Password = "Password" ' Controlla se il file di log esiste o occorre crearlo Set FSO = CreateObject("Scripting.FileSystemObject") If (FSO.FileExists("ReportUserLogged.csv")) Then Set LogFile = FSO.OpenTextFile("ReportUserLogged.csv",8) Else Set LogFile = FSO.CreateTextFile("ReportUserLogged.csv", True) End If ' Apri il file contenente la lista dei server Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Scrivi l'intestazione nel report finale LogFile.WriteLine "Nome Server;Utente" ' Crea il report con le info di ciascun server Do While Not LeggiFile.AtEndOfStream ' Imposta la stringa di default ConsoleUser = "Nessun utente in modalit console"

124

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Determinare gli utenti in modalit console

60 SCRIPT AMMINISTRATIVI

per Windows

ServerCorrente = LeggiFile.ReadLine ' Wscript.Echo "Sto processando il server " & ServerCorrente ' Collegati al server corrente e preleva la lista dei processi Set objLocator = CreateObject("WbemScripting.SwbemLocator") Set objWMIService = objLocator.ConnectServer(ServerCorrente, "root\cimv2", Utente, Password) Set Processes = objWMIService.InstancesOf("Win32_Process") On Error Resume Next ' Adesso cerca il processo explorer.exe che possiede ID = 0 For Each Process In Processes If (Process.Caption = "explorer.exe") And (Process.SessionID = 0 ) Then RetVal = Process.GetOwner(OwnerUser, OwnerDomain) ' Controlla se ci sono stati errori If RetVal = 0 And Err = 0 Then ConsoleUser = OwnerDomain & "\" & OwnerUser Msgbox ConsoleUser Else ConsoleUser = "Errore: " & Err.Description End If End If Next ' Scrivi le informazioni trovate LogFile.WriteLine ServerCorrente & ";" & ConsoleUser Loop LogFile.Close
I libri di ioPROGRAMMO/60 script amministrativi per Windows

125

60 SCRIPT AMMINISTRATIVI

per Windows

Eliminare una connessione di rete

LeggiFile.Close Set objWMIService = nothing Set objLocator = Nothing Set Processes = Nothing Set Process = Nothing Set FSO = Nothing Set LogFile = Nothing Set LeggiFile = Nothing

ELIMINARE UNA CONNESSIONE DI RETE


Anche questo script utilizza le tecniche viste in precedenza e, malgrado il raggiungimento di questoperazione poteva essere portato a termine in altro modo, il codice riportato dovrebbe aiutare ad avvicinare lutente che ne far uso con meno diffidenza. Lo scopo dello script proprio quello di eliminare una connessione (per ipotesi quella di Loopback).
Option Explicit Dim ConnDaEliminare Dim objWShell Dim objConnessioni Dim FolderItem Dim ItemToSearch Dim ItemTrovato Dim objLanConnection ' Nome della connessione da eliminare ' Oggetto WShell ' Oggetto Pannello di Controllo ' Oggetto che punta all'item indicato da ItemToSearch ' FolderItem del Pannello di Controllo ' Item da cercare ' Flag che indica se l'item cercato stato o meno trovato ' Oggetto connessione di rete. Punta a quella da eliminare

Dim objPannelloDiControllo

126

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Eliminare una connessione di rete

60 SCRIPT AMMINISTRATIVI

per Windows

Dim Verb Dim ListaVerbs Const ssfCONTROLS = 3

' Generico item della collection Verbs ' Elenco dei verbi

' Imposta l'item del Pannello di Controllo da cercare ItemToSearch = "Connessioni di rete" ' Imposta il flag per inizio ricerca ItemTrovato = 0 ' Impostiamo il nome della connessione da eliminare ConnDaEliminare = " Connessione alla rete locale (LOOPBACK)" Set objWShell = CreateObject("Shell.Application") Set objPannelloDiControllo = objWShell.Namespace(ssfCONTROLS) ' Controlliamo tutti gli item del Pannello di Controllo ' ed individuiamo l'item "Connessioni di rete" For Each FolderItem In objPannelloDiControllo.items ' Se desideriamo dare un'occhiata alle voci che stiamo ' scandendo, togliamo il segno di commento alla MSGBOX ' successiva. ' msgbox FolderItem.Name If FolderItem.Name = ItemToSearch Then ' Abbiamo trovato l'item che ci serve. Possiamo anche ' uscire dal ciclo. ItemTrovato = 1 ' objConnessioni raccoglie la lista delle connessioni di rete Set objConnessioni= FolderItem.GetFolder Exit For End If Next ' Vediamo se l'item stato trovato If ItemTrovato = 0 Then
I libri di ioPROGRAMMO/60 script amministrativi per Windows

127

60 SCRIPT AMMINISTRATIVI

per Windows

Disabilitare una connessione di rete

Wscript.Echo "L'item " & ItemToSearch & " non stato trovato." Wscript.Quit End If ' Adesso cerca la connessione da eliminare For Each FolderItem In objConnessioni.items 'Wscript.Echo FolderItem.Name If LCase(FolderItem.Name) = LCase(ConnDaEliminare) Then Set objLanConnection = FolderItem objLanConnection.InvokeVerb("&Elimina") Wscript.Sleep 10000 Exit For End If Next ' Se vogliamo, possiamo elencare tutti gli item ' della collection Verbs ' For Each verb In objLanConnection.verbs ' ' ListaVerbs = ListaVerbs & vbCrlf & Verb.Name Wscript.Echo ListaVerbs

' Next Set objWShell = Nothing Set objPannelloDiControllo = Nothing Set objConnessioni = Nothing Set FolderItem = Nothing Set objLanConnection = Nothing Set Verb = Nothing

DISABILITARE UNA CONNESSIONE DI RETE


Anche questo script utilizza le tecniche viste in precedenza e, malgrado il raggiungimento di questoperazione poteva essere portato a termine in altro modo, il codice riportato dovrebbe
128
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Disabilitare una connessione di rete

60 SCRIPT AMMINISTRATIVI

per Windows

aiutare ad avvicinare lutente che ne far uso con meno diffidenza. Lo scopo dello script proprio quello di disabilitare una connessione (per ipotesi quella di Loopback).
Option Explicit Dim ConnDaEliminare Dim objWShell Dim objConnessioni Dim FolderItem Dim ItemToSearch Dim ItemTrovato Dim objLanConnection Dim Verb Dim ListaVerbs Const ssfCONTROLS = 3 ' Imposta l'item del Pannello di Controllo da cercare ItemToSearch = "Connessioni di rete" ' Imposta il flag per inizio ricerca ItemTrovato = 0 ' Impostiamo il nome della connessione da eliminare ConnDaEliminare = "Connessione alla rete locale (LOOPBACK)" Set objWShell = CreateObject("Shell.Application") Set objPannelloDiControllo = objWShell.Namespace(ssfCONTROLS)
I libri di ioPROGRAMMO/60 script amministrativi per Windows

' Nome della connessione da eliminare ' Oggetto WShell ' Oggetto Pannello di Controllo ' Oggetto che punta all'item indicato da ItemToSearch ' FolderItem del Pannello di Controllo ' Item da cercare ' Flag che indica se l'item cercato stato o meno trovato ' Oggetto connessione di rete. Punta a quella da eliminare ' Generico item della collection Verbs ' Elenco dei verbi

Dim objPannelloDiControllo

129

60 SCRIPT AMMINISTRATIVI

per Windows

Disabilitare una connessione di rete

' Controlliamo tutti gli item del Pannello di Controllo ' ed individuiamo l'item "Connessioni di rete" For Each FolderItem In objPannelloDiControllo.items ' Se desideriamo dare un'occhiata alle voci che stiamo ' scandendo, togliamo il segno di commento alla MSGBOX ' successiva. msgbox FolderItem.Name If FolderItem.Name = ItemToSearch Then ' Abbiamo trovato l'item che ci serve. Possiamo anche ' uscire dal ciclo. ItemTrovato = 1 ' objConnessioni raccoglie la lista delle connessioni di rete Set objConnessioni= FolderItem.GetFolder Exit For End If Next ' Vediamo se l'item stato trovato If ItemTrovato = 0 Then Wscript.Echo "L'item " & ItemToSearch & " non stato trovato." Wscript.Quit End If ' Adesso cerca la connessione da eliminare For Each FolderItem In objConnessioni.items 'Wscript.Echo FolderItem.Name If LCase(FolderItem.Name) = LCase(ConnDaEliminare) Then Set objLanConnection = FolderItem objLanConnection.InvokeVerb("&Disabilita") Wscript.Sleep 10000 Exit For End If Next

130

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Disabilitare una connessione di rete

60 SCRIPT AMMINISTRATIVI

per Windows

' Se vogliamo, possiamo elencare tutti gli item ' della collection Verbs ' For Each verb In objLanConnection.verbs ' ' ListaVerbs = ListaVerbs & vbCrlf & Verb.Name Wscript.Echo ListaVerbs

' Next Set objWShell = Nothing Set objPannelloDiControllo = Nothing Set objConnessioni = Nothing Set FolderItem = Nothing Set objLanConnection = Nothing Set Verb = Nothing Elencare i Documenti Recenti Questo script ottiene lelenco dei documenti recenti utilizzando una tecnica simile alla precedente. Option Explicit Dim objWShell Dim FolderItem Dim objDocumentiRecenti Dim ListaDocRecenti Const ssfRECENT = 8 ' Creiamo l'oggetto che punta ai documenti recenti Set objWShell = CreateObject("Shell.Application") Set objDocumentiRecenti = objWShell.Namespace(ssfRECENT) ' Controlliamo tutti gli item relativi ai documenti recenti For Each FolderItem In objDocumentiRecenti.items
I libri di ioPROGRAMMO/60 script amministrativi per Windows

' Oggetto WShell ' Generico item dei documenti recenti ' Oggetto namspace Documenti Recenti ' Lista dei documenti recenti

131

60 SCRIPT AMMINISTRATIVI

per Windows

Disabilitare una connessione di rete

' Mostriamo l'elenco dei documenti recenti. ListaDocRecenti = ListaDocRecenti & vbCrlf & FolderItem.Name Next Msgbox ListaDocRecenti Set objWShell = Nothing Set objDocumentiRecenti = Nothing Set FolderItem = Nothing Elencare i documenti nel Cestino Questo script consente di controllare ed ottenere la lista dei file presenti nel Cestino. Option Explicit Dim objWShell Dim FolderItem Dim objDocumentiCestino Dim ListaDocCestino Dim ItemSize Const ssfBITBUCKET = 10 ' Di seguito l'elenco del secondo parametro del metodo GetDetailsOf() Fonte MS ' 0 Retrieves the name of the item.' ' 1 Retrieves the size of the item. ' 2 Retrieves the type of the item. ' 3 Retrieves the date and time that the item was last modified. ' 4 Retrieves the attributes of the item. ' -1 Retrieves the info tip information for the item. Impostiamo linformazione Size ' Oggetto WShell ' Generico oggetto del Cestino ' Oggetto namespace Cestino ' Lista dei documenti del Cestino ' Dimensione dell'oggetto nel Cestino

132

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Controllare labilitazione al controllo remoto

60 SCRIPT AMMINISTRATIVI

per Windows

Const iColumn = 3 ' Creiamo l'oggetto che punta ai documenti del Cestino Set objWShell = CreateObject("Shell.Application") Set objDocumentiCestino = objWShell.Namespace(ssfBITBUCKET) ' Controlliamo tutti gli item del Cestino For Each FolderItem In objDocumentiCestino.items ' Mostriamo l'elenco dei documenti del Cestino. ItemSize = objDocumentiCestino.GetDetailsOf(FolderItem, iColumn) ListaDocCestino = ListaDocCestino & " " & FolderItem.Name & " " & " " & ItemSize & vbCrlf Next Msgbox "NUMERO TOTALE: " & objDocumentiCestino.Items.Count & vbcrlf & ListaDocCestino Set objWShell = Nothing Set objDocumentiCestino = Nothing Set FolderItem = Nothing

CONTROLLARE LABILITAZIONE AL CONTROLLO REMOTO


Questo script crea un report di tutti i sistemi che hanno preimpostato laccesso al sistema mediante Remote Desktop. Per effettuare questo controllo, lo script verifica il valore di una opportuna chiave del Registry denominata fsDenyTSConnections.
Option Explicit Dim WSHShell ' Oggetto WShell
I libri di ioPROGRAMMO/60 script amministrativi per Windows

133

60 SCRIPT AMMINISTRATIVI

per Windows

Controllare labilitazione al controllo remoto

Dim RegKey Dim FSO Dim LeggiFile Dim LogFile Dim ServerCorrente Dim rRegistry Dim strKeyPath

' Chiave del Registry ' Oggetto FSO ' Puntatore al file contenente l'elenco dei server ' Puntatore al file di log ' Generico server ' Oggetto WMI ' Percorso del Registry ove reperire le info o meno di collegarsi da remoto

Dim fDenyTSConnection ' Chiave del Registry che indica la possibilit Dim dwfDenyTSConnection Dim Utente Dim Password Dim objLocator Dim objWMIService Dim RetVal ' Memorizza il valore DWORD recuperato dal Registry ' Utente utile per l'accesso al sistema ' Password dell'utente utile per l'accesso al sistema ' Oggetto WMI ' Oggetto WMI ' Valore di ritorno del metodo GetDWORDValue() Const HKEY_LOCAL_MACHINE = &H80000002 ' Imposta le credenziali dellutente Utente = "MyDomain\Utente" Password = "Password" fDenyTSConnection = "fDenyTSConnections" ' Preleva l'elenco dei server su cui effettuare il controllo Set FSO = CreateObject("Scripting.FileSystemObject") Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Controlla se il file di log esiste o occorre crearlo

134

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Controllare labilitazione al controllo remoto

60 SCRIPT AMMINISTRATIVI

per Windows

If (FSO.FileExists("ReportTS.csv")) Then Set LogFile = FSO.OpenTextFile("ReportTS.csv",8) Else Set LogFile = FSO.CreateTextFile("ReportTS.csv", True) End If ' CHIAVE DA LEGGERE: ' HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server ' -> fDenyTSConnections ' ' ' ' Leggi il file con l'elenco dei server e, per ognuno, leggi ' le informazioni che trovi nel Registry LogFile.WriteLine "SERVER;REGISTRY VAL" Do While Not LeggiFile.AtEndOfStream dwfDenyTSConnection = 0 ServerCorrente = LeggiFile.ReadLine ' Collegati al server remoto corrente Set objLocator = CreateObject("WbemScripting.SwbemLocator") Set objWMIService = objLocator.ConnectServer(ServerCorrente, "/root/default", Utente, Password) Set rRegistry = objWMIService.Get("StdRegProv") strKeyPath = "SYSTEM\CurrentControlSet\Control\Terminal Server"
I libri di ioPROGRAMMO/60 script amministrativi per Windows

1 (Remote Desktop disabled) 0 (Remote Desktop enabled)

135

60 SCRIPT AMMINISTRATIVI

per Windows

Controllare lesecuzione di uno script

RetVal = rRegistry.GetDWORDValue (HKEY_LOCAL_MACHINE,strKeyPath,fDenyTSConnection,dwfDenyTSC onnection) If RetVal <> 0 Then ' La chiave potrebbe anche non esistere... ' Per default = 0 LogFile.WriteLine ServerCorrente & ";" & "ERRORE" Else LogFile.WriteLine ServerCorrente & ";" & Cstr(dwfDenyTSConnection) End If Loop LeggiFile.Close LogFile.Close Set WSHShell = Nothing Set FSO = Nothing Set LeggiFile = Nothing Set LogFile = Nothing Set rRegistry = Nothing Set objLocator = Nothing Set objWMIService = Nothing Wscript.Echo "Ho terminato"

CONTROLLARE LESECUZIONE DI UNO SCRIPT


Questo piccolo script consente di controllare se un determina136
I libri di ioPROGRAMMO/60 script amministrativi per Windows

Controllare lesecuzione di uno script

60 SCRIPT AMMINISTRATIVI

per Windows

to altro script VBS sta girando ed, in caso non lo fosse, consente di avviarlo in maniera nascosta. Per ipotesi, il nome dello script, completo di percorso, C:\IPAddress.vbs. Questo piccolo programma cerca tra i processi la lista di quelli denominati wscript o cscript. In seguito, senza preoccuparsi se la collection formata da almeno un elemento (lo sicuramente perch lo script corrente crea proprio un processo di questo tipo), cerca nella propriet CommandLine che riporta lesatto comando avviato (qualcosa del tipo c:\cscript.exe c:\IPAddress.vbs). Se non trova nulla, allora mostra un popup per 3 secondi e poi avvia un processo nascosto che lancia il vbs.
Option Explicit Dim NomeScript Dim strComputer Dim objWMIService Dim colProcesses Dim objWSHShell Dim newProcess Dim Trovato Dim objStartup Dim objProcess Dim objConfig Dim intProcessID Dim RetVal ' Nome dello script da controllare ' Nome del computer su cui operare ' Oggetto WMI ' Collection di processi ' Oggetto Shell ' Nuovo processo per il lancio dello script ' Flag che indica se lo script sta girando oppure no ' Oggetto classe Win32_ProcessStartup ' Generico item collection di processi ' Oggetto per la configurazione del nuovo processo ' Parametro ID processo ' Valore di ritorno del metotdo Create, classe Win32_Process Const POPUP_DURATION = 3 Const OK_BUTTON = 0 Const HIDDEN_WINDOW = 12
I libri di ioPROGRAMMO/60 script amministrativi per Windows

137

60 SCRIPT AMMINISTRATIVI

per Windows

Controllare lesecuzione di uno script

NomeScript = "C:\IPAddress.vbs" strComputer = "." Trovato = False Set objWSHShell = Wscript.CreateObject("Wscript.Shell") Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") ' Verifica se esistono processi WSCRIPT o CSCRIPT che potrebbero far ' pensare che il VBS stato avviato e sta girando. Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = " & _ "'wscript.exe' OR Name= 'cscript.exe'") ' Controlla se lo script sta girando oppure no For Each objProcess In colProcesses If Instr(objProcess.CommandLine,NomeScript) <> 0 Then Trovato = True Exit For End If Next ' Se Trovato = False, allora lo script va rilanciato... ' Per far questo creiamo un processo "nascosto"... If Trovato = False Then objWshShell.Popup "Lo script sicuramente non stato avviato." & vbCrlf & "Occorre rilanciarlo...", POPUP_DURATION, "Errore", OK_BUTTON Set newProcess = GetObject("winmgmts:root\cimv2:Win32_Process")

138

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Eseguire uno script direttamente su macchine remote

60 SCRIPT AMMINISTRATIVI

per Windows

' Imposta la configurazione per avviare un processo nascosto Set objStartup = objWMIService.Get("Win32_ProcessStartup") Set objConfig = objStartup.SpawnInstance_ objConfig.ShowWindow = HIDDEN_WINDOW RetVal = newProcess.Create("cscript.exe " & NomeScript, Null, objConfig, intProcessID) End If Set objWMIService = Nothing Set colProcesses = Nothing Set objWSHShell = Nothing Set newProcess = Nothing Set objStartup = Nothing Set objProcess = Nothing Set objConfig = Nothing

ESEGUIRE UNO SCRIPT DIRETTAMENTE SU MACCHINE REMOTE


Questo uno script davvero particolare perch, contrariamente a quanto abbiamo visto nei precedenti listati, il processo Wscript generato dallavvio di uno qualunque dei codice sinora visti, non avviene sulla macchina sorgente, bens su quella di destinazione. Affinch tutto funzioni, per, sono necessari alcuni accorgimenti che devono essere rispettati e che sinteticamente si concretizzano nella modifica di una chiave del Registry, sia locale che del sistema remoto. Loggetto che permette di effettuare questo tipo di esecuzione denominato WSHController (ne esistono comunque altri a contorno) e attraverso essi possibile controllare lo stato di esecuzione dello script, comportandosi di conseguenza. Maggiori dettagli in proposito possono essere recuperati dal siI libri di ioPROGRAMMO/60 script amministrativi per Windows

139

60 SCRIPT AMMINISTRATIVI

per Windows

Eseguire uno script direttamente su macchine remote

to della Microsoft e pi precisamente da www.microsoft.co.ke/technet/scriptcenter/topics/remote/rscripting.mspx. Al suo interno vengono spiegati i dettagli di una simile tecnica ed eventuali consigli per evitare gli errori pi comuni.
Option Explicit Dim LeggiFile Dim objController Dim RemoteScript Dim FSO Dim LogFile Dim ServerCorrente Dim ScriptDaAvviare Dim strKeyPath Dim objRegProv Const NOTASK = 0 Const RUNNING = 1 Const FINISHED = 2 ' Puntatore al file contenente la lista dei server ' Oggetto WSHController ' Script da avviare sul server remoto ' Puntatore al file di log ' Server su cui operare ' Script, completo di percorso, da avviare ' Chiave del Registry per l'avvio di script remoti ' Oggetto Registry Provider ' Lo script stato creato ma non ancora eseguito. ' Lo script remoto in stato RUNNING. ' Lo script remoto ha terminato l'esecuzione.

' Oggetto File System Object

Const HKEY_LOCAL_MACHINE = &H80000002 ' Imposta la chiave del Registry per l'avvio di script remoti strKeyPath = "SOFTWARE\Microsoft\Windows Script Host\Settings" ' Imposta lo script da avviare sulla macchina remota. Per ipotesi Installed_Hotfix.vbs ScriptDaAvviare = "C:\Installed_Hotfix.vbs" ' Preleva l'elenco dei server su cui effettuare il controllo Set FSO = CreateObject("Scripting.FileSystemObject")

140

I libri di ioPROGRAMMO/60 script amministrativi per Windows

Eseguire uno script direttamente su macchine remote

60 SCRIPT AMMINISTRATIVI

per Windows

Set LeggiFile = FSO.OpenTextFile("ElencoServer.txt") ' Prepara il file di log If (FSO.FileExists("RemoteScript.log")) Then Set LogFile = FSO.OpenTextFile("RemoteScript.log",8) Else Set LogFile = FSO.CreateTextFile("RemoteScript.Log", True) End If ' Inserisci l'intestazione nel file di log LogFile.WriteLine "SERVER;SCRIPT STATUS;ERROR" ' Crea l'oggetto Set objController = WScript.CreateObject("WSHController") ' Avvia lo script sulla macchina remota Do While Not LeggiFile.AtEndOfStream ServerCorrente = LeggiFile.ReadLine ' Imposta a 1 il flag del Registry per l'avvio ' remoto di uno script. ' HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Script Host\Settings\Remote = 1 Set objRegProv = GetObject("winmgmts:{impersonationLevel=Impersonate}" & _ "!\\" & ServerCorrente & "\root\default:StdRegProv") objRegProv.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,"Remote","1"

I libri di ioPROGRAMMO/60 script amministrativi per Windows

141

60 SCRIPT AMMINISTRATIVI

per Windows

Eseguire uno script direttamente su macchine remote

' Crea l'oggetto Set RemoteScript = objController.CreateScript(ScriptDaAvviare, ServerCorrente) ' Avvia lo script sull'host remoto Wscript.ConnectObject RemoteScript, "Remote_" RemoteScript.Execute ' Controlla lo stato dello script Do While RemoteScript.Status <> FINISHED WScript.Sleep 100 Loop If Not RemoteScript.Error Then LogFile.WriteLine ServerCorrente & ";OK;" End If ' Disconnetti l'oggetto Wscript.DisconnectObject RemoteScript Loop Sub Remote_Error LogFile.WriteLine ServerCorrente & ";ERR;" & RemoteScript.Error End Sub LeggiFile.Close LogFile.Close Set LeggiFile = Nothing Set objController = Nothing

142

I libri di ioPROGRAMMO/60 script amministrativi per Windows

IIS: Prelevare informazioni sui Web Site

60 SCRIPT AMMINISTRATIVI

per Windows

Set RemoteScript = Nothing Set FSO = Nothing Set LogFile = Nothing Set objRegProv = Nothing

IIS: PRELEVARE INFORMAZIONI SUI WEB SITE


Questo script si occupa di elencare alcune delle principali informazioni riguardanti i Web Site di IIS. Ovviamente lelenco dei dettagli non molto esaustivo (in particolare si posto maggiore attenzione sullo stato del sito piuttosto che su altre informazioni). In ogni caso, dovrebbe essere sufficiente a mostrare come utilizzare il provider IIS. Solo un dettaglio importante prima di passare allo script. Ogni Web Site identificato da un nome che, in realt, un indice numerico progressivo. Qualora fosse necessario interrogare lo stato di uno in particolare, sar sufficiente sostituire la stringa ADsPath inserita nello script con unanaloga costruita ad hoc e simile alla seguente:
Set objWebServer = GetObject("IIS://" & ServerIIS & "/W3SVC/ & Indice)

dove Indice , per lappunto, lidentificativo del Web Site interessato.


Option Explicit Dim ServerIIS Dim objWebServer Dim Site Dim SiteStatus(9) ' Server IIS ' Oggetto ADSI ' Stato del sito
I libri di ioPROGRAMMO/60 script amministrativi per Windows

' Generico sito

143

60 SCRIPT AMMINISTRATIVI

per Windows

IIS: Prelevare informazioni sui Web Site

Const MD_SERVER_STATE_STARTING = 1 Const MD_SERVER_STATE_STARTED = 2 Const MD_SERVER_STATE_STOPPING = 3 Const MD_SERVER_STATE_STOPPED = 4 Const MD_SERVER_STATE_PAUSING = 5 Const MD_SERVER_STATE_PAUSED = 6 Const MD_SERVER_STATE_CONTINUING = 7 SiteStatus(1) = "STARTING" SiteStatus(2) = "STARTED" SiteStatus(3) = "STOPPING" SiteStatus(4) = "STOPPED" SiteStatus(5) = "PAUSING" SiteStatus(6) = "PAUSED" SiteStatus(7) = "CONTINUING" SiteStatus(8) = "SCONOSCIUTO" ' Controlla se allo script stato passato il parametro ' SERVER. In caso contrario, sfrutta LOCALHOST If WScript.Arguments.Named.Exists("SERVER") Then ServerIIS = WScript.Arguments.Named("SERVER") Else ServerIIS = "localhost" End If ' Scrivi a video i dettagli WScript.Echo "Dettagli IIS server " & Ucase(ServerIIS) ' Ottieni il riferimento al server Set objWebServer = GetObject("IIS://" & ServerIIS & "/W3SVC")

144

I libri di ioPROGRAMMO/60 script amministrativi per Windows

IIS: Prelevare informazioni sugli FTP Site

60 SCRIPT AMMINISTRATIVI

per Windows

' Mostra i dati principali dei siti Web For Each Site In objWebServer IF Site.Class = "IIsWebServer" THEN WScript.Echo _ "Site Name (ID) = " & Site.Name & vbCrlf & _ "Server Comment = """ & Site.ServerComment & """ " & vbCrlf & _ "Server State = " & SiteStatus(Site.ServerState) & vbCrlf & _ "LogFileDir = " & Site.LogFileDirectory & _ "" End If Next

IIS: PRELEVARE INFORMAZIONI SUGLI FTP SITE


Questo script si occupa di elencare alcune delle principali informazioni riguardanti gli FTP Site di IIS. Ovviamente lelenco dei dettagli non molto esaustivo (in particolare si posto maggiore attenzione sullo stato del sito piuttosto che su altre informazioni). In ogni caso, dovrebbe essere sufficiente a mostrare come utilizzare il provider IIS. Contrariamente allo script precedente, la principale (e forse unica) differenza degna di nota la stringa AdsPath specificata per il collegamento al server. Infatti, mentre nel primo caso avevamo:
Set objWebServer = GetObject("IIS://" & ServerIIS & "/W3SVC")

nel presente abbiamo


Set objFTPServer = GetObject("IIS://" & ServerIIS & "/MSFTPSVC")
I libri di ioPROGRAMMO/60 script amministrativi per Windows

145

60 SCRIPT AMMINISTRATIVI

per Windows

IIS: Prelevare informazioni sugli FTP Site

Option Explicit Dim ServerIIS Dim objFTPServer Dim Site Dim SiteStatus(9) ' Server IIS ' Oggetto ADSI ' Stato del sito ' Generico sito

Const MD_SERVER_STATE_STARTING = 1 Const MD_SERVER_STATE_STARTED = 2 Const MD_SERVER_STATE_STOPPING = 3 Const MD_SERVER_STATE_STOPPED = 4 Const MD_SERVER_STATE_PAUSING = 5 Const MD_SERVER_STATE_PAUSED = 6 Const MD_SERVER_STATE_CONTINUING = 7 SiteStatus(1) = "STARTING" SiteStatus(2) = "STARTED" SiteStatus(3) = "STOPPING" SiteStatus(4) = "STOPPED" SiteStatus(5) = "PAUSING" SiteStatus(6) = "PAUSED" SiteStatus(7) = "CONTINUING" SiteStatus(8) = "SCONOSCIUTO" ' Controlla se allo script stato passato il parametro ' SERVER. In caso contrario, sfrutta LOCALHOST If WScript.Arguments.Named.Exists("SERVER") Then ServerIIS = WScript.Arguments.Named("SERVER") Else ServerIIS = "localhost" End If

146

I libri di ioPROGRAMMO/60 script amministrativi per Windows

IIS: Creare e cancellare Web Site ed FTP Site

60 SCRIPT AMMINISTRATIVI

per Windows

' Scrivi a video i dettagli WScript.Echo "Dettagli IIS server " & Ucase(ServerIIS) ' Ottieni il riferimento al server Set objFTPServer = GetObject("IIS://" & ServerIIS & "/MSFTPSVC") ' Mostra i dati principali dei siti Web For Each Site In objFTPServer IF Site.Class = "IIsWebServer" THEN WScript.Echo _ "Site Name (ID) = " & Site.Name & vbCrlf & _ "Server Comment = """ & Site.ServerComment & """ " & vbCrlf & _ "Server State = " & SiteStatus(Site.ServerState) & vbCrlf & _ "LogFileDir = " & Site.LogFileDirectory & _ "" End If Next

IIS: CREARE E CANCELLARE WEB SITE ED FTP SITE


In questo script vengono utilizzate alcune delle conoscenze acquisite precedentemente per creare o cancellare oggetti Web Site e FTP Site attraverso VBS. Naturalmente, poche righe di codice non esauriscono le tante possibilit di parametrizzazione e personalizzazione di questi componenti di IIS, ma danno comunque unidea di quello che si pu/deve fare per manipolarli.
Option Explicit
I libri di ioPROGRAMMO/60 script amministrativi per Windows

147

60 SCRIPT AMMINISTRATIVI

per Windows

IIS: Creare e cancellare Web Site ed FTP Site

Dim ServerIIS Dim objWebServer Dim Site Dim SiteStatus(9) Dim OperationFlag Dim WEB_FTP_Flag

' Server IIS ' Oggetto ADSI ' Stato del sito ' Operazione da effettuare (creazione o cancellazione) ' Flag per controllare su cosa agire ' Generico sito

Const MD_SERVER_STATE_STARTING = 1 Const MD_SERVER_STATE_STARTED = 2 Const MD_SERVER_STATE_STOPPING = 3 Const MD_SERVER_STATE_STOPPED = 4 Const MD_SERVER_STATE_PAUSING = 5 Const MD_SERVER_STATE_PAUSED = 6 Const MD_SERVER_STATE_CONTINUING = 7 SiteStatus(1) = "STARTING" SiteStatus(2) = "STARTED" SiteStatus(3) = "STOPPING" SiteStatus(4) = "STOPPED" SiteStatus(5) = "PAUSING" SiteStatus(6) = "PAUSED" SiteStatus(7) = "CONTINUING" SiteStatus(8) = "SCONOSCIUTO" ' Controlla se allo script stato passato il parametro ' SERVER. In caso contrario, sfrutta LOCALHOST If WScript.Arguments.Named.Exists("SERVER") Then ServerIIS = WScript.Arguments.Named("SERVER") Else ServerIIS = "localhost"

148

I libri di ioPROGRAMMO/60 script amministrativi per Windows

IIS: Creare e cancellare Web Site ed FTP Site

60 SCRIPT AMMINISTRATIVI

per Windows

End If ' Controlla se allo script stato passato il parametro ' per i Web Site o per gli FTP Site. ' Se stato passato il parametro W (per i Web Site)... If WScript.Arguments.Named.Exists("W") Then WEB_FTP_Flag = "W" Else If WScript.Arguments.Named.Exists("F") Then WEB_FTP_Flag = "F" Else MsgBox "Errore! Non hai specificato correttamente i parametri." WScript.Quit End If End If ' Controlla se allo script stato passato il parametro ' per la creazione o l'eliminazione. ' Se stato passato il parametro C (creazione)... If WScript.Arguments.Named.Exists("C") Then OperationFlag = "C" Else If WScript.Arguments.Named.Exists("D") Then OperationFlag = "D" ' Controlla che sia stato specificato l'indice ' dell'oggetto da eliminare If Not WScript.Arguments.Named.Exists("INDEX") Then MsgBox "Errore! Non hai specificato l'ID." WScript.Quit End If
I libri di ioPROGRAMMO/60 script amministrativi per Windows

149

60 SCRIPT AMMINISTRATIVI

per Windows

IIS: Creare e cancellare Web Site ed FTP Site

Else MsgBox "Errore! Non hai specificato correttamente i parametri." WScript.Quit End If End If ' Adesso controlla che operazione compiere ' C = Creazione ' D = Eliminazione ' PS: Per default si considera un'operazione di creazione/cancellazione ' di FTP Site quando il parametro /W non specificato Select Case OperationFlag Case "C" If WEB_FTP_Flag = "W" Then CreaWebSite Else CreaFTPSite End If Case "D" If WEB_FTP_Flag = "W" Then EliminaWebSite Else EliminaFTPSite End If End Select Public Sub CreaWebSite Dim NewSite Dim NewRoot Dim SiteTCPPort Dim SiteIPAddress

150

I libri di ioPROGRAMMO/60 script amministrativi per Windows

IIS: Creare e cancellare Web Site ed FTP Site

60 SCRIPT AMMINISTRATIVI

per Windows

Dim Index Dim SiteName Dim SitePath Dim WebSite SiteName = "My Web Site" SitePath = "C:\Inetpub\wwwroot" ' Ottieni il riferimento all'oggetto di IIS Set Site = GetObject("IIS://" & ServerIIS & "/W3SVC") ' Determina l'indice valido For Each WebSite In Site If IsNumeric(WebSite.Name) Then If Index < WebSite.Name Then Index = WebSite.Name End If End If Next ' Ecco l'indice valido... Index = Index + 1 ' Impostiamo l'indirizzo IP e la porta di ascolto del Web Server SiteIPAddress = "10.0.0.2" SiteTCPPort = "80" ' Creiamo l'oggetto Set NewSite = Site.Create("IIsWebServer", Index) ' Impostiamo alcune caratteristiche e salviamo NewSite.ServerBindings = Array(SiteIPAddress & ": " & SiteTCPPort & ":") NewSite.ServerComment = SiteName
I libri di ioPROGRAMMO/60 script amministrativi per Windows

151

60 SCRIPT AMMINISTRATIVI

per Windows

IIS: Creare e cancellare Web Site ed FTP Site

NewSite.SetInfo Set NewRoot = NewSite.Create("IIsWebVirtualDir", "Root") NewRoot.Path = SitePath NewRoot.SetInfo End Sub Public Sub CreaFTPSite Dim FTPSiteName Dim SitePath Dim SiteIPAddress Dim SiteTCPPort Dim FTPSite Dim NewSite Dim NewRoot Dim Index ' Imposta la descrizione dell'FTP site FTPSiteName = "My FTP Site" ' Imposta il site path SitePath = "C:\Inetpub\MyFTPPath" ' Imposta l'indirizzo IP e la porta SiteIPAddress = "10.0.0.2" SiteTCPPort = "21" ' Otteniamo il riferimento Set Site = GetObject("IIS://" & ServerIIS & "/MSFTPSVC") ' Determina l'indice valido For Each FTPSite In Site

152

I libri di ioPROGRAMMO/60 script amministrativi per Windows

IIS: Creare e cancellare Web Site ed FTP Site

60 SCRIPT AMMINISTRATIVI

per Windows

If IsNumeric(FTPSite.Name) Then If Index < FTPSite.Name Then Index = FTPSite.Name End if End If Next Index = Index + 1 ' Completiamo la creazione Set NewSite = Site.Create("IIsFTPServer", Index) NewSite.ServerComment = FTPSiteName NewSite.ServerBindings = Array(SiteIPAddress & ": " & SiteTCPPort & ":") NewSite.SetInfo Set NewRoot = NewSite.Create("IIsFTPVirtualDir", "Root") NewRoot.Path = SitePath NewRoot.SetInfo End Sub

Public Sub EliminaWebSite Dim Site Set Site = GetObject("IIS://" & ServerIIS & "/W3SVC") Site.Delete "IIsWebServer", Wscript.Arguments.Named("INDEX") End Sub

I libri di ioPROGRAMMO/60 script amministrativi per Windows

153

60 SCRIPT AMMINISTRATIVI

per Windows

IIS: Creare e cancellare Web Site ed FTP Site

Public Sub EliminaFTPSite Dim FTPSite Set FTPSite = GetObject("IIS://" & ServerIIS & "/MSFTPSVC") FTPSite.Delete "IIsFTPServer", Wscript.Arguments.Named("INDEX") End Sub

154

I libri di ioPROGRAMMO/60 script amministrativi per Windows

NOTE

i libri di

60 SCRIPT AMMINISTRATIVI PER WINDOWS


Autore: Francesco Lippo

EDITORE Edizioni Master S.p.A. Sede di Milano:Via Ariberto, 24 - 20123 Milano Sede di Rende: C.da Lecco, zona ind. - 87036 Rende (CS)
Realizzazione grafica: Cromatika Srl C.da Lecco, zona ind. - 87036 Rende (CS) Art Director: Paolo Cristiano Responsabile grafico di progetto: Salvatore Vuono Coordinatore tecnico: Giancarlo Sicilia Illustrazioni: Tonino Intieri Impaginazione elettronica: Francesco Cospite
Servizio Clienti

Tel. 02 831212 - Fax 02 83121206


@ e-mail: customercare@edmaster.it

Stampa: Grafica Editoriale Printing - Bologna Finito di stampare nel mese di Febbraio 2007
Il contenuto di questopera, anche se curato con scrupolosa attenzione, non pu comportare specifiche responsabilit per involontari errori, inesattezze o uso scorretto. Leditore non si assume alcuna responsabilit per danni diretti o indiretti causati dallutilizzo delle informazioni contenute nella presente opera. Nomi e marchi protetti sono citati senza indicare i relativi brevetti. Nessuna parte del testo pu essere in alcun modo riprodotta senza autorizzazione scritta della Edizioni Master.

Copyright 2007 Edizioni Master S.p.A. Tutti i diritti sono riservati.

Potrebbero piacerti anche