domenica 30 settembre 2018

Come leggere il serial number del computer direttamente da windows

Buongiorno a tutti,
 eccoci qui di nuovo a parlare di scripting e di automazione windows.


Oggi vediamo come sia possibile ottenere il Serial Number, il produttore, il produttore della BIOS, ed altre interessanti informazioni direttamente da windows con un piccolo script, che interpella le proprietà della BIOS con vbscript.

Ecco qui lo script.
const ForWriting = 2

set Dic = createObject("Scripting.dictionary")
Set objFSO = createObject("Scripting.FilesystemObject")
Set oShell = CreateObject("Wscript.Shell")
Set varAmbientali = oShell.Environment("PROCESS")
nomecomputer = varAmbientali("COMPUTERNAME")
fileLog = nomecomputer & "_info.txt"
Set objFileLog = objFSO.OpenTextFile(fileLog, ForWriting, True)

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colBIOS = objWMIService.ExecQuery _
    ("Select * from Win32_BIOS")

   
Set objB = objWMIService.Get("Win32_BIOS").Spawninstance_
   
for each objProp in objB.Properties_
    dim objProp
    Dic.Add objProp.Name, ""
    REM wscript.echo objProp.Name & ": " & " - tipo: " & TypeName(objProp) & "- Array : " & objProp.value
   
   
    REM for each objPP in objProp
        REM For i = 0 to Ubound(objBIOS.BIOSVersion)
            REM wscript.echo ObjB.Properties_(objProp.Name)(i)
        REM next
    REM next
next



REM for each strPName in Dic.Keys
    REM wscript.echo strPName & ": " & objB.Properties_(strPName).Value
REM next
   
For each objBIOS in colBIOS
    for each strPName in Dic.Keys
        REM wscript.echo strPName
        REM strCodeT = "wscript.echo strPName & "" - "" & typeName(objBIOS." & strPName & ")"
        REM execute strCodeT
        strCode = "t = typeName(objBIOS." & strPName & ")"
        executeGlobal strCode
        select case t
            Case "String"
                strCode1 = "objFileLog.WriteLine strPName & "": "" & objBIOS." & strPName
            Case "Boolean"
                strCode1 = "objFileLog.WriteLine strPName & "": "" & objBIOS." & strPName
            Case "Date"
                strCode1 = "objFileLog.WriteLine strPName & "": "" & objBIOS." & strPName
            Case "Int"
                strCode1 = "objFileLog.WriteLine strPName & "": "" & objBIOS." & strPName
            Case "Long"
                strCode1 = "objFileLog.WriteLine strPName & "": "" & objBIOS." & strPName
            Case "Variant()"
                strCode1 = "For i = 0 to Ubound(objBIOS." & strPName & ")" & vbCrLf & "objFileLog.WriteLine strPName & "": "" & objBIOS." & strPName & "(i)" & vbCrLf & "Next"
            Case Else
                strCode1 = "objFileLog.WriteLine strPName & "": "" "
        end select
        executeGlobal strCode1
        REM wscript.echo strPName & ": " & objBIOS.
    next
   
    REM objFileLog.WriteLine "Caption: " & objBIOS.Caption
    REM objFileLog.WriteLine "Build Number: " & objBIOS.BuildNumber
    REM objFileLog.WriteLine "Current Language: " & objBIOS.CurrentLanguage
    REM objFileLog.WriteLine "Installable Languages: " & objBIOS.InstallableLanguages
    REM objFileLog.WriteLine "Manufacturer: " & objBIOS.Manufacturer
    REM objFileLog.WriteLine "Name: " & objBIOS.Name
    REM objFileLog.WriteLine "Caption: " & objBIOS.Caption
    REM objFileLog.WriteLine "Description: " & objBIOS.Description
    REM objFileLog.WriteLine "IdentificationCode: " & objBIOS.IdentificationCode
    REM objFileLog.WriteLine "InstallableLanguages: " & objBIOS.InstallableLanguages
    REM objFileLog.WriteLine "InstallDate: " & objBIOS.InstallDate
    REM objFileLog.WriteLine "Primary BIOS: " & objBIOS.PrimaryBIOS
    REM objFileLog.WriteLine "Release Date: " & objBIOS.ReleaseDate
    REM objFileLog.WriteLine "Serial Number: " & objBIOS.SerialNumber
    REM objFileLog.WriteLine "SMBIOS Version: " & objBIOS.SMBIOSBIOSVersion
    REM objFileLog.WriteLine "SMBIOS Major Version: " & objBIOS.SMBIOSMajorVersion
    REM objFileLog.WriteLine "SMBIOS Minor Version: " & objBIOS.SMBIOSMinorVersion
    REM objFileLog.WriteLine "SMBIOS Present: " & objBIOS.SMBIOSPresent
    REM objFileLog.WriteLine "Status: " & objBIOS.Status
    REM objFileLog.WriteLine "Version: " & objBIOS.Version
    REM For i = 0 to Ubound(objBIOS.BIOSVersion)
        REM objFileLog.WriteLine "BIOS Version: " & _
            REM objBIOS.BIOSVersion(i)
    REM Next
    REM For i = 0 to Ubound(objBIOS.BiosCharacteristics)
        REM objFileLog.WriteLine "BIOS Characteristics: " & _
            REM objBIOS.BiosCharacteristics(i)
    REM Next
   
   
   

