Come sempre, per lavoro, ho avuto la solita necessità di creare uno script che facesse un check dei dischi di 70 macchine… Ho adottato la solita soluzione: creare lo script powershell DiskReport che creasse un report in formato HTML molto chiaro e di interpretazione scontata e che questo file mi fosse inviato via mail.

Lo script Powershell “DiskReport”  è uno script creato in powershell che serve solo a generare un report grafico (pagina HTML) che mi aiuti a tenere d’occhio l’utilizzo dei dischi di una settantina di server “fondamentali”. Lo script è da personalizzare e completare con i dati necessari (account e-mail, password, server smtp, ecc.) e ha due dipendenze fondamentali:
deve essere presente il file server.txt che elenchi i nomi delle macchine (uno per riga) e la cartella Report all’interno della cartella dove è presente lo script. Se manca uno di questi due dati, lo script non può funzionare!

 

Avrete questo risultato:

Disk Report Powershell

[x_code] <# Disk Report Roberto Bonfa’ Versione : 1.5 Vers. 1.5 – Aggiunto invio via e-mail del Disk Report Vers. 1.4 – Modificata la creazione della cartella, eliminando l’orario. Modificato nome file con aggiunta della data e dell’ora. Vers. 1.3 – Aggiunta creazione folder con timestamp e correzione encoding (come da SystemsReport) Vers. 1.2 – Modificate e aggiunte variabili Vers. 1.1 – Correzione bugs Vers. 1.0 – Creato script Script creato per generare un report html che visualizza l’utilizzo dello spazio disco in versione grafica. Dipendenze: In file server.txt contenente il nome delle macchine (senza dominio) su cui eseguire il check. Una riga per macchina. la cartella Report all’interno della root dove e’ contenuto lo script #>

<# Variabili #>
$rToday = Get-Date -f dd.MM.yyyy
$rToday_ext = Get-Date -f dd.MM.yyyy_ore_HH.mm
$rSavePath = “.\Report\”
$computers = (Get-Content “.\server.txt”)

<# Titolo del report#>
$Title=”DiskReport”

#embed a stylesheet in the html header
#$head = @”
#

#$Title
#
#{ clear: both; font-size: 12px; font-type: bold
#}
#”@

<# Definisco l’array #>
[email protected]()

<# Catturo i drive dei pc #>
$data=Get-WmiObject -Class Win32_logicaldisk -filter “drivetype=3″ -computer $computers

<# Raggruppo per computername #>
$groups=$Data | Group-Object -Property SystemName

<# Questo definisce il grafico #>
[string]$g=[char]9608

<# Creo parte dell’html per ogni computer #>

ForEach ($computer in $groups) {

$fragments+=”

$($computer.Name)

<# Definisco i drive #>
$Drives=$computer.group

<# Creo il corpo dell’html #>
$html=$drives | Select @{Name=”Drive”;Expression={$_.DeviceID}},
@{Name=”Size(GB)”;Expression={$_.Size/1GB -as [int]}},
@{Name=”Used(GB)”;Expression={“{0:N2}” -f (($_.Size – $_.Freespace)/1GB) }},
@{Name=”Free(GB)”;Expression={“{0:N2}” -f ($_.FreeSpace/1GB) }},
@{Name=”Usage”;Expression={
$UsedPer= (($_.Size – $_.Freespace)/$_.Size)*100
$UsedGraph=$g * ($UsedPer/2)
$FreeGraph=$g* ((100-$UsedPer)/2)
#I’m using place holders for the < and > characters
“xopenFont Color=Orangexclose{0}xopen/FontxclosexopenFont Color=LightGreenxclose{1}xopen/fontxclose” -f $usedGraph,$FreeGraph
}} | ConvertTo-Html -Fragment

$html=$html -replace “xopen”,”<” $html=$html -replace “xclose”,”>”

$Fragments+=$html

<# Inserisco un separatore tra ogni computer #>
$fragments+=”
—————————————————————————————————————————————————————-

}

<# Inserisco il footer #>
$footer=(”

Report generato il {0} da {1}\{2}

” -f (Get-Date -displayhint date),$env:userdomain,$env:username)
$fragments+=$footer

<# Scrivo il risultato su file #>
ConvertTo-Html -head $head -body $fragments | Out-File -FilePath “$rSavePath\DiskReport_$rToday_ext.html” -NoClobber

<# Se invece che inviare il file via mail, preferisco aprirlo, cancellate il cancelletto # della prossima riga e aggiungetene uno per ogni riga successiva…#>
# Invoke-Item “$rSavePath\DiskReport_$rToday_ext.html”

<# Opzione per inviare mail con allegato via posta #>
$SMTPServer = “smt.dominio.local”
$SMTPAuthUsername = “[email protected]
$SMTPAuthPassword = “Password”

$EmailFrom = “DiskReport <[email protected]>”
$EmailTo = “<[email protected]>”
$EmailSubject = “Daily Disk Report”
$emailbody = “In allegato il report di utilizzo dischi dei server, per oggi $rToday”
$emailattachment = “.\Report\DiskReport_$rToday_ext.html”

function send_email {
#Add-PSSnapin Microsoft.Exchange.Management.Powershell.Admin -erroraction silentlyContinue
$mailmessage = New-Object system.net.mail.mailmessage
$mailmessage.from = ($emailfrom)
$mailmessage.To.add($emailto)
$mailmessage.Subject = $emailsubject
$mailmessage.Body = $emailbody

$attachment = New-Object System.Net.Mail.Attachment($emailattachment, ‘text/plain’)
$mailmessage.Attachments.Add($attachment)

#$mailmessage.IsBodyHTML = $true
#$SMTPClient.EnableSsl = $true
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25)
#$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer)
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential(“$SMTPAuthUsername”, “$SMTPAuthPassword”)
# Write-Host “sending from ” $emailfrom
# Write-Host “sending to ” $emailto
# Write-Host “Subject ” $emailsubject
# Write-Host “email body ” $emailbody
$SMTPClient.Send($mailmessage)
# Remove-Variable -Name $SMTPClient
# Remove-Variable -Name $SMTPAuthUsername
# Remove-Variable -Name $SMTPAuthPassword
}

send_email

[/x_code]

Abbiamo terminato con lo script… Ora dovete solo metterlo su un server o un PC che abbia accesso al dominio e utilizzare un’utenza come Domain Admins. Buon test!

P.S.: Se volete scaricare direttamente lo script, potete prelevarlo direttamente qui sotto (tasto destro + “salva link con nome”)

[x_button shape=”square” size=”regular” float=”none” block=”false” icon_only=”true” href=”http://www.robertobonfa.it/Script/DiskReport.ps1″ title=”Scarica lo script!” target=”blank” info=”popover” info_place=”top” info_trigger=”hover” lightbox_thumb=”http://www.robertobonfa.it/storage/2017/11/powershell-icon-17192.png”]Scarica “set_temp_usr_pwd”[/x_button]