Hey, Scripting Guy!Gestire in modo semplice utenti e gruppi locali

Gli Scripting Guys di Microsoft

Scarica il codice per questo articolo: HeyScriptingGuy2007_04.exe (151KB)

Come è possibile gestire i descrittori di protezione in file e cartelle?

Che ci si creda o no, ci fu un tempo, molto lontano naturalmente, in cui gli Scripting Guys non erano così intelligenti. È difficile crederlo, ma... cosa intendete con "Non è difficile da credere"? E cosa vuol dire "Non è possibile che sia stato tanto tempo fa"? Forse è meglio che vi chiariamo le idee. Ovviamente, avete visto uno degli autori degli Scripting Guys mentre tentava di collegare il nuovo televisore qualche giorno fa.

Questo particolare Scripting Guy tuttavia direbbe in sua difesa che collegare un nuovo televisore non è scienza missilistica, è in realtà molto più complicato della scienza missilistica. Il semplice collegamento del televisore richiede l'utilizzo di tre cavi video e una coppia di cavi audio; per di più, occorre collegare un videoregistratore, un lettore DVD e un Xbox®, per non parlare dell'impostazione del controllo remoto "universale" in modo che il televisore sia in grado di riconoscere tutti questi dispositivi. In confronto a tutto questo, lanciare un satellite in orbita intorno a Marte è una passeggiata.

Sebbene tra mille difficoltà, lo Scripting Guy è riuscito alla fine a effettuare tutti questi collegamenti in modo corretto. Almeno così pensava, fino a quando non ha acceso tutti i dispositivi. Cosa è successo? Assolutamente nulla. Senza perdersi d'animo, ha controllato per tre volte ciascun collegamento. Ha consultato nuovamente tutti i manuali dell'utente e si è persino connesso a Internet nel tentativo di trovare qualche informazione utile. Nulla. Stava quasi per sacrificare il lettore MP3 al Dio dell'elettronica quando ha notato che non aveva eseguito un passaggio chiave: collegare il cavo uscente dalla cassetta di derivazione alla presa da parete.

Nota: si potrebbe pensare che le difficoltà che hanno messo a dura prova lo Scripting Guy durante l'esecuzione di questi collegamenti sia da attribuire all'eccessivo numero di dispositivi da collegare. Lo Scripting Guy sarebbe senza dubbio d'accordo con questa spiegazione. Tuttavia, ogni volta che la sua famiglia indice una votazione per decidere se sia necessario acquistare altri dispositivi, il povero Scripting Guy perde sempre per 2 a 0. In realtà il punteggio finale dovrebbe essere di 2 a 1 ma è sempre 2 a 0. Per qualche motivo, il voto dello Scripting Papà sembra non contare molto nelle elezioni familiari e non esistono "paper trail" a cui appellarsi.

Anticipo la risposta alla vostra prossima domanda e vi confermo che, ebbene sì, ci ha provato. Ma finora le Nazioni Unite non hanno accettato di inviare i monitor per le elezioni alla Scripting Casa.

A pensarci bene, tuttavia, non è tanto lontano il tempo in cui gli Scripting Guys e, in particolare lo Scripting Guy con il nuovo televisore, erano tanto stupidi quanto ingenui. Ad esempio, viene in mente il periodo della fase di pianificazione della progettazione della Microsoft® Windows® 2000 Scripting Guide e, quando giunse il momento di scrivere i capitoli del libro, sollecitarono l'aiuto di numerosi ...esperti. Uno dei capitoli che non ha avuto gran successo riguardava la gestione degli utenti e dei gruppi locali. "Gestione di utenti e gruppi locali?!?" dissero gli esperti. "Perché prendere in considerazione una tematica di questo tipo? A chi può interessare la gestione di utenti e gruppi locali?"

Tuttavia, con nostro sommo dispiacere, nel corso degli annoi abbiamo scoperto che tutti (a eccezione dei nostri "esperti" interni) sono interessati alla gestione di utenti e gruppi locali. Ogni settimana riceviamo tonnellate di messaggi di posta elettronica in cui vengono richieste informazioni su come eseguire operazioni quali l'aggiunta di un utente a un gruppo locale, l'eliminazione di un utente da un gruppo locale o la modifica della password di amministratore locale su un computer.

