lunedì 1 ottobre 2018

Creare utenti in più server VMWare ESXi con uno script Powershell e VMWare PowerCLI

Buongiorno a tutti.
Oggi vi mostrerò come è possibile scriptare la creazione di utenti sugli host ESXi di VMWare utilizzando Powershell e PowerCLI: un modulo molto potente per amministrare la nostra infrastruttura virtuale con Powershell.


Per prima cosa è necessario aver installato la PowerCLI nella nostra powershell… altrimenti questi comandi non funzioneranno…
Vedete quindi l’articolo “Come installare la VMWare PowerCLI in Powershell” e poi tornate qui…

Una volta installata, quando lanciamo la nostra powershell, importiamo il modulo di VMWare PowerCLI:

import-module VMware.PowerCLI


E cominciamo a SCRIPTARE…

$a = "hypervisor1.mydomain.local", "hypervisor2.mydomain.local", "hypervisor3.mydomain.local"
$userN="infranagios"
$strPW="bWtw#N--yERHGy8o"
$strDescr="a simple admin user"
$HOSTCredentials = Get-Credential -Credential root
$a | foreach {
$ESXhost =$_
Connect-VIServer $ESXhost -Credential $HOSTCredentials
New-VMHostAccount -Id $userN -Password $strPW -Description $strDescr -UserAccount -Server $ESXhost
$AuthMgr = Get-View (Get-View ServiceInstance).Content.AuthorizationManager
$Entity = Get-Folder ha-folder-root | Get-View
$Perm = New-Object VMware.Vim.Permission
$Perm.entity = $Entity.MoRef
$Perm.group = $false
$Perm.principal = $userN
$Perm.propagate = $true
$Perm.roleId = "-1"
$AuthMgr.SetEntityPermissions($Entity.MoRef,$Perm)
Disconnect-VIServer $ESXhost
}


Note importanti:

In questa dimostrazione ho deciso di copiare e incollare i comandi direttamente dentro una powershell, tuttavia nulla vi vieta di crearvi un file .ps1 e modificarlo come credete.

Come vedete qui ho fatto la scelta di definire username e password in variabile prima, ma nulla vi vieta di ciclare su un file excel e di creare tutti gli utenti su tutti i server, oppure determinati utenti su determinati server... "fate vobis"... 

Ho anche fatto un video (ho scritto in inglese, per fare un esperimento) che mostra il funzionamento dello script... ve lo "embeddo" !

Ora comentiamo insieme il codice:

1- definisco i parametri validi per tutti i servers:
$a è un elenco di server, separato da virgola, su cui vogliamo creare l’utente.
$userN è lo username che vogliamo creare
$strPW è la password che verrà assegnata all’utente.
$strDescr è la descrizione che comparirà per l’utente.

2 - A questo punto richiedo le credenziali in modo sicuro con get-credentials e le memorizzo in una variabile.

3 - Quindi comincio a ciclare su tutti i servers in elenco e, per ognuno
  • Mi connetto usando le credenziali
  • Creo l’utente con il comando New-VMHostAccount (per ora è un utente senza ruolo)
  • Ottengo l’istanza del servizio di AuthorizationManager
  • Ottengo l'istanza della "Entity" del server (o root folder)
  • Creo un nuovo oggetto permissions e gli assegno il ruolo “-1” (che è quello dell’amministratore), la associo all'utente ed alla entity del server (la root folder).
  • Salvo quindi la permission dentro l’istanza del servizio AuthorizationManager
  • mi disconnetto dal server.
Quest'ultimo passaggio (la disconnessione) è molto importante, altrimenti PowerCLI cercherà di attuare i comandi impartiti su tutti i servers connessi... Tuttavia lo script così come è non potrebbe funzionare, avendo necessità di istanziare determinati oggetti del server che vogliamo gestire. 

Uno alla volta quindi!

Happy Scripting a tutti!


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!