Script Powershell Disk Report

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 il risultato seguente:

<#

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 #>
$fragments=@()

<# 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 = “username@dominio.com”
$SMTPAuthPassword = “Password”

$EmailFrom = “DiskReport <username@dominio.com>”
$EmailTo = “<destinatario@dominio.com>”
$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

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!

Su questo sito NON c’è pubblicità e non ci sarà mai.

L’unica cosa che vi chiedo, se volete, è di utilizzare i miei link per gli acquisti su Amazon; non spenderete neppure un centesimo in più, ma Amazon mi riconoscerà una piccola percentuale sul prezzo di acquisto.

112 views
Copy link