Powershell

Script Powershell Disk Report

In Powershell Script by RobertoLeave a Comment

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

<br />
&lt;# 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 #&gt;</p>
<p>&lt;# Variabili #&gt;<br />
$rToday = Get-Date -f dd.MM.yyyy<br />
$rToday_ext = Get-Date -f dd.MM.yyyy_ore_HH.mm<br />
$rSavePath = ".\Report\"<br />
$computers = (Get-Content ".\server.txt")</p>
<p>&lt;# Titolo del report#&gt;<br />
$Title="DiskReport"</p>
<p>#embed a stylesheet in the html header<br />
#$head = @"<br />
#<!-- #mce:0 #--></p>
<style _mce_bogus="1"><!-- #mce:0 #--></style>
<p>#$Title<br />
#<br />
#{ clear: both; font-size: 12px; font-type: bold<br />
#}<br />
#"@</p>
<p>&lt;# Definisco l'array #&gt;<br />
$fragments=@()</p>
<p>&lt;# Catturo i drive dei pc #&gt;<br />
$data=Get-WmiObject -Class Win32_logicaldisk -filter "drivetype=3" -computer $computers</p>
<p>&lt;# Raggruppo per computername #&gt;<br />
$groups=$Data | Group-Object -Property SystemName</p>
<p>&lt;# Questo definisce il grafico #&gt;<br />
[string]$g=[char]9608</p>
<p>&lt;# Creo parte dell'html per ogni computer #&gt;</p>
<p>ForEach ($computer in $groups) {</p>
<p>$fragments+="</p>
<h2>$($computer.Name)</h2>
<p>"</p>
<p>&lt;# Definisco i drive #&gt;<br />
$Drives=$computer.group</p>
<p>&lt;# Creo il corpo dell'html #&gt;<br />
$html=$drives | Select @{Name="Drive";Expression={$_.DeviceID}},<br />
@{Name="Size(GB)";Expression={$_.Size/1GB -as [int]}},<br />
@{Name="Used(GB)";Expression={"{0:N2}" -f (($_.Size - $_.Freespace)/1GB) }},<br />
@{Name="Free(GB)";Expression={"{0:N2}" -f ($_.FreeSpace/1GB) }},<br />
@{Name="Usage";Expression={<br />
$UsedPer= (($_.Size - $_.Freespace)/$_.Size)*100<br />
$UsedGraph=$g * ($UsedPer/2)<br />
$FreeGraph=$g* ((100-$UsedPer)/2)<br />
#I'm using place holders for the &lt; and &gt; characters<br />
"xopenFont Color=Orangexclose{0}xopen/FontxclosexopenFont Color=LightGreenxclose{1}xopen/fontxclose" -f $usedGraph,$FreeGraph<br />
}} | ConvertTo-Html -Fragment</p>
<p>$html=$html -replace "xopen","&lt;" $html=$html -replace "xclose","&gt;"</p>
<p>$Fragments+=$html</p>
<p>&lt;# Inserisco un separatore tra ogni computer #&gt;<br />
$fragments+="<br />
<b>----------------------------------------------------------------------------------------------------------------------------------------------------------------</b><br />
"</p>
<p>}</p>
<p>&lt;# Inserisco il footer #&gt;<br />
$footer=("</p>
<h4><i>Report generato il {0} da {1}\{2}<i></i></i></h4>
<p>" -f (Get-Date -displayhint date),$env:userdomain,$env:username)<br />
$fragments+=$footer</p>
<p>&lt;# Scrivo il risultato su file #&gt;<br />
ConvertTo-Html -head $head -body $fragments | Out-File -FilePath "$rSavePath\DiskReport_$rToday_ext.html" -NoClobber</p>
<p>&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;<br />
# Invoke-Item "$rSavePath\DiskReport_$rToday_ext.html"</p>
<p>&lt;# Opzione per inviare mail con allegato via posta #&gt;<br />
$SMTPServer = "smt.dominio.local"<br />
$SMTPAuthUsername = "username@dominio.com"<br />
$SMTPAuthPassword = "Password"</p>
<p>$EmailFrom = "DiskReport &lt;username@dominio.com&gt;"<br />
$EmailTo = "&lt;destinatario@dominio.com&gt;"<br />
$EmailSubject = "Daily Disk Report"<br />
$emailbody = "In allegato il report di utilizzo dischi dei server, per oggi $rToday"<br />
$emailattachment = ".\Report\DiskReport_$rToday_ext.html"</p>
<p>function send_email {<br />
#Add-PSSnapin Microsoft.Exchange.Management.Powershell.Admin -erroraction silentlyContinue<br />
$mailmessage = New-Object system.net.mail.mailmessage<br />
$mailmessage.from = ($emailfrom)<br />
$mailmessage.To.add($emailto)<br />
$mailmessage.Subject = $emailsubject<br />
$mailmessage.Body = $emailbody</p>
<p>$attachment = New-Object System.Net.Mail.Attachment($emailattachment, 'text/plain')<br />
$mailmessage.Attachments.Add($attachment)</p>
<p>#$mailmessage.IsBodyHTML = $true<br />
#$SMTPClient.EnableSsl = $true<br />
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25)<br />
#$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer)<br />
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("$SMTPAuthUsername", "$SMTPAuthPassword")<br />
# Write-Host "sending from " $emailfrom<br />
# Write-Host "sending to " $emailto<br />
# Write-Host "Subject " $emailsubject<br />
# Write-Host "email body " $emailbody<br />
$SMTPClient.Send($mailmessage)<br />
# Remove-Variable -Name $SMTPClient<br />
# Remove-Variable -Name $SMTPAuthUsername<br />
# Remove-Variable -Name $SMTPAuthPassword<br />
}</p>
<p>send_email</p>
<p>

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”