Next







In pratica, utilizzando WMI (Windows Management Instrumentation), leggiamo le proprietà possibili della BIOS in un dictionary object e quindi le interroghiamo poi per ogni istanza di BIOS trovata nel sistema (solitamente solo 1 :-) ), a questo punto "componiamo" delle stringhe comando, in base alle casistiche in cui ci troviamo, per rendere leggibile il tutto e poi scriviamo in un file che ha nome del computer.


Happy Scripting!

sabato 29 settembre 2018

Installare la VMWare PowerCLI in Powershell con NuGet


Buongiorno a tutti,
 oggi vi parlerò di come cominciare ad amministrare la vostra infrastruttura virtuale VMWare con gli script. Pensavate non fosse possibile? Vi sbagliavate!

VMWare ha messo a disposizione dei Sysadmins una serie di comandi per renderci la vita MOOOLTO più semplice.

Attraverso la PowerCLI, possiamo gestire e mantenere un ambiente virtualizzato VMware anche multiserver.

PowerCLI è uno strumento molto potente che può essere utilizzato per raccogliere informazioni dettagliate e/o eseguire comandi su molteplici macchine virtuali, host e apparati di rete e storage compatibili.

I requisiti per installare la PowerCLI sono:

  • accesso di rete al (o ai) VMware vCenter server (oppure agli Host ESXi)
  • Windows PowerShell 2.0 con .NET 3.5 SP1 o superiore (meglio però installare le versioni più aggiornate)


In questa guida step-by-step vedremo:

  • preparare il sistema per installare la PowerCLI
  • Installare la VMWare PowerCLI direttamente da internet con install-module e NuGet


Prepararsi con NuGet

dal nostro PC connesso ad internet è possibile utilizzare il comando:

find-module -name VMWare.PowerCLI

Ci chiederà di installare il provider NuGet, rispondiamo di SI.





A questo punto possiamo controllare rapidamente quali sono i moduli Powershell disponibili con il comando:

get-module VMWare* -ListAvailable

Ed otterremo un elenco vuoto… il che non è esattamente quello che vogliamo, no?




Installare la VMWare PowerCLI direttamente da internet

È necessario quindi installare il module VMWare.PowerCLI  con il comando:

Install-Module -name VMWare.PowerCLI

Ci chiederà conferma nell’utilizzo di un “Archivio non attendibile” (in inglese sarebbe “untrusted repository”, così è più facile da capire…)
Confermiamo pure…





A questo punto, rilanciando il comando :

get-module VMWare* -ListAvailable

Ci troveremo davanti una situazione di questo tipo:

Il che significa che la PowerCLI è stata installata correttamente.
A questo punto abbiamo a disposizione una serie molto molto vasta di comandi per interagire con la nostra infrastruttura VMWARE!


Happy Scripting!!

giovedì 27 settembre 2018

Un IP SCANNER in BATCH da una riga di codice, senza installare niente

Buongiorno a tutti,
 eccoci qui di nuovo a parlare di scripting e di belle cose che si possono automatizzare con i nostri comandi interpretati.

Oggi voglio parlarvi di un trucco che uso spesso quando mi trovo in situazioni nelle quali devo identificare tutti gli host attivi di una rete e non ho possibilità (o voglia, o tempo) di installare un software per farlo.

Sinceramente, non capisco perché andiamo a scomodare programmi e installare cose sul PC, quando possiamo tranquillamente aprire un prompt dei comandi e digitare


For /L %a IN (1,1,254) DO @ping -n 1 -w 100 192.168.1.%a | FIND /I "risposta"


Ovviamente, vi devo spiegare.
Per prima cosa so che la mia rete di casa è con indirizzamento 192.168.1.xxx, ossia 24 bit di subnet mask (255.255.255.0), ossia, in soldoni: va da 192.168.1.1 a 192.168.1.254.

