Batch, VBScript e PowerShell

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

Per agevolare la spiegazione e l'utilizzo degli script che vengono messi a disposizione, si pressuppor� che le seguenti condizioni siano soddisfatte:

Per creare la struttura di cartelle utilizzate dagli script di HomeWorks, basta procedere come illustrato pi� sotto: Per modificare la variabile d'ambiente %PATH% e aggiumgere la variabile d'ambiente %OSLanguage%, procedere come riportato di seguito:

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:

Il testo del VBScript EnablePasswordChange.vbs � il seguente:
' *********************************************************************
' *                                                                   *
' * 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 If
Il 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 /b
Il 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 /b
Per 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 /b
Lo 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: Per poter eseguire correttamente lo script DNSBackup.cmd si deve procedere come segue: Per eseguire lo script DNSBackup.cmd basta aprire la CommandPrompt ed eseguire il comando:

dnsbackup <Nome_Zona_DNS_Da_Salvare> <Disco_Backup> [Nome_DNS_Server]

Dove: Ad esempio:

dnsbackup homeworks.it E:

qualora lo script DNSBackup.cmd venga eseguito sul server DNS (Domain Controller) che ospita la zona DNS homeworks.it. Oppure

dnsbackup 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:

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: Pi� persone possono accedere contemporaneamente ad una medesima stampante, solamente se una o entrambe le affermazioni di seguito sono soddisfatte: Una stampante dotata di scheda di rete per essere utilizzata da pi� persone, deve venire impostata, su ciascuna postazione di lavoro, come stampante locale; viceversa, per stampare su una stampante condivisa, � sufficiente mappare la stampante condivisa. In questo secondo caso, la stampante condivisa, viene configurata su ciascuna postazione di lavoro come una stampante di rete (Network Printer). La mappatura delle stampanti condivise pu� essere fatta in automatico quando una persona accede alla propria postazione di lavoro (Logon), eseguendo un opportuno script in grado di svolgere l'operazione di mappatura delle stampanti condivise. Un possibile script per svolgere la mappatura delle stampanti condivise potrebbe essere quello che riportiamo di seguito, il VBScript MapPrinter.vbs:

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 Function
La filosofia che sta dietro allo script MapPrinter.vbs � la seguente: Lo script MapPrinter.vbs, per il suo corretto funzionamento, prevede che siano soddisfatte le seguenti condizioni: Lo script MapPrinter.vbs prende in considerazione il caso in cui uno stesso ufficio possa far parte di diverse sedi aziendali, gestite all'interno dello script come siti di Active Directory. Ovvero, se ad esempio l'ufficio Personale, si trova sia nella sede principale (Nome-Sito-#1), sia in una sede secondaria che � ubicata nel sito Nome-Sito-#2, lo script assegnare le stampanti condivise in base a quale sito la postazione di lavoro si trova. Sempre lo script MapPrinter.vbs prende in considerazione anche il caso in cui pi� sedi appartengano al medesimo sito. In questo caso, ad esempio, l'ufficio Personale potrebbe essere suddiviso in tre sedi, ciascuna sede per�, fa parte dello stesso sito, Nome-Sito-#1. Nello script, si suppone che a ciascuna sede sia stata assegnata una rete LAN di Classe C, rappresentata dalle reti (di esempio): 10.10.1.0/24 (Rete #1), 10.10.2.0/24 (Rete #2) e 10.10.3.0/24 (Rete #3). Le stampanti condivise verranno assegnate in base a quale sede o rete l'ufficio Personale si trova.

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 If
Questo 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: Per avere un'idea di come gestire le stampanti all'interno di Active Directory, potete consultare il paragrafo Condivisione delle stampanti.

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: Il testo dello script SaveSpace.vbs � il seguente:
' *********************************************************************
' *                                                                   *
' * 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.Close
Il 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 /b
Per poter creare la cartella SaveSpace gli script citati vanno copiati nelle seguenti cartelle: Una volta copiati gli script SaveSpace.vbs e SaveSpace.cmd nelle rispettive cartelle, per creare la cartella SaveSpace basta eseguire, dalla Command Prompt il seguente comando:

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
Next
Il 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 /b
Per poter eseguire gli script ListServices.vbs e ListServices.cmd, bisogna: Una volta copiati gli script ListServices.vbs e ListServices.cmd all'interno delle rispettive cartelle, per ottenere l'elenco dei servizi definiti all'interno di un sistema operativo Windows 2000/2003/2008/XP/7 , basta eseguire il comando, dalla Command Prompt:

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:

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 Function
Il 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 /b
Per poter eseguire gli script RestartService.vbs e RestartService.cmd, bisogna prima copiarli nelle rispettive cartelle: Una volta copiati gli script RestartService.vbs e RestartService.cmd nelle rispettive cartelle, per riavviare un servizio di un sistema operativo Windows 2000/2003/XP baster� eseguire il seguente comando dalla Command Prompt:

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: Ad esempio, per poter visualizzare all'interno della Command Prompt, i messaggi forniti dallo script RestartService nel riavvio del servizio Smart Card, bisogna eseguire il comando:

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:

© 2020 Home Works - all rights reserved
Questo sito ha superato il test W3C Validator HTML e CSS