Roberto Administrator
Info su di me
Informatico di professione. Nerd per passione. Totalmente malato per la tecnologia.
Sono una persona socievole, gentile ed educata. Sono mattiniero, ma anche notturno.
Amo la compagnia delle persone che mi piacciono e so dare molto più di ciò che mi si chiede.
Preferisco fare shopping piuttosto che passare una giornata in piscina
Odio volare, ho il terrore di volare!
Amo le giornate di pioggia e la neve. Odio il caldo.
Ho una memoria eccezionale e questo non è quasi mai un bene, anzi…
Sono esageratamente testardo, quando penso ne valga la pena. So ciò che voglio e lotto sempre, finché posso, per ottenerlo.
Sono molto pretenzioso. È molto facile deludermi e quasi impossibile sorprendermi.
Sono impulsivo, stronzo, ma sempre leale e sincero.
I filtri dell’imbarazzo, della delicatezza e della vergogna a me non li hanno applicati.
Sono molto vendicativo e rancoroso, ma – soprattutto – molto difficilmente dimentico un torto e raramente perdono chi me lo ha fatto.
Odio, in assoluto, le falsità, le menzogne ed essere preso per il culo.

QUI, se volete, potete leggere qualcosa di più su di me; la versione completa.
×
Roberto Administrator
Informatico di professione. Nerd per passione. Totalmente malato per la tecnologia.
Sono una persona socievole, gentile ed educata. Sono mattiniero, ma anche notturno.
Amo la compagnia delle persone che mi piacciono e so dare molto più di ciò che mi si chiede.
Preferisco fare shopping piuttosto che passare una giornata in piscina
Odio volare, ho il terrore di volare!
Amo le giornate di pioggia e la neve. Odio il caldo.
Ho una memoria eccezionale e questo non è quasi mai un bene, anzi…
Sono esageratamente testardo, quando penso ne valga la pena. So ciò che voglio e lotto sempre, finché posso, per ottenerlo.
Sono molto pretenzioso. È molto facile deludermi e quasi impossibile sorprendermi.
Sono impulsivo, stronzo, ma sempre leale e sincero.
I filtri dell’imbarazzo, della delicatezza e della vergogna a me non li hanno applicati.
Sono molto vendicativo e rancoroso, ma – soprattutto – molto difficilmente dimentico un torto e raramente perdono chi me lo ha fatto.
Odio, in assoluto, le falsità, le menzogne ed essere preso per il culo.

QUI, se volete, potete leggere qualcosa di più su di me; la versione completa.
Like
Like Love Haha Wow Sad Angry

CONDIVIDI QUESTO ARTICOLO