Per fortuna, nello Script Center Script Repository sono disponibili alcuni script di esempio in cui viene illustrato come eseguire queste attività, ma la maggior parte di questi script può essere utilizzata su un solo computer per volta. Questa soluzione non risponde tuttavia alle esigenze di gran parte degli utenti, che desiderano sapere come eseguire queste attività su più computer e come eseguirle tutte contemporaneamente. Modificare la password di amministratore locale su un singolo computer? Scripting Guys, relazionatevi con il mondo reale. A noi interessa eseguire tutte queste attività su tutti i nostri computer o su tutti i computer in un'unità organizzativa o su tutti i nostri server di posta o ... insomma, ci siamo capiti.

Se si considera che la Scripting Guide è stata pubblicata nel 2003, questo significa che per quasi quattro anni siamo stati inondati da questi messaggi di posta elettronica di questo tipo. Uno degli Scripting Guys ha di recente commentato: "Alcuni lettori desiderano sapere in che modo leggere i nomi dei computer da un foglio di calcolo di Microsoft Excel® e modificare la password di amministratore locale su ciascun computer". "Come poter soddisfare queste richieste?"

È vero, ci abbiamo impiegato quattro anni, ma alla fine abbiamo capito come risolvere il problema. Nella Figura 1 viene illustrato esattamente come eseguire questo tipo di operazioni.

Figure 1 Alla fine lo abbiamo capito.

On Error Resume Next

Set objExcel = CreateObject(“Excel.Application”)
Set objWorkbook = objExcel.Workbooks.Open(“C:\Scripts\Test.xls”)
objExcel.Visible = True

i = 2

