giovedì 27 settembre 2018

Come (ciclare su) leggere un file EXCEL con VBSCRIPT

Buongiorno a tutti, eccoci di nuovo qui a parlare di scripting. :-)
Oggi affrontiamo un argomento che non passa mai di moda: come leggere i file excel con vbscript e come ciclare (o looppare) sui valori contenuti in un determinato foglio (in questo caso il PRIMO) per eseguire poi altre operazioni di script sui valori che ci leggiamo dentro.

Ora, analizziamo lo scenario brevemente:

vogliamo cambiare la password di 1000 utenti nel nostro dominio (è solo una ipotesi) prendendo i valori username e password da un elenco di excel con le colonne colonne:

 -Nome Completo
 -Spazio
 -Nome
 -Cognome
 -Username (samid)
 -nuova Password

Ecco come si presenta il nostro elenco users.xlsx (fingete che ci siano 1000 righe :-P )



Di fatto, questo articolo si poteva chiamare anche:

Come cambiare la password a molti utenti contemporaneamente da un file excel.

:-P

Ma torniamo a noi:

Cominciamo con uno script innocuo: leggeremo tutte le righe del foglio da Excel (che deve essere installato sulla macchina che esegue lo script, ovvio) e faremo l'output (echo) dello username e delle nuove password.

eccolo qui:

strFileName = "C:\Users\DiegoC\Desktop\TMP\Private\SCRIPTOMANE\2018-09-25_vbscriptExcel\users.xlsx" 'definiamo il nome del file con il suo percorso completo.

Set oExcel = WScript.CreateObject("Excel.Application") ' creo l'oggetto applicazione con cui interagiremo
oExcel.Visible = True ' imposto che la finestra di excel debba essere VISIBILE, per ora. Volendo si può anche rendere invisibile.
Set theWbook = oExcel.Workbooks.Open(strFileName) ' apro il file excel
theWbook.Activate ' "attivo" il file excel tra i sotto-processi di Excel.
set theSheet = theWbook.Sheets(1) ' seleziono il primo foglio
theSheet.Activate ' attivo il primo foglio.


i = 2 ' saltiamo la prima riga, che contiene le intestazioni e andiamo direttamente alla riga 2
Do Until x = 1 ' condizione sempre vera, interromperemo il ciclo solo in determinate condizioni
    If theSheet.Cells(i,1) = "" Then ' se la riga a cui siamo arrivati, nella colonna 1 (A) è vuota, allora interrompi.
        Exit Do
    End If
   Wscript.Echo theSheet.Cells(i,5) + " - Nuova Password: " +  theSheet.Cells(i,6)' scriviamo l'output delle celle che contengono username e password, ossia 5(E) e 6(F)
    i = i + 1 ' aumentiamo il numero di riga per passare a quella successiva.
Loop


oExcel.Quit ' chiudiamo excel.


ed ecco il risultato che otterremo con CSCRIPT (dopo una breve visualizzazione del foglio excel, che compare perchè abbiamo lasciato il parametro Visible= true):



a questo punto sappiamo che lo script funziona e che è in grado di leggere le utenze dal file users.xlsx una alla volta, e le rispettive nuove password.
Quindi facciamo tesoro di quello che abbiamo imparato nell'articolo numero 3 della mini-serie dedicata agli strumenti dsadd, dsquery, dsget e dsmod per impartire un comando (usando una console da vbscript) che cambierà la password a tutti quegli utenti.

il comando singolo è questo:
dsquery user -samid #IL NOME UTENTE# | dsmod user -pwd #la sua nuova password#

ed è necessario editare lo script in questo modo per far si che la magia accada:

strFileName = "C:\Users\DiegoC\Desktop\TMP\Private\SCRIPTOMANE\2018-09-25_vbscriptExcel\users.xlsx" 'definiamo il nome del file con il suo percorso completo.

Dim shell ' dichiaro la variabile shell
Set shell = CreateObject("WScript.Shell") ' istanzio una shell nell'oggetto shell

Set oExcel = WScript.CreateObject("Excel.Application") ' creo l'oggetto applicazione con cui interagiremo
oExcel.Visible = True ' imposto che la finestra di excel debba essere VISIBILE, per ora. Volendo si può anche rendere invisibile.
Set theWbook = oExcel.Workbooks.Open(strFileName) ' apro il file excel
theWbook.Activate ' "attivo" il file excel tra i sotto-processi di Excel.
set theSheet = theWbook.Sheets(1) ' seleziono il primo foglio
theSheet.Activate ' attivo il primo foglio.


i = 2 ' saltiamo la prima riga, che contiene le intestazioni e andiamo direttamente alla riga 2
Do Until x = 1 ' condizione sempre vera, interromperemo il ciclo solo in determinate condizioni
    If theSheet.Cells(i,1) = "" Then ' se la riga a cui siamo arrivati, nella colonna 1 (A) è vuota, allora interrompi.
        Exit Do
    End If
   'Wscript.Echo theSheet.Cells(i,5) + " - Nuova Password: " +  theSheet.Cells(i,6)' scriviamo l'output delle celle che contengono username e password, ossia 5(E) e 6(F)
    comando="dsquery user -samid " + theSheet.Cells(i,5) + "| dsmod user -pwd " + "" + theSheet.Cells(i,6)+ "" ' creo il comando che verrà eseguito
    shell.Run comando ' eseguo il comando nella shell
    i = i + 1 ' aumentiamo il numero di riga per passare a quella successiva.
Loop


oExcel.Quit ' chiudiamo excel.

A questo punto, quando lanceremo lo script con CSCRIPT (da un account amministratore di dominio o che al minimo sia autorizzato a resettare quelle password), le password di tutti quegli utenti verranno modificate.


Happy Scripting!





P.S. alcune limitazioni: le password con caratteri particolari che vengono interpretati da batch come comandi (es. |, ^, !, %, ...) non possono funzionare con questo sistema, salvo farne l'escape con il carattere cappelletto ("^") direttamente nel valore dell'excel.

L'ho appena testato ed è così. :-)
es. di password escapata: pippo^%pluto^!

Nessun commento:

Posta un commento

I commenti sono soggetti a moderazione, prima di essere pubblicati.

Qualsiasi contenuto illecito, immorale o che io ritenga (arbitrariamente) offensivo od inappropriato, verrà cancellato.