Monitoring with PowerShell: Monitoring Windows Performance Index

First things are first: I just got awarded the new and prestigious Azure Hero award. Im an Azure Content Hero, of which only 250 are awarded. I am super thankful and very excited for this as its a great recognition for my work on this blog. I really want to thank the people that nominated me.

So now that we have that out of the way, lets get to scripting. This time we’re doing some workstation experience monitoring, I like monitoring the actual user experience on machines. This gives us a change to actively improve the lives of users that are working on slow machines by preventively replacing them, or by notifying them we’re seeing performance problems.

The Windows Experience Index was introduced in Windows 7 as a method to gauge how well your computer is running both hardware and software wise. I like to run this script every couple of hours to grab the most recent result of ‘winsat’ test. This shows if a machine is slowing down etc. We also decided that any machine that scores lower than a 6.5 is going to be replaced, because be honest; who would want to work on a slow machine right?

The script

So this one is pretty straight forward, set your “failing score” and let it run. The script prints everything to the console as well, in case you want to run it on demand instead of via your RMM system.

$FailingThreshold = 6.5

$WinSatResults = Get-CimInstance Win32_WinSAT | Select-Object CPUScore, DiskScore, GraphicsScore, MemoryScore, WinSPRLevel

$WinSatHealth = foreach ($Result in $WinSatResults) {
    if ($Result.CPUScore -lt $FailingThreshold) { "CPU Score is $($result.CPUScore). This is less than $FailingThreshold" }
    if ($Result.DiskScore -lt $FailingThreshold) { "Disk Score is $($result.Diskscore). This is less than $FailingThreshold" }
    if ($Result.GraphicsScore -lt $FailingThreshold) { "Graphics Score is $($result.GraphicsScore). This is less than $FailingThreshold" }
    if ($Result.MemoryScore -lt $FailingThreshold) { "RAM Score is $($result.MemoryScore). This is less than $FailingThreshold" }
    if ($Result.WinSPRLevel -lt $FailingThreshold) { "Average WinSPR Score is $($result.winsprlevel). This is less than $FailingThreshold" }
}
if (!$WinSatHealth) {
    $AllResults = ($Winsatresults | out-string)
    $WinSatHealth = "Healthy. $AllResults"
}

And that’s it! short and sweet, and it allows for a bit more user experience monitoring. As always, Happy PowerShelling!

3 thoughts on “Monitoring with PowerShell: Monitoring Windows Performance Index

  1. Michael McCool

    I ran into a machine that had an invalid WinSAT state and added a small addition to the script to check for any systems which doesn’t show a good state for the WinSAT data. I put this check near the top of the script. I set it to exit the script with a failure errorlevel.
    —————————————————————————–
    # Check to make sure there is a vald WinSat assessment available.
    # “1” indicates a valid assesment is available, any other value shows issues with WinSAT on the system.
    $WinSatStatus= (Get-CimInstance Win32_WinSAT).WinSATAssessmentState
    if ($WinSatStatus -ne “1”) {
    Write-Output “WinSAT has not run or contains invalid data. No score is available for this device.”
    exit 1
    }

    Reply
  2. Pingback: Monitoring with PowerShell: user experience issues & Unifi EOL Monitoring - CyberDrain

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.