Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
60 Script Amministrativi Per Windows
60 Script Amministrativi Per Windows
60 Script Amministrativi Per Windows
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
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.
60 SCRIPT AMMINISTRATIVI
per Windows
60 SCRIPT AMMINISTRATIVI
per Windows
' 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,":","$")
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
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
11
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
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
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
15
60 SCRIPT AMMINISTRATIVI
per Windows
' 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
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
17
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
19
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
' 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
22
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
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
24
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
Dim FolderObject ' Oggetto Folder Dim FilesObject ' Collection di file
I libri di ioPROGRAMMO/60 script amministrativi per Windows
25
60 SCRIPT AMMINISTRATIVI
per Windows
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
60 SCRIPT AMMINISTRATIVI
per Windows
' Elimina gli oggetti appena creati dalla memoria Set FilesObject = Nothing Set FolderObject = Nothing Set FSO = Nothing Set LogFile = Nothing
27
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
29
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
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
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
60 SCRIPT AMMINISTRATIVI
per Windows
Loop Set objWMIService = Nothing Set colMonitoredEvents = Nothing Set objEventObject = Nothing Set objShell = Nothing
33
60 SCRIPT AMMINISTRATIVI
per Windows
' 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
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
35
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
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
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
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
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
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
41
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
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
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
' 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
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
47
60 SCRIPT AMMINISTRATIVI
per Windows
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
48
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
LogFile.WriteLine Next LogFile.Close Set FSO = Nothing Set colElencoShare= Nothing Set LogFile = Nothing Set oReg = Nothing
50
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
51
60 SCRIPT AMMINISTRATIVI
per Windows
Set PingResults = Nothing Set objWmiService = Nothing Set PingResObj = Nothing Set objWshShell = Nothing
52
60 SCRIPT AMMINISTRATIVI
per Windows
Dim IPAddress
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
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
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
55
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
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..."
58
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
59
60 SCRIPT AMMINISTRATIVI
per Windows
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
Const SMTP_PORT = 25
60
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
= 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
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
63
60 SCRIPT AMMINISTRATIVI
per Windows
64
60 SCRIPT AMMINISTRATIVI
per Windows
' 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
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
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
' 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
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
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
60 SCRIPT AMMINISTRATIVI
per Windows
a disposizione da VBScript.
Option Explicit Dim DataDaControllare Dim DictWeek ' Data da controllare
' 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
71
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
' 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
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
74
60 SCRIPT AMMINISTRATIVI
per Windows
' 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_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
75
60 SCRIPT AMMINISTRATIVI
per Windows
' 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
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
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
& "LanManServer\Parameters\AutoShareServer",0, "REG_DWORD" End If End Select Set WshShell = Nothing Set objWMIService = Nothing Set colOperatingSystems = Nothing Set objOperatingSystem = Nothing
80
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
81
60 SCRIPT AMMINISTRATIVI
per Windows
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
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)
83
60 SCRIPT AMMINISTRATIVI
per Windows
' 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
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
85
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
87
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
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
89
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
91
60 SCRIPT AMMINISTRATIVI
per Windows
' 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
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
' 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
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
95
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
97
60 SCRIPT AMMINISTRATIVI
per Windows
' 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
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
Dim DestinationFolder
99
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
101
60 SCRIPT AMMINISTRATIVI
per Windows
' 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
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
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
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")
105
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
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
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
' 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
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
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
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
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
' 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
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
115
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
117
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
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
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
121
60 SCRIPT AMMINISTRATIVI
per Windows
' 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
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
123
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
LeggiFile.Close Set objWMIService = nothing Set objLocator = Nothing Set Processes = Nothing Set Process = Nothing Set FSO = Nothing Set LogFile = Nothing Set LeggiFile = Nothing
Dim objPannelloDiControllo
126
60 SCRIPT AMMINISTRATIVI
per Windows
' 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
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
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
' 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
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
' 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
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
133
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
135
60 SCRIPT AMMINISTRATIVI
per Windows
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"
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
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
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
139
60 SCRIPT AMMINISTRATIVI
per Windows
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.
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
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"
141
60 SCRIPT AMMINISTRATIVI
per Windows
' 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
60 SCRIPT AMMINISTRATIVI
per Windows
Set RemoteScript = Nothing Set FSO = Nothing Set LogFile = Nothing Set objRegProv = Nothing
143
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
145
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
147
60 SCRIPT AMMINISTRATIVI
per Windows
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
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
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
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
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
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
153
60 SCRIPT AMMINISTRATIVI
per Windows
Public Sub EliminaFTPSite Dim FTPSite Set FTPSite = GetObject("IIS://" & ServerIIS & "/MSFTPSVC") FTPSite.Delete "IIsFTPServer", Wscript.Arguments.Named("INDEX") End Sub
154
NOTE
i libri di
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
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.