I was recently working on a PVS deployment where we wanted to monitor and alert on target devices that were exceeding 70% write cache utilization. Since there wasn’t a way to do this in the PVS console, I dug into the PVS PoSH SDK to find a way to do this programatically.
After some research I came up with the following script that will check all target devices in a PVS farm, and send an email alert listing any machines that are using 70%+ of their write cache (adjustable via the $threshold variable):
$pass = cat .\securestring.txt | ConvertTo-SecureString $mycred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "domain\admin",$pass $message = @() $threshold = 70 function get-value{ param([string]$strText="",[string]$strDelimiter="") return $strText.SubString($strText.IndexOf($strDelimiter)+2) } function get-name{ param([string]$strText="",[string]$strDelimiter="") return $strText.SubString(0,$strText.IndexOf($strDelimiter)) } Add-PSSnapin McliPS* -ErrorAction SilentlyContinue $all = @() $obj = New-Object System.Collections.ArrayList $lines = Mcli-Get DeviceInfo -f ServerName,ServerIpConnection,DeviceName,SiteName,CollectionName,Active,Status,diskLocatorName for($i=0;$i -lt $lines.length;$i++){ if(($lines[$i].length -gt 0) -and ($lines[$i].contains(":")) -and -not ($lines[$i] -match "Executing: Get ")) { $name = get-name -strText $lines[$i] -strDelimiter ":" $value = get-value -strText $lines[$i] -strDelimiter ":" if ($name -eq "status" -and $value.Length -le 0) { $value = "0" } if ($value.Contains(",") -and $name -eq "status") { $obj | Add-Member -membertype noteproperty -name $name -Value $value.Split(",")[1] }else{ $obj | Add-Member -membertype noteproperty -name $name -Value $value } } if($lines[$i].contains("#") -or (($i+1) -eq $lines.length)){ $all += $obj $obj = New-Object psObject } } foreach ($item in $all) { if ([int] $item.status -gt $threshold) { $message += $item } } $message = $message | Where-Object -FilterScript { ([int] $_.status -gt 0) -and ([int]$_.status -le 100) } | Sort-Object {[int] $_.status} -descending | Format-Table @{Expression={$_.deviceName};Label="Device"}, @{Expression={$_.status};Label="RAM Cache Used (%)"} function sendMail{ Write-Host "Sending Email" #SMTP server name $smtpServer = "mail.domain.com" #Creating a Mail object $msg = new-object Net.Mail.MailMessage #Creating SMTP server object $smtp = new-object Net.Mail.SmtpClient($smtpServer) $smtp.Credentials = $mycred #Email structure $msg.From = "[email protected]" $msg.ReplyTo = "[email protected]" $msg.To.Add("[email protected]") $msg.subject = "PVS Write Cache $($threshold)%+ Utilization: " + $summary $msg.body = Out-String -InputObject $message $msg.priority = "High" #Sending email $smtp.Send($msg) } if ($message.Count -gt 0) { sendMail }