Informazioni facilmente ottenibili anche da qualsiasi computer con il comando : ipconfig

Quindi scelgo di ciclare con FOR, partendo da 1, aggiungendo 1 ad ogni ciclo e fino ad arrivare a 254 (1,1,254) e memorizzando il valore attuale nella variabile %a.

Nota importante:

Se mettete questo comando in un file .bat, %a deve diventare %%a


Per ogni ciclo, poi, pingo l'indirizzo 192.168.1.%a (dove %a prenderà il valore del ciclo attuale) e cerco, nell'output del comando, la parola "Risposta", in modo case-insensitive (/I) con FIND.

Per andare più veloce e avere un output più pulito, faccio un ping una volta sola per ciclo (-n 1) e do un timeout di 100 millisecondi (-w 100).

ed ecco il risultato che otteniamo



in sintesi, in ogni riga c'è un indirizzo IP che ha risposto al PING.

Facile, no?

Happy Scripting!


Come (ciclare su) leggere un file excel con Powershell

Buongiorno a tutti,
 eccoci qui con un altro articolo interessante che vede protagonisti excel e gli script.

Nello scorso articolo "Come (ciclare su) leggere un file EXCEL con VBSCRIPT" abbiamo visto come è possibile leggere un file di excel da vbscript e lanciare dei comandi riga per riga, con i valori delle celle come parametri.

Oggi vediamo come fare la stessa cosa... ...con Powershell!

Bando alle ciance, ecco cosa faremo:

  1. Creeremo un file excel con gli utenti che ci interessa usare
  2. Cicleremo (loop) sul file excel per ottenere ogni utente
  3. Interpelleremo il dominio Active Directory per ottenere informazioni su ciascun utente: vedremo l'ultima volta che l'utente ha cambiato la password



Il file excel users.xlsx

ecco come si presenta il nostro file (l'ho riciclato dall'altro articolo):

come vedete, nella colonna E troviamo lo username degli utenti.

Lo script

import-module activedirectory #importo il modulo Active Directory

$ExcelObject = new-Object -comobject Excel.Application  # creo l'instanza di programma excel
$ExcelObject.visible = $false # non voglio che la finestra di excel sia visibile
$ExcelObject.DisplayAlerts =$false # non voglio vedere alerts o messaggi da excel.
$strPath1="C:\Users\DiegoC\Desktop\TMP\Private\SCRIPTOMANE\2018-09-25_powershell_excel\users.xlsx"  # definisco il percorso del file excel.

if (Test-Path $strPath1) {  #controllo che il file ESISTA
$ActiveWorkbook = $ExcelObject.WorkBooks.Open($strPath1)  # apro il workbook excel.
$ActiveWorksheet = $ActiveWorkbook.Worksheets.Item(1)  # seleziono il foglio numero 1
} else { 
echo "ORRORE: il file excel non esiste"; # altrimenti scrivo un messaggio simpatico....
}
$intRow = 2 # parto dalla riga 2, perchè la prima contiene le intestazioni
Do {
    $UserName = $ActiveWorksheet.Cells.Item($intRow, 5).Value() #leggo lo username dalla quinta colonna (E)
    $FName = $ActiveWorksheet.Cells.Item($intRow, 1).Value() #leggo il full Name dalla prima colonna (A)
    $obj = get-aduser $UserName -Properties PasswordLastSet # ottengo da AD le proprietà dell'utente, incluso quando ha cambiato la pw l'ultima volta.
    write-host "l'utente " $FName " ha cambiato la password il " $obj.PasswordLastSet
    $intRow++

} While ($ActiveWorksheet.Cells.Item($intRow,1).Value() -ne $null) #continuo fino a che non trovo una riga vuota.
$ExcelObject.Workbooks.Close() # chiudo il file
$ExcelObject.Quit() # chiudo excel






Il risultato


Come vedete, leggere un file excel con Powershell, riga per riga, non è molto diverso da come si fa con Vbscript. Tuttavia Powershell offre veramente moltissime possibilità per amministrare i nostri server, le nostre applicazioni e, in generale, interagire con windows in maniera parecchio facile e veloce.

Ad esempio, se ci trovassimo su un server Exchange (o se stessimo interagendo con il server dal nostro client attraverso una session remota di Powershell) potremmo lanciare dei comandi per ogni casella di posta o utente riportato nel nostro file...



A voi la scelta dei comandi da far eseguire alla nostra amata Powershell, con i dati che leggete da excel!

Happy Scripting!

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^!