Ben's Blog

Getting PCOIP statistics via WMI using PowerShell

🏷️ vmware-horizon-view, powershell

I was at a training course last week and it was mentioned briefly on one of the slides that PCOIP session statistics were available via WMI. After a quick Google, I found MyVirtualCloud's page, which details the class, and property names.

The following is a PowerShell function, which pulls this information from WMI, appends the names and descriptions, and returns an object. <!--more--> You could, for example, export the returned object to an HTML page. Or use the function against a range of machines to look for outliers.

function Get-PCOIPStatsViaWMI($objComputerName = (throw "Please use with a computer name")){
    $arrResults = @()
    $objWMIPCoIPSessionGeneralStatistics = Get-WMIObject -Class Win32_PerfRawData_TeradiciPerf_PCoIPSessionGeneralStatistics -ComputerName $objComputerName
    $objSessionDurationSeconds = New-Object PSObject $objSessionDurationSeconds | Add-Member -Name "Name" -MemberType NoteProperty -Value "Session Duration Seconds"
    $objSessionDurationSeconds | Add-Member -Name "Description" -MemberType NoteProperty -Value "An incrementing number that represents the total number of seconds the PCoIP session has been open."
    $objSessionDurationSeconds | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionGeneralStatistics.SessionDurationSeconds
    $arrResults += $objSessionDurationSeconds
    $objBytesReceived = New-Object PSObject
    $objBytesReceived | Add-Member -Name "Name" -MemberType NoteProperty -Value "Bytes Received"
    $objBytesReceived | Add-Member -Name "Description" -MemberType NoteProperty -Value "Total number of bytes that have been received since the PCoIP session started."
    $objBytesReceived | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionGeneralStatistics.BytesReceived
    $arrResults += $objBytesReceived
    $objBytesSent = New-Object PSObject
    $objBytesSent | Add-Member -Name "Name" -MemberType NoteProperty -Value "Bytes Sent"
    $objBytesSent | Add-Member -Name "Description" -MemberType NoteProperty -Value "Total number of bytes that have been transmitted since the PCoIP session started."
    $objBytesSent | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionGeneralStatistics.BytesSent
    $arrResults += $objBytesSent
    $objPacketsReceived = New-Object PSObject 
    $objPacketsReceived | Add-Member -Name "Name" -MemberType NoteProperty -Value "Packets Received" 
    $objPacketsReceived | Add-Member -Name "Description" -MemberType NoteProperty -Value "Total number of packets that have been received since the PCoIP session started. Note that not all packets are the same size." 
    $objPacketsReceived | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionGeneralStatistics.PacketsReceived 
    $arrResults += $objPacketsReceived 
    $objPacketsSent = New-Object PSObject 
    $objPacketsSent | Add-Member -Name "Name" -MemberType NoteProperty -Value "Packets Sent" 
    $objPacketsSent | Add-Member -Name "Description" -MemberType NoteProperty -Value "Total number of packets that have been transmitted since the PCoIP session started. Note that not all packets are the same size." 
    $objPacketsSent | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionGeneralStatistics.PacketsSent 
    $arrResults += $objPacketsSent 
    $objRXPacketsLost = New-Object PSObject
    $objRXPacketsLost | Add-Member -Name "Name" -MemberType NoteProperty -Value "RX Packets Lost"
    $objRXPacketsLost | Add-Member -Name "Description" -MemberType NoteProperty -Value "Total number of receive packets that have been lost since the PCoIP session started."
    $objRXPacketsLost | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionGeneralStatistics.RXPacketsLost
    $arrResults += $objRXPacketsLost
    $objTXPacketsLost = New-Object PSObject 
    $objTXPacketsLost | Add-Member -Name "Name" -MemberType NoteProperty -Value "TX Packets Lost"
    $objTXPacketsLost | Add-Member -Name "Description" -MemberType NoteProperty -Value "Total number of transmit packets that have been lost since the PCoIP session started."
    $objTXPacketsLost | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionGeneralStatistics.TXPacketsLost
    $arrResults += $objTXPacketsLost 
    # PCOIP Session Network Statistics 
    $objWMIPCoIPSessionNetworkStatistics = Get-WMIObject -Class Win32_PerfRawData_TeradiciPerf_PCoIPSessionNetworkStatistics -ComputerName $objComputerName
    $objRoundTripLatencyms = New-Object PSObject
    $objRoundTripLatencyms | Add-Member -Name "Name" -MemberType NoteProperty -Value "Round Trip Latency ms" 
    $objRoundTripLatencyms | Add-Member -Name "Description" -MemberType NoteProperty -Value "Round trip latency (in milliseconds) between server and client." 
    $objRoundTripLatencyms | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionNetworkStatistics.RoundTripLatencyms 
    $arrResults += $objRoundTripLatencyms
    $objRXBWPeakkbitPersec = New-Object PSObject
    $objRXBWPeakkbitPersec | Add-Member -Name "Name" -MemberType NoteProperty -Value "RX BW Peak kbit/sec"
    $objRXBWPeakkbitPersec | Add-Member -Name "Description" -MemberType NoteProperty -Value "Peak bandwidth for incoming PCoIP packets within a one second sampling period."
    $objRXBWPeakkbitPersec | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionNetworkStatistics.RXBWPeakkbitPersec 
    $arrResults += $objRXBWPeakkbitPersec 
    $objTXBWActiveLimitkbitPersec = New-Object PSObject 
    $objTXBWActiveLimitkbitPersec | Add-Member -Name "Name" -MemberType NoteProperty -Value "TX BW Active Limit kbit/sec"
    $objTXBWActiveLimitkbitPersec | Add-Member -Name "Description" -MemberType NoteProperty -Value "The current estimate of the available network bandwidth, updated every second."
    $objTXBWActiveLimitkbitPersec | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionNetworkStatistics.TXBWActiveLimitkbitPersec 
    $arrResults += $objTXBWActiveLimitkbitPersec 
    # PCOIP Session Audio Statistics 
    $objWMIPCoIPPCoIPSessionAudioStatistics = Get-WMIObject -Class Win32_PerfRawData_TeradiciPerf_PCoIPSessionAudioStatistics -ComputerName $objComputerName
    $objAudioBytesReceived = New-Object PSObject
    $objAudioBytesReceived | Add-Member -Name "Name" -MemberType NoteProperty -Value "Audio Bytes Received" 
    $objAudioBytesReceived | Add-Member -Name "Description" -MemberType NoteProperty -Value "Total number of audio bytes that have been received since the PCoIP session started."
    $objAudioBytesReceived | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPPCoIPSessionAudioStatistics.AudioBytesReceived
    $arrResults += $objAudioBytesReceived
    $objAudioBytesSent = New-Object PSObject 
    $objAudioBytesSent | Add-Member -Name "Name" -MemberType NoteProperty -Value "Audio Bytes Sent"
    $objAudioBytesSent | Add-Member -Name "Description" -MemberType NoteProperty -Value "Total number of audio bytes that have been sent since the PCoIP session started."
    $objAudioBytesSent | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPPCoIPSessionAudioStatistics.AudioBytesSent 
    $arrResults += $objAudioBytesSent 
    $objAudioTXBWLimitkbitPersec = New-Object PSObject 
    $objAudioTXBWLimitkbitPersec | Add-Member -Name "Name" -MemberType NoteProperty -Value "Audio TX BW Limit kbit/sec" 
    $objAudioTXBWLimitkbitPersec | Add-Member -Name "Description" -MemberType NoteProperty -Value "Transmit bandwidth limit for outgoing audio packets as defined by the GPO setting." 
    $objAudioTXBWLimitkbitPersec | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPPCoIPSessionAudioStatistics.AudioTXBWLimitkbitPersec 
    $arrResults += $objAudioTXBWLimitkbitPersec 
    # PCOIP Session Imaging Statistics 
    $objWMIPCoIPSessionImagingStatistics = Get-WMIObject -Class Win32_PerfRawData_TeradiciPerf_PCoIPSessionImagingStatistics -ComputerName $objComputerName 
    $objImagingBytesReceived = New-Object PSObject
    $objImagingBytesReceived | Add-Member -Name "Name" -MemberType NoteProperty -Value "Imaging Bytes Received"
    $objImagingBytesReceived | Add-Member -Name "Description" -MemberType NoteProperty -Value "Total number of imaging bytes that have been received since the PCoIP session started."
    $objImagingBytesReceived | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionImagingStatistics.ImagingBytesReceived
    $arrResults += $objImagingBytesReceived 
    $objImagingBytesSent = New-Object PSObject $objImagingBytesSent | Add-Member -Name "Name" -MemberType NoteProperty -Value "Imaging Bytes Sent" 
    $objImagingBytesSent | Add-Member -Name "Description" -MemberType NoteProperty -Value "Total number of imaging bytes that have been sent since the PCoIP session started."
    $objImagingBytesSent | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionImagingStatistics.ImagingBytesSent 
    $arrResults += $objImagingBytesSent 
    $objImagingEncodedFramesPersec = New-Object PSObject 
    $objImagingEncodedFramesPersec | Add-Member -Name "Name" -MemberType NoteProperty -Value "Imaging Encoded Frames/sec" 
    $objImagingEncodedFramesPersec | Add-Member -Name "Description" -MemberType NoteProperty -Value "The number of imaging frames which were encoded over a one second sampling period."
    $objImagingEncodedFramesPersec | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionImagingStatistics.ImagingEncodedFramesPersec 
    $arrResults += $objImagingEncodedFramesPersec
    $objImagingActiveMinimumQuality = New-Object PSObject 
    $objImagingActiveMinimumQuality | Add-Member -Name "Name" -MemberType NoteProperty -Value "Imaging Active Minimum Quality" 
    $objImagingActiveMinimumQuality | Add-Member -Name "Description" -MemberType NoteProperty -Value "The lowest encoded quality (0 to 100), updated every second. Not to be confused with the GPO setting." 
    $objImagingActiveMinimumQuality | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionImagingStatistics.ImagingActiveMinimumQuality 
    $arrResults += $objImagingActiveMinimumQuality
    $objImagingDecoderCapabilitykbitPersec = New-Object PSObject
    $objImagingDecoderCapabilitykbitPersec | Add-Member -Name "Name" -MemberType NoteProperty -Value "Imaging Decoder Capability kbit/sec"
    $objImagingDecoderCapabilitykbitPersec | Add-Member -Name "Description" -MemberType NoteProperty -Value "The current estimate of the decoder processing capability."
    $objImagingDecoderCapabilitykbitPersec | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionImagingStatistics.ImagingDecoderCapabilitykbitPersec 
    $arrResults += $objImagingDecoderCapabilitykbitPersec 
    # PCOIP Session USB Statistics 
    $objWMIPCoIPSessionUSBStatistics = Get-WMIObject -Class Win32_PerfRawData_TeradiciPerf_PCoIPSessionUSBStatistics -ComputerName $objComputerName 
    # Note: The following USB session statistics are only available for the Zero Client to Soft Host configuration. # These values will be 0 for the Thin (Soft) Client to Soft Host configuration. 
    $objUSBBytesReceived = New-Object PSObject 
    $objUSBBytesReceived | Add-Member -Name "Name" -MemberType NoteProperty -Value "USB Bytes Received" 
    $objUSBBytesReceived | Add-Member -Name "Description" -MemberType NoteProperty -Value "Total number of USB bytes that have been received since the PCoIP session started." 
    $objUSBBytesReceived | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionUSBStatistics.USBBytesReceived 
    $arrResults += $objUSBBytesReceived
    $objUSBBytesSent = New-Object PSObject 
    $objUSBBytesSent | Add-Member -Name "Name" -MemberType NoteProperty -Value "USB Bytes Sent" 
    $objUSBBytesSent | Add-Member -Name "Description" -MemberType NoteProperty -Value "Total number of USB bytes that have been sent since the PCoIP session started." 
    $objUSBBytesSent | Add-Member -Name "Value" -MemberType NoteProperty -Value $objWMIPCoIPSessionUSBStatistics.USBBytesSent 
    $arrResults += $objUSBBytesSent
    Return $arrResults
}

Use like so

Get-PCOIPStatsViaWMI("Computer01")

It's not the most elegant script I've ever written. If I get the time, I think I'll try and streamline it; and maybe add some "expected ranges". I may also export a timestamped XML object, this would allow comparisons over a time-range (which will allow bandwidth calculations).

MindFlux's PCOIP log viewer is still a better solution for investigating problems on a single machine, but this might help get an overview of PCOIP performance across the whole estate.