Tempo stimato di lettura: 5 minuti

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


<# 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 = @"
#<!-- #mce:0 #-->

<style _mce_bogus="1"><!-- #mce:0 #--></style>

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

&lt;# Definisco l'array #&gt;
$fragments=@()

&lt;# Catturo i drive dei pc #&gt;
$data=Get-WmiObject -Class Win32_logicaldisk -filter "drivetype=3" -computer $computers

&lt;# Raggruppo per computername #&gt;
$groups=$Data | Group-Object -Property SystemName

&lt;# Questo definisce il grafico #&gt;
[string]$g=[char]9608

&lt;# Creo parte dell'html per ogni computer #&gt;

ForEach ($computer in $groups) {

$fragments+="
<h2>$($computer.Name)</h2>
"

&lt;# Definisco i drive #&gt;
$Drives=$computer.group

&lt;# Creo il corpo dell'html #&gt;
$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 &lt; and &gt; characters
"xopenFont Color=Orangexclose{0}xopen/FontxclosexopenFont Color=LightGreenxclose{1}xopen/fontxclose" -f $usedGraph,$FreeGraph
}} | ConvertTo-Html -Fragment

$html=$html -replace "xopen","&lt;" $html=$html -replace "xclose","&gt;"

$Fragments+=$html

&lt;# Inserisco un separatore tra ogni computer #&gt;
$fragments+="
<b>----------------------------------------------------------------------------------------------------------------------------------------------------------------</b>
"

}

&lt;# Inserisco il footer #&gt;
$footer=("
<h4><i>Report generato il {0} da {1}\{2}<i></i></i></h4>
" -f (Get-Date -displayhint date),$env:userdomain,$env:username)
$fragments+=$footer

&lt;# Scrivo il risultato su file #&gt;
ConvertTo-Html -head $head -body $fragments | Out-File -FilePath "$rSavePath\DiskReport_$rToday_ext.html" -NoClobber

&lt;# Se invece che inviare il file via mail, preferisco aprirlo, cancellate il cancelletto # della prossima riga e aggiungetene uno per ogni riga successiva...#&gt;
# Invoke-Item "$rSavePath\DiskReport_$rToday_ext.html"

&lt;# Opzione per inviare mail con allegato via posta #&gt;
$SMTPServer = "smt.dominio.local"
$SMTPAuthUsername = "username@dominio.com"
$SMTPAuthPassword = "Password"

$EmailFrom = "DiskReport &lt;username@dominio.com&gt;"
$EmailTo = "&lt;destinatario@dominio.com&gt;"
$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!

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

Scarica “set_temp_usr_pwd”

(Visited 2 times, 1 visits today)