Mal wieder ein Klassiker… offene Snapshots.
Hier wird ein Report erstellt und per Mail geschickt, der alle offenen Snapshot der Hyper-V Umgebung (mittels SCVMM) ermittelt. Es gibt eine Besonderheit: Manche Snapshots dürfen da sein. Diese sind dann mit “persistent” in der Snapshot Beschreibung gekennzeichnet.
# Funktion um die Tabelle zu konvertieren
function Convert-Table2HTML {
<#
.SYNOPSIS
Convert a PowerShell-Table to a HTML-Table.
.DESCRIPTION
The Convert-Table2HTML cmdlet converts a PowerShell-Table to a HTML-Table in order to send it via email and have it available directly within the email.
.PARAMETER Table
Specifies the PowerShell-Table.
.EXAMPLE
PS C:\> Convert-Table2HTML -Table $ExampleTable
PS C:\> Convert-Table2HTML -Table $ExampleTable -NoteProperties "VMName, ClusterName"
.NOTES
Author: Joachim Armbruster
Blog : http://www.PowerShell24.de/
#>
Param
(
[parameter(Mandatory=$true)]$Table,
$NoteProperties
)
$Farbe1 = "bgcolor='#c5c5c5'"
$Farbe2 = "bgcolor='#f0f0f0'"
if(!$NoteProperties)
{
$NoteProperties = $Table | Get-Member -Type *Property*
$CustomNoteProperty = $false
}
else
{
$Array = $NoteProperties -Split ","
$NoteProperties = @()
foreach($Iterator in $Array)
{
While($Iterator -like "* ")
{
$Iterator = $Iterator.SubString(0, $Iterator.Length-1)
}
While($Iterator -like " *")
{
$Iterator = $Iterator.SubString(1, $Iterator.Length-1)
}
$NoteProperties += $Iterator
}
$CustomNoteProperty = $true
}
$html = "
"
$html += ""
foreach($NoteProperty in $NoteProperties)
{
if($CustomNoteProperty)
{
$NotePropertyName = $NoteProperty
}
else
{
$NotePropertyName = $NoteProperty.Name
}
$html += "$NotePropertyName | "
}
$html += "
"
$FarbenCounter = 0
for ($i = 0; $i -lt $Table.Count; $i++)
{
if(($FarbenCounter % 2) -eq 0)
{
$bgcolor = $Farbe1
}else
{
$bgcolor = $Farbe2
}
$html += ""
foreach($NoteProperty in $NoteProperties)
{
if($CustomNoteProperty)
{
$NotePropertyName = $NoteProperty
}
else
{
$NotePropertyName = $NoteProperty.Name
}
$Eintrag = $Table[$i].$NotePropertyName
$html += "$Eintrag | "
}
$html += "
"
$FarbenCounter++
}
$html += "
"
return $html
}
# Konstante definieren
$MailFrom = "Monitoring@PowerShell24.de"
$MailTo = "Joachim@PowerShell24.de"
$MailSubject = "Snapshots auf Hyper-V Umgebung"
$MailSMTPServer = "smtp.powershell24.de"
$MailBody = "Folgende Snapshots sind auf der Hyper-V Umgebung offen:"
# Start
Import-Module virtualmachinemanager
$Tabelle = @()
Get-VMCheckpoint | %{
$Name = $_.Name
$Description = $_.Description
if(($Description -notlike "*persistent*") -and ($Name -notlike "*persistent**")){
$SSSizeCombined = 0
$AddedTime = $_.AddedTime
$VMName = $_.VM.Name
$VMHost = $_.VM.VMHost
$CheckpointLocation = $_.VM.CheckpointLocation
$ID = $_.ID.Guid
$unc = "\\" + $VMHost + "\" + ($CheckpointLocation -Replace ":","$")
$UncInhalt = Get-ChildItem $unc | ? {$_.name -like "*avhd*"}
foreach ($snapshot in $UncInhalt){
$SSSizeCombined += $snapshot.Length / 1024 / 1024 / 1024
}
$SSSizeCombined = [math]::round($SSSizeCombined,2)
$Reihe = New-Object System.Object
$Reihe | Add-Member -type NoteProperty -name VMName -value $VMName
$Reihe | Add-Member -type NoteProperty -name SnapshotName -value $Name
$Reihe | Add-Member -type NoteProperty -name Erstellt -value $AddedTime
$Reihe | Add-Member -type NoteProperty -name AlleSnapshotsGB -value $SSSizeCombined
$Reihe | Add-Member -type NoteProperty -name Beschreibung -value $Description
$Tabelle += $Reihe
}
}
if ($Tabelle){
$MailBody += Convert-Table2HTML -Table ($Tabelle | sort VMName) -NoteProperties "VMName,SnapshotName,Erstellt,AlleSnapshotsGB,Beschreibung" | Out-String
Send-MailMessage -From $MailFrom -To $MailTo -Subject $MailSubject -Body $MailBody -SmtpServer $MailSMTPServer -BodyAsHTML
}