Powershell

Script Powershell Disk Report

In Powershell Script by Roberto0 Comments

Like
Like Love Haha Wow Sad Angry

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”

Like
Like Love Haha Wow Sad Angry

CONDIVIDI QUESTO ARTICOLO


Comment Policy:

I commenti che vengono espressi su questo sito, rispecchiano il pensiero di coloro i quali li esprimono. Siate, pertanto, educati e cortesi nei confronti di chiunque. Utilizzate solo il vostro vero nome e i vostri profili social per collegarvi. Utilizzare profili falsi porterà alla cancellazione del commento, al blocco dello username, al ban dell'IP dal sito e ad una eventuale segnalazione dell'IP stesso alle autorità competenti. Sul sito non sono permessi commenti anonimi, pertanto è necessario che vi autentichiate con uno dei servizi che potete trovare qui sotto. Sono ammessi l'utilizzo di immagini e link nei commenti, ma con moderazione e sempre nel rispetto altrui.