Do Until objExcel.Cells(i, 1).Value = “”
    strComputer = objExcel.Cells(i, 1).Value   
    Set objUser = GetObject(“WinNT://” & strComputer & “/Administrator”)
    If Err = 0 Then
         objUser.SetPassword “egTY634!alK2”
         objExcel.Cells(i, 2).Value = Now
    End If
    Err.Clear
    i = i + 1
Loop

Nota: come potete notare, abbiamo impiegato quattro anni a scrivere questo script non perché fosse particolarmente complesso ma perché questo è in genere il tempo impiegato per la scrittura di qualsiasi tipo di script. Ecco perché è opportuno non mancare alle feste di capodanno annuali organizzate dagli Scripting Guys; dopo tutto, non si può mai sapere quando, o se, capiterà il successivo evento annuale.

Di seguito viene illustrato uno script che consente di leggere i nomi dei computer da un foglio di calcolo e di modificare la password di amministratore locale su ciascuno di questi computer. L'esecuzione di questa attività presuppone che si disponga di un foglio di calcolo molto semplice, simile a quello illustrato nella Figura 2. In caso contrario, crearne uno subito.

Figura 2 Elenco obbligatorio di computer

Figura 2** Elenco obbligatorio di computer **(Fare clic sull'immagine per ingrandirla)

Come potete notare, non c'è nulla di speciale in questo script. Nella colonna 1 (colonna A), sono elencati i nomi di tutti i computer per i quali è necessario modificare la password. Nella colonna 2 (colonna B) si tiene semplicemente traccia della data e dell'ora dell'ultima modifica apportata alla password di amministratore locale. Questo consente agli utenti di verificare con facilità se le password di amministratore sono tutte sincronizzate.

Lo script inizia con l'istruzione On Error Resume Next. In genere, non ci preoccupiamo di includere la gestione degli errori nei nostri script. La ragione di questo non deve essere addebitata al fatto che siamo contrari alla gestione degli errori, ma perché cerchiamo sempre di mantenere i nostri script il più brevi e semplici possibile. In questo caso, tuttavia, l'istruzione On Error Resume Next riveste un'importanza fondamentale. Dopo tutto, lo scopo di questo script è tentare di stabilire una connessione a numerosi computer. Cosa succede se uno di questi computer viene spento? Grazie alla gestione degli errori, non accadrà nulla. In realtà, un errore si verifica, ma lo script sarà in grado di eliminarlo automaticamente e procedere. Senza la gestione degli errori, ci si troverà in una situazione molto simile a quella a cui ha dovuto far fronte lo Scripting Guy quando ha acceso il nuovo televisore per la prima volta: non è successo nulla.

Successivamente, utilizziamo il seguente blocco di codice per creare un'istanza dell'oggetto Excel.Application, rendiamo visibile su schermo l'istanza di Excel e apriamo il foglio di calcolo C:\Scripts\Test.xls:

Set objExcel = CreateObject _
    (“Excel.Application”)
Set objWorkbook = objExcel.Workbooks.Open _
    (“C:\Scripts\Test.xls”)
objExcel.Visible = True

Infine, ma non meno importante, assegniamo il valore 2 a una variabile contatore denominata i. Questa variabile verrà utilizzata per tenere traccia della riga corrente nel foglio di calcolo.

Nota: perché alla variabile i viene assegnato il valore 2? È facile: se si esamina con attenzione il foglio di calcolo, si potrà notare che i dati iniziano in realtà nella riga 2. La riga 1 è semplicemente una riga di intestazione.

Visto? Potremmo non essere in grado di collegare cavi YPbPr1, ma in compenso nessuno può negare che di script qualcosa ne sappiamo.

A volte, almeno.

A questo punto, siamo pronti per metterci al lavoro. Prima di tutto, impostiamo un ciclo Do Until che viene eseguito fino a quando non viene rilevata una cella vuota nella colonna 1. Questo significa che, indipendentemente dalle operazioni in corso, non è possibile lasciare vuota alcuna riga nella colonna 1. Se lo script rileva una riga vuota, presupporrà che si sia raggiunta la fine dei dati e pertanto il ciclo (e quindi lo script) terminerà. Sebbene esistano metodi in grado di aggirare questo problema, è molto più semplice evitare di lasciare vuote le righe nel foglio di calcolo.

All'interno del ciclo, iniziamo assegnando il valore presente nella riga della cella i, colonna 1 a una variabile denominata strComputer. Tenete presente che alla prima esecuzione del ciclo, i è uguale a 2; pertanto verrà utilizzato il valore contenuto nella riga della cella 2, colonna 1. Utilizzeremo quindi questa riga di codice per creare un riferimento a un oggetto (objUser) per l'account Administrator locale sul computer rappresentato dalla variabile strComputer:

Set objUser = GetObject(“WinNT://” & _
    strComputer & “/Administrator”)

È esattamente in questa fase che lo script potrebbe generare errori. Si supponga ad esempio che si verifichino problemi di rete, che il computer sia stato spento o che uno degli Scripting Guys non abbia collegato in modo corretto il lettore DVD e abbia provocato il black-out di tutta la zona occidentale degli Stati Uniti. Se si verifica una di queste situazioni, non si sarà più in grado ovviamente di stabilire una connessione al computer. Per questo motivo, occorre controllare immediatamente il valore dell'oggetto VBScript Err.

If Err = 0 Then

Se l'oggetto Err è uguale a 0, questo indica che è possibile connettersi al computer (e all'account Administrator) senza alcun problema. Se l'oggetto Err è uguale a un valore diverso da zero, questo significa una sola cosa: il tentativo di connessione non è riuscito. In tal caso, è inutile tentare di modificare la password su tale computer, in quanto ovviamente se non è possibile stabilire una connessione, non si sarà neppure in grado di modificare la password.

Supponendo che non si verifichi alcun problema e che non venga generato alcun errore, procederemo con l'esecuzione delle due righe di codice seguenti:

objUser.SetPassword “egTY634!alK2”
objExcel.Cells(i, 2).Value = Now

Nella riga 1, utilizziamo il metodo SetPassword per assegnare una nuova password all'account Administrator locale (egTY634!alK2). Sì, lo sappiamo: è opportuno non utilizzare il nome del proprio figlio come password. Nella riga 2, scriviamo la data e l'ora correnti (utilizzando la funzione VBScript Now) nella riga della cella i, colonna 2. Tenete presente che la colonna Password modificata viene aggiornata solo se si è in grado di connettersi al computer remoto e modificare la password. Se non si è in grado di connettersi a un computer, il campo Password modificata corrispondente non verrà mai aggiornato; solo in questo modo è possibile sapere quali operazioni sono riuscite e quali non sono state completate.

Che cosa significa tutto questo? Significa che, la prima volta che si esegue il ciclo, il foglio di calcolo sarà simile a quello riportato nella Figura 3.

Figura 3 Elenco di computer dopo la reimpostazione della prima password

Figura 3** Elenco di computer dopo la reimpostazione della prima password **(Fare clic sull'immagine per ingrandirla)

A questo punto sono state completate le operazioni sul computer 1. Occorre eseguire solo alcune operazioni di ordinaria amministrazione prima di procedere:

Err.Clear
i = i + 1

Sebbene piuttosto brevi, queste due righe di codice sono molto importanti (naturalmente tutte le righe di codice scritte dagli Scripting Guys rivestono un'importanza cruciale). Nella prima riga l'oggetto Err viene reimpostato su 0. Se non si è verificato alcun errore, questa impostazione è ridondante, in quanto in questo caso Err è già uguale a 0. Se si è verificato un errore, l'oggetto Err sarà uguale a un valore diverso da 0. In tal caso, è di fondamentale importanza reimpostare manualmente l'oggetto Err. Perché? Perché si tratta dell'oggetto Error, ovvero un oggetto che tiene traccia solo degli errori, non tiene traccia delle operazioni riuscite. Si supponga ad esempio che si sia verificato un problema nel computer 1 e che non si sia in grado di stabilire una connessione. Si supponga inoltre che in seguito a questo errore l'oggetto Error sia stato impostato su 99.

Infine, si supponga che il ciclo prosegua e che si sia in grado di stabilire una connessione al computer 2. Quale sarà a questo punto il valore dell'oggetto Err? Esatto: l'oggetto Err sarà ancora impostato su 99. La ragione sta nel fatto che il valore dell'oggetto Err viene modificato solo quando si verifica un errore; in caso contrario, l'oggetto Err manterrà il valore corrente per un tempo illimitato.

Questo aspetto è importante? Dovrebbe esserlo. Dopo tutto, dal punto di vista tecnico, la password su un computer non viene modificata se si è in grado di stabilire una connessione; la password viene modificata solo se l'oggetto Err è uguale a 0. E, ovviamente, 99 non è uguale a 0 (fatta eccezione per le elezioni di famiglia dello Scripting Guy). È inoltre importante perché, anche se è stata stabilita la connessione al computer 2, l'oggetto Err non è uguale a 0 e, poiché Err non è diverso da 0, è inutile tentare di modificare la password di amministratore locale.

In altre parole, se il valore di Err viene modificato, sarà necessario reimpostare tale valore su 0; in caso contrario, da quel momento in poi lo script supporrà che si sia verificato un errore. Come reimpostare l'oggetto Err su 0? Esatto: è sufficiente chiamare Err.Clear.

In seguito, occorre incrementare il valore di i di 1. Perché? Alla prima esecuzione del ciclo, la variabile i era uguale a 2, in quanto il nostro scopo era connettersi al computer elencato nella riga 2, colonna 1. Alla seconda esecuzione del ciclo, l'obiettivo è connettersi al computer elencato nella riga 3, colonna 1. Essendo i la variabile che indica la riga che si intende utilizzare, è pertanto necessario impostare i su 3. E, se la matematica non è un'opinione, 2 + 1 = 3 (per fortuna che la Calcolatrice è sempre in esecuzione). A questo punto, proseguiremo con il ciclo e ripeteremo il processo per il successivo computer elencato nel foglio di calcolo.

Tutto ciò è estremamente interessante ma, dal momento che non siamo più così ingenui come in passato, siamo consapevoli del fatto che questo script da solo intaccherà solo in minima parte la tonnellate di messaggi ricevuti "Lo stratagemma di utilizzare il foglio di calcolo di Excel è molto interessante," molti utenti diranno, "ma ho comunque bisogno di modificare la password di amministratore locale per tutti i computer in un'unità organizzativa o per tutti i computer elencati in un file di testo". Qualcun altro potrebbe dire: "Desidero visualizzare un elenco di computer ed essere in grado di selezionarne uno dall'elenco". Qualcun altro ancora potrebbe obiettare: "Ciò che desidero veramente è ..."

Rilassatevi. Ogni vostro desiderio è un ordine per gli Scripting Guys (presupponendo che siate disposti ad attendere quattro anni prima che il vostro desiderio diventi realtà). Ebbene, nello Script Center sono pubblicati numerosi modelli di ambienti con numerosi computer, modelli che semplificano notevolmente l'esecuzione di uno script su più computer. Si supponga ad esempio che si desideri modificare la password di amministratore locale per tutti i computer all'interno di un'unità organizzativa. Nessun problema. Il modello per l'esecuzione di uno script su tutti i computer di un'unità organizzativa è simile a quello illustrato nella Figura 4.

Figure 4 Esecuzione di uno script in un'unità organizzativa

On Error Resume Next

Set objOU = GetObject(“LDAP://OU=Finance,dc=fabrikam,dc=com”)
objOU.Filter = Array(“Computer”)

For Each objComputer in objOU
    strComputer = objComputer.CN

    ‘ 
=====================================================================
    ‘ Insert your code here
    ‘ 
=====================================================================

    Set objComputer = GetObject(“WinNT://” & strComputer & “”)
    objComputer.Filter = Array(“User”)
    For Each objUser in objComputer
        Wscript.Echo objUser.Name
    Next

    ‘ 
=====================================================================
    ‘ End
    ‘ 
=====================================================================

Next

Fate riferimento alla sezione all'interno del modello relativa all'inserimento di codice. L'unica operazione da eseguire è eliminare il codice di esempio presente in questa sezione e sostituirlo con il codice (che è possibile copiare da questo articolo) per la modifica della password di amministratore locale. In altre parole, sostituire il codice di esempio con il codice seguente:

Set objUser = GetObject(“WinNT://” & _
    strComputer & “/Administrator”)
If Err = 0 Then
    objUser.SetPassword “egTY634!alK2”
End If
Err.Clear

Questo specifico codice di esempio non consente di registrare i risultati automaticamente, ma è possibile aggiungerlo manualmente con estrema semplicità. Sostituite il codice di esempio, modificate la stringa di connessione LDAP://OU=Finance,dc=fabri­kam,dc=com in modo che faccia riferimento a una delle vostre unità organizzative e il gioco è fatto.

In verità, questi modelli sono stati pubblicati più di un anno fa pensando che sarebbero diventati uno degli elementi più utilizzati dello Script Center. Ci sbagliavamo: vengono utilizzati raramente, anche se ogni giorno riceviamo numerosi messaggi di posta elettronica in cui vengono richieste informazioni su come eseguire gli script su più computer. Partiamo quindi dal presupposto che nessuno era al corrente dell'esistenza di questi modelli. Ma adesso lo sapete. O almeno lo saprete se vi indico dove reperirli: microsoft.com/technet/scriptcenter/scripts/templates. Hmmm, ora si spiega perché nessuno ha mai utilizzato questi modelli...

A questo punto, è chiaro che gli Scripting Guys non sono più così ingenui come in passato. La logica conseguenza di questo ragionamento potrebbe essere che gli Scripting Guys non sono più così stupidi come in passato? Mettiamola in questo modo. Non molto tempo fa uno degli Scripting Guys decise di trascorrere il weekend a collegare una serie di dispositivi elettronici. Quando il lunedì è tornato al lavoro, aveva un pollice fratturato che non smetteva di sanguinare e un taglio profondo sulla gamba.

Ma, tutto sommato, non era poi così doloroso. Almeno non per uno Scripting Guy.

Gli Scripting Guys di Microsoftlavorano o, per meglio dire, sono stipendiati da Microsoft. Quando non si dedicano al baseball (o a varie altre attività) da giocatori, allenatori o semplici spettatori essi gestiscono il TechNet Script Center. Consultare la pagina www.scriptingguys.com.

© 2008 Microsoft Corporation e CMP Media, LLC. Tutti i diritti riservati. È vietata la riproduzione completa o parziale senza autorizzazione.