# - SnapReminder V1.0 By Virtu-Al - http://virtu-al.net
#
# Please use the below variables to define your settings before use
#
$smtpServer = "SMTPServerName"
$MailFrom = "EmailAddress"
$VISRV = "vCernterServer"
function Get-SnapshotExtra ($snap)
{
$guestName = $snap.VM # The name of the guest
$tasknumber = 999 # Windowsize of the Task collector
$taskMgr = Get-View TaskManager
# Create hash table. Each entry is a create snapshot task
$report = @{}
$filter = New-Object VMware.Vim.TaskFilterSpec
$filter.Time = New-Object VMware.Vim.TaskFilterSpecByTime
$filter.Time.beginTime = (($snap.Created).AddSeconds(-5))
$filter.Time.timeType = "startedTime"
$filter.State = "success"
$filter.Entity = New-Object VMware.Vim.TaskFilterSpecByEntity
$filter.Entity.recursion = "self"
$filter.Entity.entity = (Get-Vm-Name $snap.VM.Name).Extensiondata.MoRef
$collectionImpl = Get-View ($taskMgr.CreateCollectorForTasks($filter))
$dummy = $collectionImpl.RewindCollector
$collection = $collectionImpl.ReadNextTasks($tasknumber)
while($collection -ne $null){
$collection | where {$_.DescriptionId -eq "VirtualMachine.createSnapshot" -and $_.State -eq "success" -and $_.EntityName -eq $guestName} | %{
$row = New-Object PsObject
$row | Add-Member-MemberType NoteProperty -Name User -Value $_.Reason.UserName
$vm = Get-View $_.Entity
$snapshot = Get-SnapshotTree $vm.Snapshot.RootSnapshotList $_.Result
if ( $snapshot -ne $null)
{
$key = $_.EntityName + "&" + ($snapshot.CreateTime.ToLocalTime().ToString())
$report[$key] = $row
}
}
$collection = $collectionImpl.ReadNextTasks($tasknumber)
}
$collectionImpl.DestroyCollector()
# Get the guest's snapshots and add the user
$snapshotsExtra = $snap | % {
$key = $_.vm.Name + "&" + ($_.Created.ToLocalTime().ToString())
if($report.ContainsKey($key)){
$_ | Add-Member-MemberType NoteProperty -Name Creator -Value $report[$key].User
write-host $report[$key].User is creator of $key
}
$_
}
$snapshotsExtra
}
Function SnapMail ($Mailto, $snapshot)
{
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$msg.From = $MailFrom
$msg.To.Add($Mailto)
$msg.Subject = "Snapshot Reminder"
$MailText = @"
This is a reminder that you have a snapshot active on $($snapshot.VM) which was taken on $($snapshot.Created).
Name: $($snapshot.Name)
Description: $($snapshot.Description)
"@
$msg.Body = $MailText
$smtp.Send($msg)
}
Connect-VIServer $VISRV
foreach ($snap in (Get-VM | Get-Snapshot | Where {$_.Created -lt ((Get-Date).AddDays(-14))})){
$SnapshotInfo = Get-SnapshotExtra $snap
$mailto = ((Find-User $SnapshotInfo.Creator).Properties.mail)
SnapMail $mailto $SnapshotInfo
}