Scritto da Alessandro Tani
(alessandro.tani@homeworks.it)
- Pubblicato il giorno 3 Febbraio 2010 - Aggiornato il 12 Agosto 2010 -
Questa pagina � dedicata agli script realizzati dagli autori del sito di HomeWorks. Nessuno degli script riportati ha la pretesa di essere originale. Ciascuno degli script riportati cerca di assolvere ad operazioni che prima o poi, tutti gli amministratori di sistema devono affrontare. Ci auguriamo che possiate trovare questi script utili.
Indice
- Introduzione
- Active Directory
- Logon Scripts
- File System
- Gestione dei Processi e dei Servizi
- Bibliografia
Introduzione
Per agevolare la spiegazione e l'utilizzo degli script che vengono messi a disposizione, si pressuppor� che le seguenti condizioni siano soddisfatte:
- tutti gli script con estensione .cmd o .bat dovranno venire copiati nella cartella %SystemDrive%\Bin\Batch
- tutti gli script con estensione .vbs dovranno venire copiati all'interno della cartella %SystemDrive%\Bin\Vbs
- i programmi eseguibili a cui talvolta faranno riferimento gli script, verranno considerati presenti all'interno della cartella %SystemDrive%\Bin\Exe
- gli script, salvo esplicita comunicazione contraria, saranno validi per i sistemi operativi Windows 2000/2003/XP/Vista/7;
- la variabile d'ambiente %PATH% dei sistemi operativi Windows 2000/2003/XP/Vista/7
dovr� venire modificata aggiungendo le cartelle, nell'ordine riportato:
- %SystemDrive%\Bin\Exe
- %SystemDrive%\Bin\Batch
- ai sistemi operativi Windows 2000/2003/XP/Vista/7 dovr� venire aggiunta la variabile
d'ambiente %OSLanguage%, riportante la lingua del sistema operativo (nel caso di
Windows Vista/7, la localizzazione linguistica), ovvero:
- OSLanguage = EN per i sistemi operativi in lingua inglese;
- OSLanguage = IT per i sistemi operativi in lingua italiana;
- collegarsi alla postazione in cui si vogliono copiare gli script di HomeWorks con un utente avente i diritti amministrativi sulla postazione stessa;
- aprire il men� Start e selezionare la voce Run...;
- nella casella di testo Open inserire il comando:
cmd.exe
e premere il pulsante OK per eseguire il comando inserito; - all'apertura della Command Prompt digitare in sequenza i seguenti comandi:
md %SystemDrive%\Bin
md %SystemDrive%\Bin\Batch
md %SystemDrive%\Bin\Exe
md %SystemDrive%\Bin\Vbs
exit
- collegarsi alla postazione in cui si vogliono copiare gli script di HomeWorks con un utente avente i diritti amministrativi sulla postazione stessa;
- aprire il men� Start, aprire il Control Panel e aprire, se necessario facendoci doppio click col mouse, la voce System;
- andare nella sezione Advanced e premere il pulsante Environment Variables;
- nella finestra System Variables evidenziare la variabile d'ambiente Path e premere il pulsante Edit;
- aggiunggere il seguente testo, in coda al testo gi� presente:
Si osservi che i vari percorsi di cartelle riportati nella variabile d'ambiente %PATH% sono sperati dal simbolo ; (punto e virgola), avere pertanto cura di riportare il simbolo ; alla fine della stringa riportata nella variabile d'ambiente %PATH%, precedente alla modifica indicata, onde evitare d'introdurre una sintassi di cartella non corretta.
%SystemDrive%\Bin\Exe;%SystemDrive%\Bin\Batch
- premere il pulsante OK per confermare;
- nella finestra System Variables premere il pulsante New;
- nella casella di testo Variable Name, inserire il nome OSLanguage.
Nella casella di testo Variable Value inserire, rispettivamente, uno dei valori:
- EN qualora il sistema operativo fosse il lingua inglese;
- IT qualora il sistema operativo fosse il lingua italiana;
- premere il pulsante OK per confermare quanto inserito nella finestra New System Variable;
- premere il pulsante OK per chiudere la finestra Environment Variables;
- premere il pulsante OK per chiudere la finestra System Properties.
Active Directory
In questa sezione vengono riportati gli script che riguardano la gestione e manutenzione di Active Directory.
Come forzare la scadenza delle password degli utenti di una data Unit� Organizzativa
Sebbene sia un vincolo di legge da diversi anni, non sempre, agli utenti di un dominio Active Directory viene impostata la scadenza della password. Questo comporta che qualora si decida di mettere a norma di legge la configurazione di Active Directory, si rendono necessarie una serie di attivit� manuali su ciascun utente, per poter abilitare la scadenza delle password. Queste operazioni possono diventare parecchio tediose, se il numero di utenti da gestire � elevato.
Si tenga presente che qualora si abiliti la scadenza della password ad un utente che sono diversi mesi o anni che non la cambia, si rischia, qualora le impostazioni associate alla sicurezza della GPO che definisce quando una password deve scadere, di bloccare l'operativit� dell'utente, in quanto, appena la scadenza della password diventa operativa, la sua password scade.
Per impostare la scadenza della password di un utente, vengono utilizzati due script:
- uno script VBScript (EnablePasswordChange.vbs) che costituisce il motore che opera sulla configurazione di Active Directory;
- uno script Batch (EnablePasswordChange.cmd) che consente la messa in esecuzione, dalla Command Prompt, del corrispondente motore VBScript (EnablePasswordChange.vbs);
' ********************************************************************* ' * * ' * NOME SCRIPT: EnablePasswordChange.vbs * ' * * ' * Script scritto da Alessandro Tani (Home Works S.p.A.) * ' * * ' * Versione 1.0 - Modificato l'ultima volta il 29/02/2008 * ' * da Alessandro Tani * ' * SCOPO: * ' * * ' * Impone a tutti gli utenti di una Unit� Organizzativa la scadenza * ' * della password a tutti quegli utenti in cui la scadenza della * ' * password risultava disabilitata. * ' * * ' * File di log: strLogFile * ' * * ' * PREREQUISITI: * ' * * ' * L'utente che esegue lo script deve avere diritti amministrativi * ' * su Active Directory, ovvero deve appartenere al gruppo dei * ' * Domain Admins del dominio o al gruppo degli Enterprise Admins * ' * della Foresta. * ' * * ' * TESTO: * ' * * ' * Nessuno * ' * * ' ********************************************************************* 'Dichiariamo sempre le variabili Option Explicit 'Non gestiamo gli errori 'On Error Resume Next 'Impostiamo gli aggetti Dim objArgs, objRootDSE, objFSO, objShell, objNetwork, objLogFile, objOU, objChildObject, objUser 'Impostiamo le variabili Dim strDNOU, strDomain, strSystemDrive, strMese, strGiorno, strOra, strMinuti, strDataCorrente Dim strLogFile, intUAC 'Impostiamo le costanti Const ADS_ACETYPE_ACCESS_DENIED_OBJECT = &H6 Const ADS_ACETYPE_ACCESS_ALLOWED_OBJECT = &H5 Const ADS_FLAG_OBJECT_TYPE_PRESENT = &H1 Const ADS_RIGHT_DS_CONTROL_ACCESS = &H100 Const CHANGE_PASSWORD_GUID = "{ab721a53-1e2f-11d0-9819-00aa0040529b}" const ADS_UF_DONT_EXPIRE_PASSWD = &H10000 'Leggiamo i parametri inseriti dall'utente Set objArgs = WScript.Arguments If objArgs.Count = 0 Then 'Messaggio di aiuto WScript.Echo "" WScript.Echo "Questo script abilita la scadenza delle password a tutti gli utenti," WScript.Echo "di una Unit� Organizzativa, per i quali la scadenza della password" WScript.Echo "era stata disabilitata." WScript.Echo "" WScript.Echo "Sintassi:" WScript.Echo "" WScript.Echo " EnablePasswordChange <Distinguished_Name_OU>" WScript.Echo "" WScript.Echo "Dove:" WScript.Echo " <Distinguished_Name_OU>: � il Distinguished Name che identifica la OU" WScript.Echo " in Active Directory" WScript.Echo "" WScript.Echo "Esempio:" WScript.Echo "" WScript.Echo " EnablePasswordChange " & Chr(34) & "OU=Internal_Users,OU=My_Users,DC=homeworks,DC=it" & Chr(34) WScript.Echo "" Else strDNOU = objArgs(0) 'Distinguished Name della OU in cui prelevare gli utenti 'Definiamo gli oggetti Set objRootDSE = GetObject("LDAP://rootDSE") Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell") Set objNetwork = CreateObject("WScript.Network") strDomain = objNetwork.UserDomain 'Creiamo la cartella in cui inserire il file di log strSystemDrive = objShell.ExpandEnvironmentStrings("%SystemDrive%") If not objFSO.FolderExists(strSystemDrive & "\Logs") then objFSO.CreateFolder(strSystemDrive & "\Logs") End If 'Impostiamo la data e l'ora di esecuzione dello script If Len(DatePart("m", Date())) = 1 Then strMese = "0" & DatePart("m", Date()) Else strMese = DatePart("m", Date()) End If If Len(DatePart("d", Date())) = 1 Then strGiorno = "0" & DatePart("d", Date()) Else strGiorno = DatePart("d", Date()) End If If Len(Hour(Now())) = 1 Then strOra = "0" & Hour(Now()) Else strOra = Hour(Now()) End If If Len(Minute(Now())) = 1 Then strMinuti = "0" & Minute(Now()) Else strMinuti = Minute(Now()) End If 'Impostiamo i file di log strDataCorrente = DatePart("yyyy", Date()) & strMese & strGiorno & strOra & strMinuti strLogFile = strSystemDrive & "\Logs\" & strDataCorrente & "_EnablePasswordChange.log" 'Creiamo i file di log Set objLogFile = objFSO.CreateTextFile(strLogFile, True) 'Impostiamo l'intestazione dei file di log objLogFile.WriteLine "+--------------------------------------------------+" objLogFile.WriteLine "| File di log dello Script EnablePasswordChange |" objLogFile.WriteLine "+--------------------------------------------------+" objLogFile.WriteLine "" objLogFile.WriteLine "Esecuzione del " & Date() & " alle " & Time() objLogFile.WriteLine "" 'Eseguiamo la query in AD Wscript.Echo "" Wscript.Echo "Eseguiamo la query in AD per ottenere l'elenco degli utenti da controllare" Wscript.Echo "che si trovano nella OU: " & strDNOU Wscript.Echo "" objLogFile.WriteLine "Eseguiamo la query in AD per ottenere l'elenco degli utenti da controllare" objLogFile.WriteLine "che si trovano nella OU: " & strDNOU objLogFile.WriteLine "" 'Otteniamo l'elenco degli oggetti della OU da analizzare Set objOU = GetObject("LDAP://" & strDNOU) For Each objChildObject in objOU Set objUser = GetObject(objChildObject.ADSPath) 'Verifichiamo che l'oggetto sia un utente If objUser.Class = "user" Then Wscript.Echo " --> Controlliamo l'utente: " & objUser.Get("displayName") objLogFile.WriteLine " --> Controlliamo l'utente: " & objUser.Get("displayName") intUAC = objUser.Get("userAccountControl") If intUAC and ADS_UF_DONT_EXPIRE_PASSWD Then objUser.put "userAccountControl", intUAC XOR ADS_UF_DONT_EXPIRE_PASSWD objUser.setinfo Wscript.Echo " Impostiamo la scadenza della password all'utente" objLogFile.WriteLine " Impostiamo la scadenza della password all'utente" Else Wscript.Echo " La scadenza della password risulta gi� abilitata" objLogFile.WriteLine " La scadenza della password risulta gi� abilitata" End If Wscript.Echo "" objLogFile.WriteLine "" End If Next 'Chiudiamo i file aperti objLogFile.WriteLine "Fine del file di Log" objLogFile.Close End IfIl testo del Batch EnablePasswordChange.cmd � il seguente:
@echo off rem ********************************************************************* rem * * rem * NOME SCRIPT: EnablePasswordChange.cmd * rem * * rem * Script scritto da Alessandro Tani (Home Works S.p.A.) * rem * * rem * Versione 1.0 - Modificato l'ultima volta il 29/02/2008 * rem * da Alessandro Tani * rem * SCOPO: * rem * * rem * Script per abilitare la scadenza della password a tutti gli * rem * utenti di una Unit� Organizzativa per i quali la scadenza della * rem * risulta disabilitata. * rem * * rem * File di log: * rem * * rem * - %SystemDrive%\Logs\<DataCorrente>_EnablePasswordChange.log * rem * * rem * * rem * PREREQUISITI: * rem * * rem * Devono esistere le seguenti cartelle e file: * rem * * rem * - %SystemDrive%\Bin\Vbs\EnablePasswordChange.vbs * rem * * rem * TESTO: * rem * * rem * Nessuno * rem * * rem ********************************************************************* rem Definiamo l'ambiente locale setlocal enableextensions echo. rem Impostiamo le variabili if [%1] equ [] goto HELP rem Controlliamo la presenza degli script necessari all'esecuzione if not exist %SystemDrive%\Bin\Vbs\EnablePasswordChange.vbs goto NOSCRIPTS rem Abilitiamo la scadenza della password cscript //nologo %SystemDrive%\Bin\Vbs\EnablePasswordChange.vbs %1 goto END :NOSCRIPTS echo Il file %SystemDrive%\Bin\Vbs\EnablePasswordChange.vbs non esiste. echo Pertanto non e' possibile proseguire nell'esecuzione dello script. echo Controlla che il file esista. echo. goto HELP :HELP Echo Script per abilitare la scadenza della password a tutti gli Echo utenti di una Unita' Organizzativa per i quali la scadenza della Echo password risulta disabilitata. Echo. Echo Sintassi: Echo. Echo EnbalePasswordChange ^<Distinguished_Name_OU^> Echo. Echo Dove: Echo. Echo ^<Distinguished_Name_OU^>: Distinguished Name della Unita' Organizzativa Echo. Echo Esempio: Echo. Echo EnablePasswordChange "OU=Internal_Users,OU=My_Users,DC=homeworks,DC=it" :END echo. endlocal exit /bIl file EnablePasswordChange.vbs va copiato all'interno della cartella %SystemDrive%\Bin\Vbs; mentre il file EnablePasswordChange.cmd va copiato all'interno della cartella %SystemDrive%\Bin\Batch
Per eseguire lo script che imposta la scadenza della password degli utenti che appartengono ad una data Unit� Organizzativa di Active Directory, basta eseguire il seguente comando:
Affinch� la sintassi riportata sia valida, bisogna svolgere i passaggi indicati all'interno del paragrafo Introduzione.
EnbalePasswordChange ^<Distinguished_Name_OU^>
Ad esempio, per impostare la scadenza della password agli utenti che appartengono alla Unit� Organizzativa: OU=Internal_Users,OU=My_Users,DC=homeworks,DC=it; basta eseguire dalla Command Prompt il comando:EnablePasswordChange "OU=Internal_Users,OU=My_Users,DC=homeworks,DC=it"
Per conoscere la sintassi del comando, eseguire semplicemente il comando Batch senza parametri:EnablePasswordChange
Come automatizzare la procedura di analisi di Active Directory
Al termine dell'installazione di un Domain Controller, o nel corso di normali operazioni di manutenzione su Active Directory, si dovrebbero sempre svolgere delle operazioni di analisi dello stato di Active Directory. La Microsoft mette a disposizione molti comandi per l'analisi dello stato di Active Directory, purtroppo per� la sintassi di questi comandi pu� rivelarsi complicata da ricordare a memoria, in questo senso lo script Batch che propongo di seguito, chiamato AnalisiAD.cmd, dovrebbe semplificare l'esecuzione di questi comandi.
Lo script AnalisiAD.cmd � stato sinora testato solamente sulla piattaforma Windows 2003. Al momento, nessuna prova � stata effettuata sui Domain Controller con sistema operativo Windows 2008 o superiore. Per una corretta esecuzione dello script AnalisiAD.exe, i Support Tools di Windows 2003 devono essere installati. Lo script va eseguito solamente sui server che ricoprono il ruolo di Domain Controller.
Il testo dello script AnalisiAD.cmd � il seguente:
@echo off rem ********************************************************************* rem * * rem * NOME SCRIPT: AnalisiAD.cmd * rem * * rem * Script scritto da Alessandro Tani (Home Works S.p.A.) * rem * * rem * Versione 1.0 - Modificato l'ultima volta il 18/08/2009 * rem * da Alessandro Tani * rem * SCOPO: * rem * * rem * Questo script svolge un'analisi diagniostica di Active Directory * rem * * rem * File di log: * rem * * rem * Nello script vengono riportati i vari file di log utilizzati * rem * * rem * PREREQUISITI: * rem * * rem * Lo script deve venire eseguito da una persona che fa parte dei * rem * gruppi Domain Admins ed Enterprise Admins. Lo script va eseguito * rem * solamente su postazioni Windows 2003 (nessuna prova � stata * rem * ancora fatta su Windows 2008) che ricoprono il ruolo di Domain * rem * Controller. I Support Tools di Windows devono essere installati * rem * sulla postazione in cui viene eseguito lo script. * rem * * rem * TESTO: * rem * * rem * Nessuno * rem * * rem ********************************************************************* rem Definiamo l'ambiente locale setlocal enableextensions echo. rem Controlliamo che esistano le variabili d'ambiente necessarie if "%OSLanguage%" equ "" ( echo La variabile d'ambiente "OSLanguage" non e' stata impostata echo per far girare questo script e' necessario impostare questa echo variabile. Questa variabile deve essere impostata ad IT se echo il sistema operativo e' in Italiano ed ad EN se il sistema echo operativo e' in Inglese. goto END ) rem Impostiamo le variabili echo Questo script svolge un'analisi diagniostica di Active Directory. echo Nome del dominio DNS analizzato: %USERDNSDOMAIN% echo. set /p NomeCliente="Inserisci il nome della societa' (senza inserire spazi): " rem Controlliamo l'esistenza della cartella Logs if not exist %SystemDrive%\Logs md %SystemDrive%\Logs rem Calcoliamo la data e l'ora di esecuzione dello script if /i "%OSLanguage%" equ "EN" for /f "Tokens=1-4 Delims=/ " %%i in ('date /t') do set DATA=%%l%%k%%j_%%i if /i "%OSLanguage%" equ "IT" for /f "Tokens=1-4 Delims=/ " %%i in ('date /t') do set DATA=%%k%%j%%i rem Eseguiamo i controlli in Active Directory echo. echo Eseguiamo i controlli di Active Directory ... echo. if not exist "%ProgramFiles%\Support Tools\DCDiag.exe" ( echo. echo # Il file "%ProgramFiles%\Support Tools\DCDiag.exe" non esiste! echo # Pertanto non potranno essere eseguiti i controlli: echo # - DCDiag.exe /e /v /c echo # - DCDiag.exe /test:DNS /e /v echo # Per risolvere il problema provvedere ad installare i "Windows Support Tools" echo # http://www.microsoft.com/downloads/details.aspx?displaylang=en^&FamilyID=96a35011-fd83-419d-939b-9a772ea2df90 echo. goto STEP2 ) set /a I=1 :DCDIAGFULL if not exist %SystemDrive%\Logs\%DATA%_%NomeCliente%_DCDiag_Full_Test_#%I%.log ( echo Eseguiamo il comando DCDiag.exe /e /v /c ... DCDiag.exe /e /v /c > %SystemDrive%\Logs\%DATA%_%NomeCliente%_DCDiag_Full_Test_#%I%.log ) else ( set /a I=I+1 goto DCDIAGFULL ) set /a I=1 :DCDIAGDNS if not exist %SystemDrive%\Logs\%DATA%_%NomeCliente%_DCDiag_DNS_Test_#%I%.log ( echo Eseguiamo il comando DCDiag.exe /test:DNS /e /v ... DCDiag /test:DNS /e /v > %SystemDrive%\Logs\%DATA%_%NomeCliente%_DCDiag_DNS_Test_#%I%.log ) else ( set /a I=I+1 goto DCDIAGDNS ) :STEP2 if not exist "%ProgramFiles%\Support Tools\Netdiag.exe" ( echo. echo # Il file "%ProgramFiles%\Support Tools\Netdiag.exe" non esiste! echo # Pertanto non potra' essere eseguito il controllo: Netdiag.exe echo # Per risolvere il problema provvedere ad installare i "Windows Support Tools" echo # http://www.microsoft.com/downloads/details.aspx?displaylang=en^&FamilyID=96a35011-fd83-419d-939b-9a772ea2df90 echo. goto STEP3 ) set /a I=1 :NETDIAG if not exist %SystemDrive%\Logs\%DATA%_%NomeCliente%_NetDiag_Test_#%I%.log ( echo Eseguiamo il comando Netdiag.exe ... Netdiag > %SystemDrive%\Logs\%DATA%_%NomeCliente%_NetDiag_Test_#%I%.log ) else ( set /a I=I+1 goto NETDIAG ) :STEP3 if not exist "%ProgramFiles%\Support Tools\NetDom.exe" ( echo. echo # Il file "%ProgramFiles%\Support Tools\NetDom.exe" non esiste! echo # Pertanto non potra' essere eseguito il controllo: NetDom.exe Query FSMO echo # Per risolvere il problema provvedere ad installare i "Windows Support Tools" echo # http://www.microsoft.com/downloads/details.aspx?displaylang=en^&FamilyID=96a35011-fd83-419d-939b-9a772ea2df90 echo. goto STEP4 ) set /a I=1 :NETDOM if not exist %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_Test_#%I%.log ( echo Eseguiamo il comando NetDom.exe Query FSMO ... NetDom Query FSMO > %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_Test_#%I%.log ) else ( set /a I=I+1 goto NETDOM ) :STEP4 if not exist "%ProgramFiles%\Support Tools\nltest.exe" ( echo. echo # Il file "%ProgramFiles%\Support Tools\nltest.exe" non esiste! echo # Pertanto non potra' essere eseguito il controllo: nltest.exe /dsgetdc:%USERDNSDOMAIN% echo # Per risolvere il problema provvedere ad installare i "Windows Support Tools" echo # http://www.microsoft.com/downloads/details.aspx?displaylang=en^&FamilyID=96a35011-fd83-419d-939b-9a772ea2df90 echo. goto STEP5 ) set /a I=1 :NLTEST if not exist %SystemDrive%\Logs\%DATA%_%NomeCliente%_Domain_Controller_State_Test_#%I%.log ( echo Eseguiamo il comando nltest.exe /dsgetdc:%USERDNSDOMAIN% ... nltest /dsgetdc:%USERDNSDOMAIN% > %SystemDrive%\Logs\%DATA%_%NomeCliente%_Domain_Controller_State_Test_#%I%.log ) else ( set /a I=I+1 goto NLTEST ) :STEP5 if not exist "%ProgramFiles%\Support Tools\repadmin.exe" ( echo. echo # Il file "%ProgramFiles%\Support Tools\repadmin.exe" non esiste! echo # Pertanto non potranno essere eseguiti i controlli: echo # - repadmin.exe /showrepl %COMPUTERNAME%.%USERDNSDOMAIN% echo # - repadmin /showconn %COMPUTERNAME%.%USERDNSDOMAIN% echo # - repadmin /replsummary * /Errorsonly /sort:Delta echo # - repadmin /Showrepl * /CSV echo # Per risolvere il problema provvedere ad installare i "Windows Support Tools" echo # http://www.microsoft.com/downloads/details.aspx?displaylang=en^&FamilyID=96a35011-fd83-419d-939b-9a772ea2df90 echo. goto STEP6 ) set /a I=1 :REPADMIN#1 if not exist %SystemDrive%\Logs\%DATA%_%NomeCliente%_Replica_Partner_Test_#%I%.log ( echo Eseguiamo il comando repadmin.exe /showrepl %COMPUTERNAME%.%USERDNSDOMAIN% ... repadmin /showrepl %COMPUTERNAME%.%USERDNSDOMAIN% > %SystemDrive%\Logs\%DATA%_%NomeCliente%_Replica_Partner_Test_#%I%.log ) else ( set /a I=I+1 goto REPADMIN#1 ) set /a I=1 :REPADMIN#2 if not exist %SystemDrive%\Logs\%DATA%_%NomeCliente%_Connection_Object_Test_#%I%.log ( echo Eseguiamo il comando repadmin /showconn %COMPUTERNAME%.%USERDNSDOMAIN% ... repadmin /showconn %COMPUTERNAME%.%USERDNSDOMAIN% > %SystemDrive%\Logs\%DATA%_%NomeCliente%_Connection_Object_Test_#%I%.log ) else ( set /a I=I+1 goto REPADMIN#2 ) set /a I=1 :REPADMIN#3 if not exist %SystemDrive%\Logs\%DATA%_%NomeCliente%_Replication_Status_Test_#%I%.log ( echo Eseguiamo il comando repadmin /replsummary * /Errorsonly /sort:Delta ... repadmin /replsummary * /Errorsonly /sort:Delta > %SystemDrive%\Logs\%DATA%_%NomeCliente%_Replication_Status_Test_#%I%.log ) else ( set /a I=I+1 goto REPADMIN#3 ) set /a I=1 :REPADMIN#4 if not exist %SystemDrive%\Logs\%DATA%_%NomeCliente%_Replication_Partners_Status_#%I%.csv ( echo Eseguiamo il comando repadmin /Showrepl * /CSV ... repadmin /Showrepl * /CSV > %SystemDrive%\Logs\%DATA%_%NomeCliente%_Replication_Partners_Status_#%I%.csv ) else ( set /a I=I+1 goto REPADMIN#4 ) :STEP6 if not exist "%windir%\system32\dsquery.exe" ( echo. echo # Il file "%windir%\system32\dsquery.exe" non esiste! echo # Pertanto non potranno essere eseguiti i controlli: echo # - dsquery.exe server -forest -isgc echo # - dsquery.exe server -forest -hasfsmo pdc echo # - dsquery.exe server -forest -hasfsmo schema echo # - dsquery.exe server -forest -hasfsmo name echo # - dsquery.exe server -forest -hasfsmo infr echo # - dsquery.exe server -forest -hasfsmo rid echo # Per risolvere il problema provvedere ad installare i "Windows Support Tools" echo # http://www.microsoft.com/downloads/details.aspx?displaylang=en^&FamilyID=96a35011-fd83-419d-939b-9a772ea2df90 echo. goto STEP7 ) set /a I=1 :DSQUERY#1 if not exist %SystemDrive%\Logs\%DATA%_%NomeCliente%_Global_Catalogs_List_#%I%.log ( echo Eseguiamo il comando dsquery.exe server -forest -isgc ... echo +--------------------------------------------------------------+ > %SystemDrive%\Logs\%DATA%_%NomeCliente%_Global_Catalogs_List_#%I%.log echo ^| ELENCO DEI DOMAIN CONTROLLER CHE SONO ANCHE GLOBAL CATALOG ^| >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_Global_Catalogs_List_#%I%.log echo +--------------------------------------------------------------+ >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_Global_Catalogs_List_#%I%.log echo. >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_Global_Catalogs_List_#%I%.log echo Nome Dominio Active Directory: %USERDNSDOMAIN% >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_Global_Catalogs_List_#%I%.log echo Nome Computer: %COMPUTERNAME%.%USERDNSDOMAIN% >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_Global_Catalogs_List_#%I%.log echo. >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_Global_Catalogs_List_#%I%.log dsquery server -forest -isgc >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_Global_Catalogs_List_#%I%.log ) else ( set /a I=I+1 goto DSQUERY#1 ) set /a I=1 :DSQUERY#2 if not exist %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log ( echo +----------------------------------------------------------------------+ > %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo ^| UBICAZIONE ^(SITE^) DEI DOMAIN CONTROLLER CHE RICOPRONO I RUOLI FSMO ^| >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo +----------------------------------------------------------------------+ >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo. >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo Nome Dominio Active Directory: %USERDNSDOMAIN% >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo Nome Computer: %COMPUTERNAME%.%USERDNSDOMAIN% >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo. >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo Eseguiamo il comando dsquery.exe server -forest -hasfsmo pdc ... echo PDC Emulator Domain Controller: >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log dsquery server -forest -hasfsmo pdc >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo. >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo Eseguiamo il comando dsquery.exe server -forest -hasfsmo schema ... echo Schema Operations Master Domain Controller: >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log dsquery server -forest -hasfsmo schema >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo. >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo Eseguiamo il comando dsquery.exe server -forest -hasfsmo name ... echo Domain Naming Master Domain Controller: >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log dsquery server -forest -hasfsmo name >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo. >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo Eseguiamo il comando dsquery.exe server -forest -hasfsmo infr ... echo Infrastructure Operations Master Domain Controller: >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log dsquery server -forest -hasfsmo infr >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo. >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo Eseguiamo il comando dsquery.exe server -forest -hasfsmo rid ... echo RID Master Domain Controller: >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log dsquery server -forest -hasfsmo rid >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log echo. >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_FSMO_List_#%I%.log ) else ( set /a I=I+1 goto DSQUERY#2 ) :STEP7 if not exist "%windir%\system32\W32tm.exe" ( echo. echo # Il file "%windir%\system32\W32tm.exe" non esiste! echo # Pertanto non potra' essere eseguito il controllo: W32tm.exe /monitor echo # Per risolvere il problema provvedere ad installare i "Windows Support Tools" echo # http://www.microsoft.com/downloads/details.aspx?displaylang=en^&FamilyID=96a35011-fd83-419d-939b-9a772ea2df90 echo. goto STEP8 ) set /a I=1 :SINCRO if not exist %SystemDrive%\Logs\%DATA%_%NomeCliente%_Sincronizzazione_AD_#%I%.log ( echo Eseguiamo il comando W32tm.exe /monitor ... echo +--------------------------------------------------------+ > %SystemDrive%\Logs\%DATA%_%NomeCliente%_Sincronizzazione_AD_#%I%.log echo ^| STATO DI SINCRONIZZAZIONE DEI VARI DOMAIN CONTROLLER ^| >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_Sincronizzazione_AD_#%I%.log echo +--------------------------------------------------------+ >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_Sincronizzazione_AD_#%I%.log echo. >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_Sincronizzazione_AD_#%I%.log W32tm /monitor >> %SystemDrive%\Logs\%DATA%_%NomeCliente%_Sincronizzazione_AD_#%I%.log ) else ( set /a I=I+1 goto SINCRO ) :STEP8 echo. echo Controllo di Active Directory terminato. echo. echo Per maggiori informazioni controlla i file di log echo presenti nella cartella %SystemDrive%\Logs echo. dir %SystemDrive%\Logs :END echo. endlocal exit /bPer eseguire lo script AnalisiAD.cmd, lo script AnalasiAD.cmd deve venire copiato nella cartella %SystemDrive%\Bin\Batch. Una volta copiato nella cartella %SystemDrive%\Bin\Batch, per eseguire lo script AnalisiAD.cmd baster� eseguire dalla Command Prompt il comando:
AnalisiAD
Quando verr� richiesto, indicare il nome della societ� a cui il dominio di Active Directory si riferisce, avendo cura di evitare di inserire degli spazi all'interno del nome della societ�:
C:> analisiad
Questo script svolge un'analisi diagniostica di Active Directory.
Nome del dominio DNS analizzato: homeworks.it
Inserisci il nome della societa' (senza inserire spazi): Home_Works
Come eseguire il backup di una Zona DNS integrata in Active Directory
Il servizio DNS � uno dei servizi fondamentali di Active Directory. Compromettere la zona DNS associata ad Active Directory, significa compromettere il corretto funzionamento di Active Directory stesso. Per ovviare a questo tipo di problemi, � sufficiente eseguire quotidianamente un salvataggio della zona DNS associata ad Active Directory. Per svolgere questo tipo di salvataggio, si pu� sfruttare lo script Batch DNSBackup.cmd.
Il Batch DNSBackup.cmd utilizza il comando esterno blat.exe che deve venire preventivamente copiato all'interno della cartella %SystemDrive%\Bin\Exe. Il comando esterno blat.exe ha il compito d'inviare email. Lo script DNSBackup.cmd � infatti in grado di notificare, via email, appunto, il file di log relativo all'esecuzione della procedura di salvataggio della zona DNS, di modo da conoscere se il salvataggio della zona DNS � andato bene o male. Lo script DNSBackup.cmd registra le varie operazioni eseguite all'interno del file %SystemDrive%\Logs\DNSBackup.log.
Lo script proposto, DNSBackup.cmd, � stato pensato per essere eseguito tramite lo Task Scheduler (Operazioni Pianificate) di Windows.
Il testo dello script DNSBackup.cmd � il seguente:
@echo off rem ********************************************************************* rem * * rem * NOME SCRIPT: DNSBackup.cmd * rem * * rem * Script scritto da Alessandro Tani (Home Works S.p.A.) * rem * * rem * Versione 1.0 - Modificato l'ultima volta il 4/08/2008 * rem * da Alessandro Tani * rem * SCOPO: * rem * * rem * Questo script ha il compito di eseguire il backup di una Zona * rem * DNS integrata in Active Directory * rem * * rem * File di log: %LogDir%\%DataOra%_DNSBackup.log * rem * * rem * PREREQUISITI: * rem * * rem * - Lo script deve essere eseguito con le credenziali di un * rem * utente che fa parte del gruppo globale DNS Admins * rem * - Lo script utilizza il comando %BINPATH%\blat.exe * rem * - Lo script utilizza la variabile d'ambiente %OSLanguage% * rem * * rem * TESTO: * rem * * rem * Nessuno * rem * * rem * NOTE: * rem * * rem * Nessuna * rem * * rem ********************************************************************* rem Definiamo l'ambiente locale setlocal enableextensions echo. rem Impostiamo la variabile d'ambiente che indica dove sono i file eseguibili set BINPATH=%SystemDrive%\Bin\Exe rem Controlliamo i parametri inseriti dall'utente if [%2] equ [] goto HELP if [%4] neq [] goto HELP rem Impostiamo le variabili set DNSZoneName=%1 set DataDrive=%2 set NAMESERVER=%3 set LOGFILE=%SystemDrive%\Logs\DNSBackup.log set BodyMsg=%DataDrive%\Backup\Txt\DNSBackup_Messaggio.txt set Oggetto="Esecuzione salvataggio zona DNS %DNSZoneName%" rem Impostiamo le variabili per la gestione delle notifiche via email (da modificare di volta in volta) set ServerSMTP=smtp.homeworks.it set Email=alessandro.tani@homeworks.it set From=backupadmin@homeworks.it rem Intestiamo il file di log echo ^+-----------------------------------------^+ > %LOGFILE% echo ^| FILE DI LOG DEL COMANDO DNSBACKUP.CMD ^| >> %LOGFILE% echo ^+-----------------------------------------^+ >> %LOGFILE% echo. >> %LOGFILE% rem Controlliamo le variabili d'ambiente if [%OSLanguage%] equ [] goto NOOSLanguage rem Controlliamo la presenza dei file e cartelle necessari all'esecuzione if not exist %SystemDrive%\Logs md %SystemDrive%\Logs if not exist %BINPATH%\blat.exe goto NOBLAT rem Calcoliamo la data e l'ora di esecuzione dello script if /i "%OSLanguage%" equ "EN" for /f "Tokens=1-4 Delims=/ " %%i in ('date /t') do set DATA=%%l%%k%%j-%%i if /i "%OSLanguage%" equ "EN" for /f "tokens=2-4 delims=/ " %%a in ('date /t') do set OGGDATA=%%a-%%b-%%c if /i "%OSLanguage%" equ "EN" for /f "tokens=1-4 delims=. " %%a in ('time /t') do set ORA=%%a%%b if /i "%OSLanguage%" equ "EN" for /f "tokens=1-4 delims=. " %%a in ('time /t') do set OGGORA=%%a:%%b if /i "%OSLanguage%" equ "IT" for /f "Tokens=1-4 Delims=/ " %%i in ('date /t') do set DATA=%%k%%j%%i if /i "%OSLanguage%" equ "IT" for /f "Tokens=1-4 Delims=/ " %%i in ('date /t') do set OGGDATA=%%k-%%j-%%i if /i "%OSLanguage%" equ "IT" for /f "Tokens=1-2 Delims=. " %%i in ('time /t') do set ORA=-%%i%%j if /i "%OSLanguage%" equ "IT" for /f "Tokens=1-2 Delims=. " %%i in ('time /t') do set OGGORA=%%i:%%j set ORA=%ORA::=-% set DATAeORA=%DATA%%ORA% rem Controlliamo che le cartelle che utilizza lo script esistano if not exist %DataDrive%\Backup ( echo Creaiamo la cartella %DataDrive%\Backup >> %LOGFILE% md %DataDrive%\Backup >> %LOGFILE% echo. >> %LOGFILE% ) if not exist %DataDrive%\Backup\Files ( echo Creaiamo la cartella %DataDrive%\Backup\Files >> %LOGFILE% md %DataDrive%\Backup\Files >> %LOGFILE% echo. >> %LOGFILE% ) if not exist %DataDrive%\Backup\Txt ( echo Creaiamo la cartella %DataDrive%\Backup\Txt >> %LOGFILE% md %DataDrive%\Backup\Txt >> %LOGFILE% echo. >> %LOGFILE% ) rem Cancelliamo eventuali file di backup delle zone DNS precedenti echo Cancelliamo eventuali file di backup delle zone DNS precedenti >> %LOGFILE% echo. >> %LOGFILE% if exist %DataDrive%\Backup\Files\%DNSZoneName%.backup.txt del /f /q %DataDrive%\Backup\Files >> %LOGFILE% rem Eseguiamo il backup della Zona DNS integrata con Active Directory echo Backup della zona DNS %DNSZoneName% eseguito il giorno %OGGDATA% alle %OGGORA% >> %LOGFILE% echo Backup della zona DNS %DNSZoneName% eseguito il giorno %OGGDATA% alle %OGGORA% echo. >> %LOGFILE% if [%NAMESERVER%] equ [] ( DnsCmd /ZoneExport %DNSZoneName% %DNSZoneName%.backup.txt >> %LOGFILE% echo. >> %LOGFILE% echo In allegato a questo messaggio e' riportato il file di log del salvataggio della zona %DNSZoneName% che si trova sul server %COMPUTERNAME% del %OGGDATA% alle %OGGORA% > %BodyMsg% echo Spostiamo il file %windir%\System32\dns\%DNSZoneName%.backup.txt nella cartella %DataDrive%\Backup\Files >> %LOGFILE% move /y %windir%\System32\dns\%DNSZoneName%.backup.txt %DataDrive%\Backup\Files >> %LOGFILE% ) else ( DnsCmd %NAMESERVER% /ZoneExport %DNSZoneName% %DNSZoneName%.backup.txt >> %LOGFILE% echo. >> %LOGFILE% echo In allegato a questo messaggio e' riportato il file di log del salvataggio della zona %DNSZoneName% che si trova sul server %NAMESERVER% del %OGGDATA% alle %OGGORA% > %BodyMsg% echo. >> %BodyMsg% echo Per eseguire di nuovo il salvataggio della zona DNS sul server %NAMESERVER%, ricordarsi di cancellare il file %windir%\System32\dns\%DNSZoneName%.backup.txt che si trova sul server %NAMESERVER% >> %BodyMsg% echo Per eseguire di nuovo il salvataggio della zona DNS sul server %NAMESERVER%, >> %LOGFILE% echo ricordarsi di cancellare il file %windir%\System32\dns\%DNSZoneName%.backup.txt >> %LOGFILE% echo che si trova sul server %NAMESERVER% >> %LOGFILE% ) rem Inviamo un messaggio di email echo. >> %LOGFILE% echo Inviamo il messaggio di email contente il file di log relativo al job di backup >> %LOGFILE% if [%ServerSMTP%] equ [] ( echo Non � stato impostato il server SMTP con cui inviare le email >> %LOGFILE% echo. >> %LOGFILE% echo Fine del file di log >> %LOGFILE% ) else ( echo %BINPATH%\blat.exe %BodyMsg% -attach %LOGFILE% -subject %Oggetto% -to %Email% -f %From% -server %ServerSMTP% -q >> %LOGFILE% echo. >> %LOGFILE% echo Fine del file di log >> %LOGFILE% %BINPATH%\blat %BodyMsg% -attach %LOGFILE% -subject %Oggetto% -to %Email% -f %From% -server %ServerSMTP% -q ) goto END :NOBLAT echo Non � stato possibile trovare il file %BINPATH%\blat.exe >> %LOGFILE% echo pertanto lo script non pu� essere eseguito. >> %LOGFILE% echo Controllare che il percorso del file Blat.exe sia corretto. >> %LOGFILE% goto END :NOOSLanguage echo La variabile d'ambiente "OSLanguage" non e' stata impostata >> %LOGFILE% echo per far girare questo script e' necessario impostare questa >> %LOGFILE% echo variabile. Questa variabile deve essere impostata ad IT se >> %LOGFILE% echo il sistema operativo e' in Italiano ed ad EN se il sistema >> %LOGFILE% echo operativo e' in Inglese. >> %LOGFILE% :HELP echo Questo script ha il compito di eseguire il backup di una Zona DNS echo integrata in Active Directory. echo. echo Prerequisiti: echo. echo - lo script deve venire eseguito da un utente che fa parte del echo gruppo di dominio denominato "DNS Admins" echo - Lo script utilizza il comando %BINPATH%\blat.exe echo - Lo script utilizza la variabile d'ambiente %OSLanguage% echo. echo Sintassi: echo. echo dnsbackup ^<Nome_Zona_DNS_Da_Salvare^> ^<Disco_Backup^> [Nome_DNS_Server] echo. echo Dove: echo. echo - ^<Nome_Zona_DNS_Da_Salvare^>: indica il nome della zna DNS da salvare, echo ad esempio: homeworks.it echo. echo - ^<Disco_Backup^>: su quale disco eseguire il salvataggio della zona DNS echo. echo - [Nome_DNS_Server]: questo campo e' opzionale e sta ad indicare su quale echo server DNS si trova la zona da salvare. Se lo script echo viene eseguito direttamente sul server DNS che ospita echo la zona da salvare, questa voce puo' venire omessa. echo. echo Esempi: echo. echo dnsbackup homeworks.it E: echo dnsbackup homeworks.it E: ns2.homeworks.it :END echo. endlocal exit /bLo script DNSBackup.cmd ha una parte, quella relativa alla configurazione della posta elettronica, che va modificata manualmente, in quanto non � stata parametrizzata, per poter avere una sintassi dello script pi� semplice. Le variabili che vanno impostate di volta in volta, sono le seguenti:
- ServerSMTP: l'indirizzo IP o il nome FQDN del server SMTP per l'invio dei messaggi di posta elettronica;
- Email: indirizzo email del destinatario del file di log dello script DNSBackup.cmd;
- From: indirizzo email del mittente delle notifiche email dello script DNSBackup.cmd;
- la variabile d'ambiente %OSLanguage% deve essere impostata, altrimenti lo script non verr� eseguito. La variabile d'ambiente %OSLanguage% ha il compito di consentire d'impostare correttamente la data e l'ora di esecuzione dello script;
- il comando esterno blat.exe va copiato all'interno della cartella %SystemDrive%\Bin\Exe;
- lo script Batch DNSBackup.cmd va copiato all'interno della cartella %SystemDrive%\Bin\Batch;
- l'utente con cui viene eseguito lo script deve avere o diritti amministrativi sul dominio Active Directory o far parte del gruppo globale di dominio DNS Admins.
dnsbackup <Nome_Zona_DNS_Da_Salvare> <Disco_Backup> [Nome_DNS_Server]
Dove:- <Nome_Zona_DNS_Da_Salvare>: � il nome della zona DNS da salvare (ad esempio: homeworks.it);
- <Disco_Backup>: � la lettera che identifica il disco in cui archiviare i file di log del salvataggio della zona DNS <Nome_Zona_DNS_Da_Salvare>;
- [Nome_DNS_Server]: il nome FQDN o l'indirizzo IP del server DNS (Domain Controller) che ospita la zona DNS <Nome_Zona_DNS_Da_Salvare> da salvare. Questa voce � opzionale, non � necessaria qualora il server su cui viene eseguito lo script � il server DNS (Domain Controller) che ospita la zona DNS <Nome_Zona_DNS_Da_Salvare> da salvare.
dnsbackup homeworks.it E:
qualora lo script DNSBackup.cmd venga eseguito sul server DNS (Domain Controller) che ospita la zona DNS homeworks.it. Oppurednsbackup homeworks.it E: ns2.homeworks.it
qualora lo script venga eseguito su una postazione di lavoro o un server diverso dal ns2.homeworks.it. L'esecuzione di uno o l'altro dei comandi riportati di sopra, comporta quanto segue:- qualora non fossero gi� presenti, vengono create le seguenti cartelle:
- E:\Backup
- E:\Backup\Files
- E:\Backup\Txt
- viene creato il file di log %SystemDrive%\Logs\DNSBackup.log;
- viene creato il file col messaggio da inserire nell'email di notifica, E:\Backup\Txt\DNSBackup_Messaggio.txt;
- il file di log del salvataggio della zona DNS homeworks.it, %windir%\System32\dns\homeworks.it.backup.txt, viene spostato nella cartella E:\Backup\Files;
- viene inviata un email dal titolo Esecuzione salvataggio zona DNS homeworks.it, contenente in allegato il file di log del comando DNSBackup.cmd, %SystemDrive%\Logs\DNSBackup.log.
Logon Scripts
Questa sezione si occupa dei Logon Scripts, ovvero operazioni (scripts) che vengono eseguite quando una persona effettua un Logon ad un sistema Windows 2000/XP/7 che appartiene ad un dominio Active Directory.
Come assegnare in automatico (Logon Script) le stampanti ad un utente
La gestione delle stampanti, in particolare l'assegnazione delle stampanti al personale aziendale, � uno dei maggiori crucci degli Amministratori di Sistema. Col passaggio da Windows NT 4.0 a Windows 2000, in particolare con l'adozione di Active Directory, la Microsoft ha messo a disposizione degli Amministratori di Sistema tutta una serie di strumenti e funzionalit� per agevolare la gestione e l'amministrazione delle stampanti di rete. Active Directory in particolare consente di:
- pubblicare le stampanti condivise all'intero di Active Directory per gestire pi� facilmente la loro individuazione;
- specificare all'interno del campo Location di una stampante, l'esatta ubicazione della stampante all'interno della sede o delle sedi aziendali;
- indicare all'interno degli oggetti di Active Directory preposti alla gestione delle stampanti, le varie caratteristiche (propriet�) che una stampante pu� avere, in questo modo, interrogando Active Directory, una persona pu� individuare con esattezza e facilit�, la stampante che sta cercando.
- la stampante � dotata di scheda di rete e la configurazione di rete della stampante � stata opportunamente impostata;
- la stampante � stata condivisa da una o pi� postazioni Windows 2000/2003/2008/XP/7.
Con Windows 2008/Vista/7 sono state introdotti degli accorgimenti per migliorare la sicurezza del sistema. In particolare � stata introdotta la funzionalit� Point and Print Restriction che serve a gestire la modalit� d'installazione dei driver locali delle stampanti (per amor di verit� la funzionalit� Point and Print Restriction era gi� stata introdotta con Windows XP, ma di norma non veniva mai utilizzata). Per poter eseguire comodamente lo script d'installazione delle stampanti di rete riportato di seguito, bisogna gestire il Point and Print Restriction. In particolare, disabilitando la funzionalit� di Point and Print Restriction, seppur sconsigliato, si fa in modo che le postazioni Windows Vista/7 si comportino esattamente come le postazioni Windows 2000/XP. Per maggiori informazioni sul Point and Print Restriction si possono consultare i documenti Point and Print Security on Windows Vista e Control Printer Driver Installation Security. Se non si desidera mettere mano alla Point and Print Restriction, per poter installare le stampanti sui sistemi Windows 2008/Vista/7 senza che venga richiesto alcun intervento da parte dell'utente, bisogna provvedere ad installare, manualmente ed anticipatamente, i driver delle stampanti che verranno mappate dallo script riportato di seguito.
' ********************************************************************* ' * * ' * NOME SCRIPT: MapPrinter.vbs * ' * * ' * Script scritto da Alessandro Tani (Home Works S.p.A.) * ' * * ' * Versione 1.2 - Modificato l'ultima volta il 26/08/2009 * ' * da Alessandro Tani * ' * SCOPO: * ' * * ' * Logon Script per il caricamento delle stampanti di rete. * ' * L'assegnazione delle stampanti di rete avviene per macchina, * ' * ovvero tramite il gruppo di appartenenza delle macchine e in * ' * base alla sottorete od al site in cui queste macchine si trovano * ' * al momento del logon dell'utente. * ' * * ' * File di log: Nessuno * ' * * ' * PREREQUISITI: * ' * * ' * Devono esistere le seguenti cartelle e file: * ' * * ' * Nessuno * ' * * ' * TESTO: * ' * * ' * Nessuno * ' * * ' ********************************************************************* 'Dichiariamo sempre le variabili Option Explicit 'Non gestiamo gli errori On Error Resume Next 'Definiamo gli oggetti Dim objNetwork, objSystemInfo, objShell 'Definiamo le variabili Dim strComputerName, strSite, strLocalIPAddress, strTerzoOttetto Dim intPrimoOttetto, intSecondoOttetto, intTerzoOttetto, bContinua 'Impostiamo gli oggetti Set objNetwork = CreateObject("WScript.Network") set objSystemInfo = WScript.CreateObject("ADSystemInfo") set objShell = WScript.CreateObject("WScript.Shell") strComputerName = objShell.ExpandEnvironmentStrings("%COMPUTERNAME%") strSite = objSystemInfo.SiteName 'Carichiamo le stampanti condivise a livello aziendale 'Select Case strSite ' Case "Nome-Sito" ' objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#1" ' objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#1" 'End Select 'Assegnamo le stampanti in base al gruppo di appartenenza ed alla sottorete in cui si trova la macchina 'Determiniamo a qualre rete appartiene la macchina strLocalIPAddress = GetIPAddress() if strLocalIPAddress = "Non Specificato" Then strTerzoOttetto = "1" 'Impostiamo di default la Rete #1 (10.10.1.0/24) Else 'La macchina ha un indirizzo IP valido intPrimoOttetto = InStr(1, strLocalIPAddress, ".") intSecondoOttetto = InStr(intPrimoOttetto+1, strLocalIPAddress, ".") intTerzoOttetto = InStr(intSecondoOttetto+1, strLocalIPAddress, ".") strTerzoOttetto = Mid(strLocalIPAddress,intSecondoOttetto+1, Len(strLocalIPAddress)-(intTerzoOttetto+2)) End If 'Ufficio Nome Ufficio (NomeGruppo) If IsMemberOf("NomeGruppo", strComputerName) Then Select Case strSite Case "Nome-Sito-#1" Select Case strTerzoOttetto Case 1 'Rete #1 (10.10.1.0/24) objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#1" objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#2" objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#1" Case 2 'Rete #2 (10.10.2.0/24) objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#3" objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#4" objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#3" Case 3 'Rete #3 (10.10.3.0/24) objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#5" objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#6" objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#5" End Select Case "Nome-Sito-#2" Select Case strTerzoOttetto Case 1 'Rete #1 (10.10.1.0/24) objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#7" objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#8" objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#7" Case 2 'Rete #2 (10.10.2.0/24) objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#9" objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#10" objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#9" Case 3 'Rete #3 (10.10.3.0/24) objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#11" objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#12" objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#11" End Select End Select End If 'Funzioni Function IsMemberOf(strGroupName, strComputerName) 'Funzione per sapere a quale gruppo una macchina appartiene 'Non gestiamo gli errori On Error Resume Next 'Definiamo gli oggetti Dim objRootDSE, objConnection, objCommand, objFSO, objRecordSet 'Definiamo le variabili Dim arrGroups, bIsMember, strGroups, strLocation 'Impostiamo le costanti Const ADS_SCOPE_SUBTREE = 2 'Impostiamo gli oggetti Set objRootDSE = GetObject("LDAP://rootDSE") Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" 'Eseguiamo la query in AD Set objCOmmand.ActiveConnection = objConnection objCommand.CommandText = "Select memberOf from 'LDAP://" & objRootDSE.Get("defaultNamingContext") & "' " &_ "Where objectClass='computer' and cn='" & strComputerName & "'" objCommand.Properties("Page Size") = 1000 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE Set objRecordSet = objCommand.Execute arrGroups = objRecordSet.Fields("memberOf") bIsMember = False Err.Clear If isArray(arrGroups) Then For Each strGroups In arrGroups If Err = 0 Then strLocation=instr(strGroups,",") strGroups=left(strGroups,strLocation-1) strGroups=mid(strGroups,4) If LCase(strGroups) = LCase(strGroupName) Then bIsMember = True End If End If Next End If IsMemberOf = bIsMember End Function Function GetIPAddress() 'Funzione per ottenere l'indirizzo IP locale di una macchina 'Definiamo gli oggetti Dim objWMIService, objIPAddress 'Definiamo le variabili Dim colIPAddress, strIPAddress 'Impostiamo gli oggetti Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\localhost\root\cimv2") Set objIPAddress = objWMIService.ExecQuery ("SELECT IPADDRESS FROM Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") 'Determiniamo l'indirizzo IP locale della macchina strIPAddress = "Non Specificato" For Each colIPAddress in objIPAddress If colIPAddress.IPAddress(0) <> "0.0.0.0" Then strIPAddress = colIPAddress.IPAddress(0) End If Next GetIPAddress = strIPAddress End FunctionLa filosofia che sta dietro allo script MapPrinter.vbs � la seguente:
- le stampanti condivise vengono assegnate in base alla postazione di lavoro in cui si opera;
- lo script non rimuove le stampanti condivise eventualmente presenti all'interno delle postazioni di lavoro;
- le postazioni di lavoro devono appartenere ad almeno un gruppo di Active Directory;
- in base al gruppo di appartenenza della postazione di lavoro, verranno assegnate le stampanti condivise;
- per ogni ufficio, dotato di una stampante condivisa, deve venire creato un gruppo in Active Directory, assegnato all'ufficio;
- tutte le postazioni di lavoro di un ufficio, devono appartenere al gruppo di Active Directory assegnato all'ufficio;
- lo script MapPrinter.vbs va personalizzato in base alla distribuzione geografica degli uffici all'interno delle sedi aziendali;
Se una persona si sposta da una postazione di lavoro ad un'altra, non necessariamente all'interno dello stesso ufficio, gli verranno assegnate sempre le stampanti condivise pi� comode, ovvero pi� vicine alla postazione di lavoro in cui la persona in questione si trova ad operare.
Per poter utilizzare lo script MapPrinter.vbs bisogna apportare le seguenti personalizzazioni. Il mattone fondamentale del codice dello script, � il seguente:
'Ufficio Nome Ufficio (NomeGruppo) If IsMemberOf("NomeGruppo", strComputerName) Then Select Case strSite Case "Nome-Sito-#1" Select Case strTerzoOttetto Case 1 'Rete #1 (10.10.1.0/24) objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#1" objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#2" objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#1" Case 2 'Rete #2 (10.10.2.0/24) objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#3" objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#4" objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#3" Case 3 'Rete #3 (10.10.3.0/24) objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#5" objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#6" objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#5" End Select Case "Nome-Sito-#2" Select Case strTerzoOttetto Case 1 'Rete #1 (10.10.1.0/24) objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#7" objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#8" objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#7" Case 2 'Rete #2 (10.10.2.0/24) objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#9" objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#10" objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#9" Case 3 'Rete #3 (10.10.3.0/24) objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#11" objNetwork.AddWindowsPrinterConnection "\\NomeServer\NomeCondivisioneStampante#12" objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#11" End Select End Select End IfQuesto blocco di codice si riferisce ad un solo ufficio. Vanno creati tanti blocchi di codice, come il mattone riportato di sopra, per ogni ufficio della sede aziendale dotato di stampanti condivise. Ciascun blocco di codice va personalizzato come segue:
- sostituire la sigla NomeGruppo col nome del gruppo di Active Directory assegnato all'ufficio;
- sostituire le sigle Nome-Sito-#1 e Nome-Sito-#2 col nome dei vari siti di Active Directory a cui l'ufficio appartiene;
- gestire la separazione delle reti, se presenti, utilizzando i vari ottetti che compongono un Indirizzo IP: intPrimoOttetto.intSecondoOttetto.intTerzoOttetto.0;
- sostituire le sigle \\NomeServer\NomeCondivisioneStampante#1 con i vari percorsi UNCUniversal Naming Convention. È la sintassi ufficiale della Microsoft con cui vengono identificati le varie risorse condivise di una postazione di lavoro o server: \\<Nome_NetBIOS>\<Nome_Risorsa_Condivisa> delle stampanti condivise;
- se lo si desidera, le istruzioni objNetwork.SetDefaultPrinter "\\NomeServer\NomeCondivisioneStampante#1" che servono ad impostare la stampante predefinita, possono venire eliminate;
File System
Questa sezione � dedicata alla gestione dei file e cartelle presenti all'interno di una partizione formattata con NTFS.
Come creare cartelle di una data dimensione
Non sempre risulta possibile abilitare sul file system la gestione delle quote discoLe quote disco sono delle impostazioni che fissano la dimensione massima che l'insieme dei file di un certo utente pu� occupare.. In questi casi pu� tornare utile creare una cartella che salvaguardia lo spazio disco, ovvero una cartella di dimensione prefissata che consenta di evitare la saturazione dell'intera partizione disco in cui � stata creata. Questa cartella, che d'ora in avanti chiameremo SaveSpace, � composta da file di dimensione pari a 100MB ciascuno e potr� avere una qualunque dimensione superiore ai 100MB (almeno un file nella cartella dovr� esistere).
Gli script che riportiamo di seguito sono stati pensati per essere eseguiti su un server Windows 2003. Al momento, gli script riportati non sono stati testati su piattaforma Windows 2008 o superiore. Per la corretta esecuzione dello script, i Support Tools di Windows 2003 devono essere gi� stati installati sul server in cui gli script riportati vengono eseguiti.
Per creare la cartella SaveSpace vengono utilizzati due script:- uno script VBScript chiamato SaveSpace.vbs che ha il compito di creare la cartella SaveSpace all'interno di un certo disco del server e di condividere col nome SaveSpace<Etichetta_Disco> la cartella SaveSpace stessa;
- uno script Batch, chiamato SaveSpace.cmd che ha il compito di eseguire lo script SaveSpace.vbs dalla Command Prompt.
' ********************************************************************* ' * * ' * NOME SCRIPT: SaveSpace.vbs * ' * * ' * Script scritto da Alessandro Tani (Home Works S.p.A.) * ' * * ' * Versione 1.0 - Modificato l'ultima volta il 27/12/2005 * ' * da Alessandro Tani * ' * SCOPO: * ' * * ' * Crea cartelle di una determinata dimensione riempiendola con * ' * file da 100MB l'uno * ' * * ' * File di log: Nessuno * ' * * ' * PREREQUISITI: * ' * * ' * I Support Tools di Windows 2003 devono essere installati * ' * * ' * TESTO: * ' * * ' * Nessuno * ' * * ' ********************************************************************* 'Dichiariamo sempre le variabili Option Explicit 'Non gestiamo gli errori On Error Resume Next 'Impostiamo gli aggetti Dim objArgs, objFSO, objLogFile, objWshShell 'Impostiamo le variabili Dim strPathDir, intDirSize, strPathLog, strLogFile, intCicli, objFolder, i 'Carichiamo i parametri Set objArgs = WScript.Arguments 'Impostiamo le variabili strPathDir = objArgs(0) 'Cartella da riempire con i file intDirSize = objArgs(1) 'Dimensione cartella in GigaByte strLogFile = objArgs(2) 'File di Log intCicli = intDirSize * 10 'Impostiamo gli oggetti Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objLogFile = objFSO.CreateTextFile(strLogFile, True) Set objWshShell = WScript.CreateObject("WScript.Shell") 'Impostiamo il file di Log objLogFile.WriteLine "File di Log del comando SaveSpace.vbs creato il " & Date() & "alle " & Time() objLogFile.WriteLine "" If Not objFSO.FolderExists(strPathDir) then 'La cartella SaveSpace non esiste gi� objFSO.CreateFolder(strPathDir) objLogFile.WriteLine "Creaimo la cartella " & strPathDir & " ..." objLogFile.WriteLine "" End If Set objFolder = objFSO.GetFolder(strPathDir) objLogFile.WriteLine "Lo spazio disponibile sul disco " & objFolder.Drive & _ " � di " & Int(objFolder.Drive.AvailableSpace/1048576) & "MB" objLogFile.WriteLine "" If objFolder.Drive.AvailableSpace > (intDirSize * 1073741824) Then 'Lo spazio disponibile � adeguato objLogFile.WriteLine "Elenco dei file creati all'interno della cartella " & strPathDir & " ..." objLogFile.WriteLine "" 'Riempiamo la cartella con file da 100MB For i=1 to intCicli objLogFile.WriteLine "Creiamo il file " & strPathDir & "\File_SaveSpace_#" & i & ".txt" objWshShell.Run "fsutil file createnew " & strPathDir & "\File_SaveSpace_#" & i & ".txt" & " 102400000",0,True Next 'Condividiamo la cartella SaveSpace objLogFile.WriteLine "" objLogFile.WriteLine "Condividiamo la cartella " & strPathDir & " col nome SaveSpace" & Left(objFolder.Drive,1) objWshShell.Run "net share SaveSpace" & Left(objFolder.Drive,1) & "=" & strPathDir & _ " /grant:Everyone,Full /remark:" & Chr(34) & "Salva Spazio Disco " & Left(objFolder.Drive,1) & Chr(34),0,True Else 'Lo spazio disponibile non � adeguato objLogFile.WriteLine "Lo spazio disponibile sul disco " & objFolder.Drive & " non consente la creazione di una cartella di dimensioni di " & intDirSize & "GB." objLogFile.WriteLine "Per procedere con lo scritp si deve creare una cartella di dimensioni inferiori ai " & _ Int(objFolder.Drive.AvailableSpace/1048576) & "MB" objLogFile.WriteLine "" objLogFile.WriteLine "Cancelliamo la cartella " & strPathDir objFolder.Delete End If objLogFile.WriteLine "" objLogFile.WriteLine "L'esecuzione dello script � terminata." objLogFile.CloseIl testo dello script SaveSpace.cmd � il seguente:
@echo off rem ********************************************************************* rem * * rem * NOME SCRIPT: SaveSpace.cmd * rem * * rem * Script scritto da Alessandro Tani (Home Works S.p.A.) * rem * * rem * Versione 1.0 - Modificato l'ultima volta il 27/12/2005 * rem * da Alessandro Tani * rem * SCOPO: * rem * * rem * Questo script ha il compito di creare una cartella per * rem * la salvaguardia dello spazio su dico. Questa cartella * rem * va esclusa dai cicli di salvataggio * rem * * rem * File di log: %SystemDrive%\Logs\SaveSpace.log * rem * * rem * PREREQUISITI: * rem * * rem * I Support Tools di Windows 2003 devono essere installati * rem * Il file %SystemDrive%\Bin\Vbs\SaveSpace.vbs deve esistere * rem * * rem * TESTO: * rem * * rem * Nessuno * rem * * rem ********************************************************************* rem Definiamo l'ambiente locale setlocal enableextensions echo. rem Impostiamo le variabili if "%1" equ "" goto HELP if "%2" equ "" goto HELP if "%4" neq "" goto HELP set DataDrive=%1 set SizeDir=%2 set LOGFILE=%3 if "%LOGFILE%" equ "" set LOGFILE=%SystemDrive%\Logs\SaveSpace.log rem Controlliamo l'esistenza della cartelle necessarie all'esecuzione dello script if not exist %SystemDrive%\Logs md %SystemDrive%\Logs if not exist %SystemDrive%\Bin\Vbs\SaveSpace.vbs goto NOFILE if not exist "%DataDrive%" goto NODRIVE echo Procediamo con l'esecuzione dello script ... cscript //nologo %SystemDrive%\Bin\Vbs\SaveSpace.vbs %DataDrive%\SaveSpace %SizeDir% %LOGFILE% echo L'esecuzione dello script e' terminata. echo. echo Per maggiori informazioni sulla creazione della cartella SaveSpace e echo della sua condivisione, consultate il file di log %LOGFILE% goto END :HELP echo Comando per creare la cartella SaveSpace con cui salvaguardare echo lo spazio disponibile sul server. echo. echo Sintassi: echo. echo SaveSpace ^<NomeDriveDati^> ^<DimensioneCartellaInGigaByte^> [PathFileLog] echo. echo Esempi: echo. echo SaveSpace F: 20 "C:\Logs\CreateSpace.log" echo. echo In questo caso la cartella SaveSpace verra' create nel disco F: e avra' echo la dimensione di 20GB. I risultati delle varie operazioni verranno registrati echo nel file "C:\Logs\CreateSpace.log". echo. echo SaveSpace D: 0.5 echo. echo In questo caso la cartella SaveSpace verra' create nel disco D: e avra' echo la dimensione di 500MB. goto END :NOFILE echo Il file %SystemDrive%\Bin\Vbs\SaveSpace.vbs non esiste. Pertanto non e' possibile proseguire echo nell'esecuzione dello script. Controlla che il file sia presente. echo. goto END :NODRIVE echo Il disco %DataDrive% non esiste. Pertanto non e' possibile proseguire echo nell'esecuzione dello script. Controlla dinuovo quanto hai digitato. echo. goto HELP :END echo. endlocal exit /bPer poter creare la cartella SaveSpace gli script citati vanno copiati nelle seguenti cartelle:
- lo script SaveSpace.vbs va copiato all'interno della cartella %SystemDrive%\Bin\Vbs;
- lo script SaveSpace.cmd va copiato all'interno della cartella %SystemDrive%\Bin\Batch;
SaveSpace <NomeDriveDati> <DimensioneCartellaInGigaByte> [PathFileLog]
Ad esempio, per creare una cartella SaveSpace di 2GB all'interno del disco C: di un server Windows 2003, basta eseguire il comando:SaveSpace C: 2GB
oppure:SaveSpace C: 2GB "C:\Logs\SaveSpace.log"
Gestione dei Processi e dei Servizi
In questa sezione vengono riportati gli script che si preoccupano della gestione e dei processi che abitualmente si trovano all'interno di un sistema operativo della famiglia Microsoft Windows.
Elencare i servizi presenti nel sistema operativo
In questa sezione riporto due script, uno chiamato ListServices.vbs e l'altro ListServices.cmd che hanno lo scopo di elencare i serviziPer "servizio" s'intende un processo che viene eseguito in "automatico" dal sistema operativo. definiti all'interno di un sistema operativo Windows 2000/2003/2008/XP/7. Il risultato di questi script viene utilizzato da altri script come base di analisi.
Il testo dello script ListServices.vbs � il seguente:
' ********************************************************************* ' * * ' * NOME SCRIPT: ListServices.vbs * ' * * ' * Script scritto da Alessandro Tani (Home Works S.p.A.) * ' * * ' * Versione 1.1 - Modificato l'ultima volta il 23/11/2009 * ' * da Alessandro Tani * ' * SCOPO: * ' * * ' * Ottiene l'elenco dei Servizi di una macchina con Windows 2000 * ' * o Windows 2003/2008/XP/7 e mostra il loro stato di esecuzione * ' * * ' * File di log: Nessuno * ' * * ' * PREREQUISITI: * ' * * ' * Nessuno * ' * * ' * TESTO: * ' * * ' * Nessuno * ' * * ' ********************************************************************* 'Dichiariamo sempre le variabili Option Explicit 'Impostiamo gli oggetti Dim objWMI, objService 'Impostiamo le variabili Dim strComputer, colServices 'Otteniamo l'elenco dei servizi presenti sulla macchina Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colServices = objWMI.ExecQuery("Select * from Win32_Service") 'Mostriamo lo stato di ciascun Servizio WScript.Echo "" WScript.Echo "*************************************************" WScript.Echo "** **" WScript.Echo "** STATO DEI SERVIZI PRESENTI SULLA MACCHINA **" WScript.Echo "** **" WScript.Echo "*************************************************" WScript.Echo "" For Each objService in colServices Wscript.Echo " -> " & objService.DisplayName & " (" & objService.Name & ")" & " = " & objService.State Wscript.Echo " Start with Username = " & objService.StartName NextIl testo dello script ListServices.vbs � il seguente:
@echo off rem ********************************************************************* rem * * rem * NOME SCRIPT: ListServices.cmd * rem * * rem * Script scritto da Alessandro Tani (Home Works S.p.A.) * rem * * rem * Versione 1.0 - Modificato l'ultima volta il 20/09/2006 * rem * da Alessandro Tani * rem * SCOPO: * rem * * rem * Questo script mostra lo stato dei servizi presenti * rem * sulla macchina * rem * * rem * File di log: Nessuno * rem * * rem * PREREQUISITI: * rem * * rem * Viene utilizzato il file %SystemDrive%\Bin\Vbs\ListServices.vbs * rem * * rem * TESTO: * rem * * rem * Nessuno * rem * * rem ********************************************************************* rem Definiamo l'ambiente locale setlocal enableextensions rem Controlliamo la presenza degli script necessari all'esecuzione if not exist %SystemDrive%\Bin\Vbs\ListServices.vbs goto NOSCRIPTS cscript //nologo %SystemDrive%\Bin\Vbs\ListServices.vbs goto END :NOSCRIPTS echo Il file %SystemDrive%\Bin\Vbs\ListServices.vbs non esiste. Pertanto non e' possibile proseguire echo nell'esecuzione dello script. Controlla che il file esista. echo. goto HELP :END echo. endlocal exit /bPer poter eseguire gli script ListServices.vbs e ListServices.cmd, bisogna:
- copiare lo script VBScript chiamato ListServices.vbs all'interno della cartella %SystemDrive%\Bin\Vbs;
- copiare lo script Batch chiamato ListServices.cmd all'interno della cartella %SystemDrive%\Bin\Batch;
Per eseguire gli script citati, non � necessario godere dei diritti amministrativi sulla postazione di lavoro o server.
ListServices
Come forzare il riavvio di un Servizio
Molto spesso, a causa di funzionamenti non corretti, l'unica soluzione che si trova difronte un Amministratore di Sistema, � il riavvio periodico di un serviziPer "servizio" s'intende un processo che viene eseguito in "automatico" dal sistema operativo.. A questo scopo, ho provveduto a realizzare due script:
- uno script VBScript chiamato RestartService.vbs che ha il compito di riavviare un servizio e di verificare che il riavvio del servizio vada a buon fine;
- uno script Batch chiamato RestartService.cmd che ha il compito di eseguire lo script RestartService.vbs dalla Command Prompt;
Il testo dello script RestartService.vbs � il seguente:
' ********************************************************************* ' * * ' * NOME SCRIPT: RestartService.vbs * ' * * ' * Script scritto da Alessandro Tani (Home Works S.p.A.) * ' * * ' * Versione 1.0 - Modificato l'ultima volta il 25/01/2010 * ' * da Alessandro Tani * ' * SCOPO: * ' * * ' * Riavvia un servizio se � in esecuzione. Lo script si propone * ' * di fermare tutti i servizi da cui il servizio da fermare * ' * dipende e di riavviare tutti i servizi a cui il servizio dipende * ' * * ' * File di log: %SystemDrive%\Logs\RetsartService.log * ' * * ' * PREREQUISITI: * ' * * ' * L'utente che esegue lo script deve avere diritti * ' * sulla macchina. * ' * * ' * TESTO: * ' * * ' * Nessuno * ' * * ' ********************************************************************* 'Dichiariamo sempre le variabili Option Explicit 'Impostiamo gli oggetti Dim objShell, objFSO, objWMI, objLogScript, objArgs, objEnv, objService, objDependecyService 'Impostiamo le variabili Dim sSystemDrive, strLogScript, strService, strRunTime, bRunTime, strComputer, colServices, strComputerName Dim strWMIQuery, colDependecyServiceList, iErrReturn, bDependecyService, bDependencyServiceStop Dim bDependencyServiceStart 'Impostiamo il percorso del file di log dello script Set objShell = CreateObject("WScript.Shell") Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objEnv = objShell.Environment("System") sSystemDrive = objEnv("SystemDrive") If not objFSO.FolderExists(sSystemDrive & "\Logs") then objFSO.CreateFolder(sSystemDrive & "\Logs") End If strLogScript = sSystemDrive & "\Logs\RestartService.log" Set objLogScript = objFSO.CreateTextFile(strLogScript, True) Set objArgs = WScript.Arguments 'Controlliamo gli argomenti strService = objArgs(0) 'Nome del servizio da fermare strRunTime = objArgs(1) 'Valutiamo se lo script � in modalit� run time strComputerName = objArgs(2) 'Nome del computer su cui eseguire il controllo bRunTime = FALSE If LCase(Trim(strRunTime)) = "-r" Then bRunTime = TRUE WScript.Echo "" WScript.Echo "Eseguiamo lo script in modalit� run-time ..." WScript.Echo "" End If 'Impostiamo il file di log dello script objLogScript.WriteLine "+-------------------------------------------+" objLogScript.WriteLine "| File di log dello Script RestartService |" objLogScript.WriteLine "+-------------------------------------------+" objLogScript.WriteLine "" objLogScript.WriteLine "Esecuzione del " & Date() & " alle " & Time() objLogScript.WriteLine "" ' Controlliamo se il servizio specificato � in esecuzione Set objWMI = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & strComputerName & "\root\cimv2") Set objService = objWMI.Get("Win32_Service.Name='" & strService & "'") objLogScript.WriteLine "Controlliamo lo stato di esecuzione del servizio " & Chr(34) & _ objService.DisplayName & Chr(34) & " (" & objService.Name & ")" & _ " sulla macchina " & Chr(34) & strComputerName & Chr(34) & " ..." If bRunTime Then WScript.Echo "Controlliamo lo stato di esecuzione del servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " (" & objService.Name & ")" WScript.Echo "sulla macchina " & Chr(34) & strComputerName & Chr(34) & " ..." End If If objService.State = "Stopped" Then objLogScript.WriteLine "" objLogScript.WriteLine " Il Servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " (" & objService.Name & ")" & " � gi� fermo," objLogScript.WriteLine " pertanto non necessita di essere fermato." If bRunTime Then WScript.Echo "" WScript.Echo " Il Servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " (" & objService.Name & ")" & " � gi� fermo," WScript.Echo " pertanto non necessita di essere fermato." End If Else 'Il Servizio specificato � in esecuzione objLogScript.WriteLine "" objLogScript.WriteLine " Il servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " � in esecuzione!" objLogScript.WriteLine "" 'Otteniamo l'elenco dei servizi da cui il Servizio specificato dipende strWMIQuery = "Associators of {Win32_Service.Name='" & strService &"'} _ Where AssocClass=Win32_DependentService " & "Role=Antecedent" Set colDependecyServiceList = objWMI.ExecQuery(strWMIQuery) 'Fermiamo i Servizi da cui il Servizio specificato dipende objLogScript.WriteLine "Fermiamo i servizi che dipendono dal servizio " & Chr(34) & _ objService.DisplayName & Chr(34) & " (" & objService.Name & ")." objLogScript.WriteLine "" If bRunTime Then WScript.Echo "Il servizio " & Chr(34) & objService.DisplayName & Chr(34) & " � in esecuzione!" WScript.Echo "" WScript.Echo "Fermiamo i servizi che dipendono dal servizio " & Chr(34) & _ objService.DisplayName & Chr(34) & " (" & objService.Name & ")." WScript.Echo "" End If bDependecyService = TRUE bDependencyServiceStop = TRUE For Each objDependecyService in colDependecyServiceList bDependecyService = FALSE objLogScript.WriteLine " Fermiamo il Servizio " & Chr(34) & objDependecyService.DisplayName & _ Chr(34) & " (" & objDependecyService.Name & ")" & " ..." iErrReturn = objDependecyService.StopService() If iErrReturn = 0 Then objLogScript.WriteLine " Il Servizio " & Chr(34) & objDependecyService.DisplayName & _ Chr(34) & " si � fermato regolarmente." If bRunTime Then WScript.Echo " Il Servizio " & Chr(34) & objDependecyService.DisplayName & Chr(34) & _ " si � fermato regolarmente." WScript.Echo "" End If Else 'Uno dei Servizi da cui dipende il Servizio specificato non si � fermato objLogScript.WriteLine " Il Servizio " & Chr(34) & objDependecyService.DisplayName & Chr(34) & _ " non si � fermato!" objLogScript.WriteLine " Il Codice di Errore riportato �: " & _ iErrReturn & " (" & DescrizioneErrore(iErrReturn) & ")" If bRunTime Then WScript.Echo " Il Servizio " & Chr(34) & objDependecyService.DisplayName & _ Chr(34) & " non si � fermato!" WScript.Echo " Il Codice di Errore riportato �: " & iErrReturn & _ " (" & DescrizioneErrore(iErrReturn) & ")" WScript.Echo "" End If If iErrReturn <> 6 Then 'Se il servizio � gi� fermo bDependencyServiceStop = FALSE End If End If objLogScript.WriteLine "" Next If bDependecyService Then objLogScript.WriteLine "Dal servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " (" & objService.Name & ")" & " non dipendono altri servizi." If bRunTime Then WScript.Echo "Dal servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " (" & objService.Name & ")" & " non dipendono altri servizi." End If Else objLogScript.WriteLine "Tutti i servizi che dipendono dal servizio " & _ Chr(34) & objService.DisplayName & Chr(34) & " sono stati fermati." If bRunTime Then WScript.Echo "Tutti i servizi che dipendono dal servizio " & Chr(34) & _ objService.DisplayName & Chr(34) & " sono stati fermati." End If End If 'Interrompiamo un attimo l'esecuzione dello script per consentire ai servizi di fermarsi Wscript.Sleep 20000 'Fermiamo il servizio specificato objLogScript.WriteLine "" objLogScript.WriteLine "Fermiamo il Servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " (" & objService.Name & ")" & " ..." If bRunTime Then WScript.Echo "" WScript.Echo "Fermiamo il Servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " (" & objService.Name & ")" & " ..." End If If bDependencyServiceStop Then iErrReturn = objService.StopService() If iErrReturn = 0 Then objLogScript.WriteLine "" objLogScript.WriteLine " Il Servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " si � fermato regolarmente." If bRunTime Then WScript.Echo "Il Servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " si � fermato regolarmente." End If Else 'Il Servizio specificato non si � fermato regolarmente objLogScript.WriteLine "" objLogScript.WriteLine " Il Servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " non si � fermato!" objLogScript.WriteLine " Il Codice di Errore riportato �: " & iErrReturn & _ " (" & DescrizioneErrore(iErrReturn) & ")" If bRunTime Then WScript.Echo "" WScript.Echo " Il Servizio " & Chr(34) & objService.DisplayName & _ Chr(34)& " non si � fermato!" WScript.Echo " Il Codice di Errore riportato �: " & iErrReturn & _ " (" & DescrizioneErrore(iErrReturn) & ")" End If End If Else objLogScript.WriteLine "" objLogScript.WriteLine " Poich� non tutti i servizi che diepndono dal Servizio" objLogScript.WriteLine " " & Chr(34) & objService.DisplayName & Chr(34) & _ " si sono fermati, non risulta possibile" objLogScript.WriteLine " fermare il servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " (" & objService.Name & ")" If bRunTime Then WScript.Echo "" WScript.Echo " Poich� non tutti i servizi che diepndono dal Servizio" WScript.Echo " " & Chr(34) & objService.DisplayName & Chr(34) & _ " si sono fermati, non risulta possibile" WScript.Echo " fermare il servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " (" & objService.Name & ")" End If End If End If 'Interrompiamo un attimo l'esecuzione dello script per consentire al servizio di fermarsi If bRunTime Then WScript.Echo "" WScript.Echo "Fermiamo momentaneamente l'esecuzione dello script ..." WScript.Echo "" End If Wscript.Sleep 20000 ' Controlliamo se il servizio specificato � in esecuzione Set objService = objWMI.Get("Win32_Service.Name='" & strService & "'") objLogScript.WriteLine "" objLogScript.WriteLine "Controlliamo lo stato di esecuzione del servizio " & _ Chr(34) & objService.DisplayName & Chr(34) & " (" & objService.Name & ")" & " ..." If bRunTime Then WScript.Echo "Controlliamo lo stato di esecuzione del servizio " & _ Chr(34) & objService.DisplayName & Chr(34) & " (" & objService.Name & ")" & " ..." End If If objService.State = "Running" Then objLogScript.WriteLine "" objLogScript.WriteLine " Il Servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " (" & objService.Name & ")" & " � gi� in esecuzione," objLogScript.WriteLine " pertanto non necessita di essere avviato." If bRunTime Then WScript.Echo "" WScript.Echo " Il Servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " (" & objService.Name & ")" & " � gi� in esecuzione," WScript.Echo " pertanto non necessita di essere avviato." End If Else 'Il Servizio specificato non � in esecuzione objLogScript.WriteLine "Il servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " non � in esecuzione!" objLogScript.WriteLine "" 'Otteniamo l'elenco dei servizi da cui il Servizio specificato dipende strWMIQuery = "Associators of {Win32_Service.Name='" & _ strService &"'} Where AssocClass=Win32_DependentService " & "Role=Dependent" Set colDependecyServiceList = objWMI.ExecQuery(strWMIQuery) 'Avviamo i Servizi da cui il Servizio specificato dipende objLogScript.WriteLine "Avviamo i servizi da cui il servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " (" & objService.Name & ")" & " dipende ..." objLogScript.WriteLine "" If bRunTime Then WScript.Echo "Il servizio " & Chr(34) & objService.DisplayName & Chr(34) & " non � in esecuzione!" WScript.Echo "" WScript.Echo "Avviamo i servizi da cui il servizio " & Chr(34) & objService.DisplayName & _ Chr(34) & " (" & objService.Name & ")" & " dipende ..." WScript.Echo "" End If bDependecyService = TRUE bDependencyServiceStart = TRUE For Each objDependecyService in colDependecyServiceList bDependecyService = FALSE objLogScript.WriteLine " Avviamo il Servizio " & Chr(34) & objDependecyService.DisplayName & _ Chr(34) & " (" & objDependecyService.Name & ")" & " ..." iErrReturn = objDependecyService.StartService() If iErrReturn = 0 Then objLogScript.WriteLine " Il Servizio " & Chr(34) & objDependecyService.DisplayName & Chr(34) & _ " si � avviato regolarmente." If bRunTime Then WScript.Echo " Il Servizio " & Chr(34) & objDependecyService.DisplayName & Chr(34) & _ " si � avviato regolarmente." WScript.Echo "" End If Else 'Uno dei Servizi da cui dipende il Servizio specificato non si � avviato objLogScript.WriteLine " Il Servizio " & Chr(34) & objDependecyService.DisplayName & Chr(34) & _ " non si � avviato!" objLogScript.WriteLine " Il Codice di Errore riportato �: " & iErrReturn & _ " (" & DescrizioneErrore(iErrReturn) & ")" If bRunTime Then WScript.Echo " Il Servizio " & Chr(34) & objDependecyService.DisplayName & Chr(34) & _ " non si � avviato!" WScript.Echo " Il Codice di Errore riportato �: " & iErrReturn & _ " (" & DescrizioneErrore(iErrReturn) & ")" WScript.Echo "" End If If iErrReturn <> 10 Then 'Se il servizio non � gi� in esecuzione bDependencyServiceStart = FALSE End If End If objLogScript.WriteLine "" Next If bDependecyService Then objLogScript.WriteLine "Il servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " (" & objService.Name & ")" & " non dipende da altri servizi" If bRunTime Then WScript.Echo "Il servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " (" & objService.Name & ")" & " non dipende da altri servizi" End If Else objLogScript.WriteLine "L'avvio di tutti i servizi da cui il servizio " & Chr(34) & _ objService.DisplayName & Chr(34) & " dipende � terminato." If bRunTime Then WScript.Echo "L'avvio di tutti i servizi da cui il servizio " & Chr(34) & _ objService.DisplayName & Chr(34) & " dipende � terminato." End If End If 'Avviamo il servizio specificato objLogScript.WriteLine "" objLogScript.WriteLine "Avviamo il Servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " (" & objService.Name & ")" & " ..." If bRunTime Then WScript.Echo "" WScript.Echo "Avviamo il Servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " (" & objService.Name & ")" & " ..." End If If bDependencyServiceStart Then iErrReturn = objService.StartService() If iErrReturn = 0 Then objLogScript.WriteLine "Il Servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " si � avviato regolarmente." If bRunTime Then WScript.Echo "Il Servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " si � avviato regolarmente." End If Else 'Il Servizio specificato non si � avviato regolarmente objLogScript.WriteLine "" objLogScript.WriteLine " Il Servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " non si � avviato!" objLogScript.WriteLine " Il Codice di Errore riportato �: " & iErrReturn & _ " (" & DescrizioneErrore(iErrReturn) & ")" If bRunTime Then WScript.Echo "" WScript.Echo " Il Servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " non si � avviato!" WScript.Echo " Il Codice di Errore riportato �: " & iErrReturn & _ " (" & DescrizioneErrore(iErrReturn) & ")" End If End If Else objLogScript.WriteLine "" objLogScript.WriteLine " Poich� non tutti i servizi da cui dipende il Servizio" objLogScript.WriteLine " " & Chr(34) & objService.DisplayName & Chr(34) & _ " si sono avviati, non risulta possibile" objLogScript.WriteLine " avviare il servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " (" & objService.Name & ")" If bRunTime Then WScript.Echo "" WScript.Echo " Poich� non tutti i servizi da cui dipende il Servizio" WScript.Echo " " & Chr(34) & objService.DisplayName & Chr(34) & _ " si sono avviati, non risulta possibile" WScript.Echo " avviare il servizio " & Chr(34) & objService.DisplayName & Chr(34) & _ " (" & objService.Name & ")" End If End If End If objLogScript.WriteLine "" objLogScript.WriteLine "Terminata esecuzione alle " & Time() objLogScript.WriteLine "" objLogScript.WriteLine "Fine del file di log" objLogScript.Close 'Funzioni Function DescrizioneErrore(iErrorCode) 'Descrizione degli errori relativi all'avvio di un servizio Select Case iErrorCode Case 1 DescrizioneErrore = "Not Supported" Case 2 DescrizioneErrore = "Access Denied" Case 3 DescrizioneErrore = "Dependent Services Running" Case 4 DescrizioneErrore = "Invalid Service Control" Case 5 DescrizioneErrore = "Service Cannot Accept Control" Case 6 DescrizioneErrore = "Service Not Active" Case 7 DescrizioneErrore = "Service Request Timeout" Case 8 DescrizioneErrore = "Unknown Failure" Case 9 DescrizioneErrore = "Path Not Found" Case 10 DescrizioneErrore = "Service Already Running" Case 11 DescrizioneErrore = "Service Database Locked" Case 12 DescrizioneErrore = "Service Dependency Deleted" Case 13 DescrizioneErrore = "Service Dependency Failure" Case 14 DescrizioneErrore = "Service Disabled" Case 15 DescrizioneErrore = "Service Logon Failure" Case 16 DescrizioneErrore = "Service Marked For Deletion" Case 17 DescrizioneErrore = "Service No Thread" Case 18 DescrizioneErrore = "Status Circular Dependency" Case 19 DescrizioneErrore = "Status Duplicate Name" Case 20 DescrizioneErrore = "Status Invalid Name" Case 21 DescrizioneErrore = "Status Invalid Parameter" Case 22 DescrizioneErrore = "Status Invalid Service Account" Case 23 DescrizioneErrore = "Status Service Exists" Case 24 DescrizioneErrore = "Service Already Paused" End Select End FunctionIl testo dello script RestartService.cmd � il seguente:
@echo off rem ********************************************************************* rem * * rem * NOME SCRIPT: RestartService.cmd * rem * * rem * Script scritto da Alessandro Tani (HomeWorks S.p.A.) * rem * * rem * Versione 1.0 - Modificato l'ultima volta il 25/01/2010 * rem * da Alessandro Tani * rem * SCOPO: * rem * * rem * Questo script ha il compito di riavviare un servizio ed * rem * i servizi che dipendono dal servizio che si vuole fermare * rem * * rem * File di log: %SystemDrive%\Logs\RestartService.log * rem * * rem * PREREQUISITI: * rem * * rem * Lo script utilizza il file ..\Vbs\RestartService.vbs * rem * Lo script pu� essere eseguito solamente sulle macchine * rem * con sistema operativo Windows 2000 o superiore * rem * * rem * TESTO: * rem * * rem * Nessuno * rem * * rem ********************************************************************* rem Definiamo l'ambiente locale setlocal enableextensions rem Impostiamo le variabili if "%1" equ "" goto HELP rem Controlliamo gli altri dati inseriti dall'utente if "%2" neq "" goto TEST if "%3" neq "" goto HELP rem Controlliamo la presenza degli script necessari all'esecuzione if not exist %SystemDrive%\Bin\Vbs\RestartService.vbs goto NOSCRIPTS :CONTINUE cscript //nologo %SystemDrive%\Bin\Vbs\RestartService.vbs %1 %2 %COMPUTERNAME% goto END :TEST if /i "%2" equ "-r" goto CONTINUE if /i "%2" equ "-s" goto CONTINUE echo. echo La sintassi del comando RestartService non e' corretta! goto HELP :HELP echo. echo Questo script ha il compito di riavviare un servizio echo ed i servizi che dipendono dal servizio da riavviare. echo Lo script puo' essere eseguito solamente sulle macchine che echo hanno come sistema operativo Windows 2000 od uno superiore. echo Per la sua esecuzione lo script utilizza il file echo %SystemDrive%\Bin\Vbs\RestartService.vbs che pertanto deve esistere. echo. echo Sintassi: echo. echo RestartService ^<NomeServizio^> [Opzioni] echo. echo Dove: echo. echo ^<NomeServizio^>: indica il servizio da riavviare. Per conoscere i nomi dei echo dei servizi da riavviare utilizzare il comando "ListServices". echo. echo [Opzioni]: indica le opzioni disponibili: echo. echo * L'opzione "-r" sta ad indicare che lo script viene esegiuto in modalita' echo interattiva con l'utente: vengono riporati i dettagli di ciascuna operazione. echo. echo * L'opzione "-s" sta ad indicare che lo script viene eseguito echo in modalita' silente (Default). echo. echo Per i dettagli sull'esecuzione dello script si puo' consultare echo il file di log %SystemDrive%\Logs\RestartService.log echo. echo Esempi: echo. echo Per riavviare il servizio "Smart Card" in modalita' interattiva: echo. echo RestartService SCardSvr -r echo. echo Per riavviare il servizio "Smart Card" in modalita' silente: echo. echo RestartService SCardSvr -s echo RestartService SCardSvr echo. goto END :NOSCRIPTS echo Il file %SystemDrive%\Bin\Vbs\RestartServices.vbs non esiste. echo Pertanto non e' possibile proseguire nell'esecuzione dello script. echo Controlla che il file esista. echo. goto HELP :END endlocal exit /bPer poter eseguire gli script RestartService.vbs e RestartService.cmd, bisogna prima copiarli nelle rispettive cartelle:
- lo scritp RestartService.vbs va copiato all'interno della cartella %SystemDrive%\Bin\Vbs;
- lo scritp RestartService.cmd va copiato all'interno della cartella %SystemDrive%\Bin\Batch;
RestartService <Nome_Servizio> [Opzioni]
Per ottenere il <Nome_Servizio> da riavviare, bisogna utilizzare il comando ListServices descritto nel paragrafo Elencare i servizi presenti nel sistema operativo.Ad esempio, per riavviare il servizio Smart Card basta eseguire il comando, dalla Command Prompt:
RestartService SCardSvr
Il comando RestartService ha due opzioni:- l'opzione -r sta ad indicare che lo script viene esegiuto in modalit� interattiva con l'utente: vengono riporati i dettagli di ciascuna operazione svolta dallo script RestartService;
- l'opzione -s sta ad indicare che lo script viene eseguito in modalit� silente (Default). Ovvero, non viene riportata alcuna informazione a video. Di solito, questa � l'impostazione utilizzata quando si devono realizzare degli script Batch per il riavvio periodico di un servizio. La modalit� silente � quella utilizzate per impostazione predefinita dallo script RestartService.
RestartService SCardSvr -r
Se invece si vuole utilizzare la modalit� silente:RestartService SCardSvr -s
Per conoscere la sintassi del comando RestartService, basta eseguire il comando RestartService senza parametri:RestartService SCardSvr
Bibliografia
Per coloro che desiderano approfondire la stesura degli script riportati in questo documento, consigliamo la lettura dei seguenti libri:
- Don Jones,
Managing Windows(R) with VBScript and WMI (Paperback)
(Addison-Wesley Professional, ISBN-10:0321213343, ISBN-13:978-0321213341); - Laura E. Hunter, Robbie Allen
Active Directory Cookbook, 3rd Edition (Paperback)
(O'Reilly Media, ISBN-10:0596521103, ISBN-13:978-0596521103);
Questo sito ha superato il test W3C Validator HTML e CSS