This post is part of a 6 part series. Jump to [part 2][part 3][part 4][part 5][part 6]

Intro

There’s quite a bit of data that we can gather via queries to MFCom.  With this series I want to demonstrate how to use PowerShell, MS SQL, SQL Reporting Services and Visual Studio to gather real-time stats and present them in a dashboard that is easy to read and even easier to present to management.

I’m presenting today an edited PowerShell script that I grabbed from SynJunkie’s PowerShell - Retrieving Useful Citrix Stats.  Syn is also writing a hacking Citrix series of articles that is proving to be very interesting.

Here’s the original script:

#Count-CitrixSession.ps1

# Count citrix sessions and other useful info
$farm = new-Object -com "MetaframeCOM.MetaframeFarm"
$farm.Initialize(1)

# Displays a list of published apps and the number of users on each
write-host "Total users on each citrix application" -fore yellow
$farm.sessions | select UserName,AppName | group AppName | Sort Count -desc | select Count,Name | ft -auto
write-host "The number of current citrix sessions is" $livesessions -fore red
write-host " "

# List of Citrix servers and total number of sessions on each one
write-host "Total sessions on each citrix server" -fore yellow
$farm.sessions | select ServerName,AppName | group ServerName | sort name | select Count,Name | ft -auto
write-host " "

# To see which users have more than one session open
write-host "First 15 Users with more than one citrix session" -fore yellow
$farm.sessions | select UserName,AppName | group UserName | Sort Count -desc | select Count,Name -first 15 | ft -auto

This script is useful, but I found that it took several minutes to run in our environment due to iterating through all our Citrix sessions 3 times.  To speed the script up and ensure the data did not change as the script was running I loaded everything into an array and then replicated the data output.

$livesessions = 0
$disconnected = 0
$farm = New-Object -com "MetaframeCOM.MetaframeFarm"
$farm.Initialize(1)

# Load Up Array for a snapshot of current sessions in Citrix
$sessionAry = @($farm.Sessions | select UserName,AppName,ServerName,SessionState)
foreach ($sess in $sessionAry) {
    if ($sess.SessionState -eq "5") {$disconnected = $disconnected + 1}
    else {$liveessions = $livesessions++}
}
Write-Host "The number of active citrix sessions is" $livesessions -fore red
Write-Host "The numbrer of disconnected citrix sessions is" $disconnected -fore red
Write-Host " "

# Displays a list of published apps and the number of users on each
Write-Host "Total users on top 20 citrix applications" -fore yellow
$sessionAry | group AppName | sort Count -desc | select Count,name -first 20 | ft -auto
Write-Host " "

# List of citrix servers and total number of sessions on each one
write-host "Total sessions on each citrix server" -fore yellow
$sessionAry | group ServerName | sort name | select Count,Name | ft -auto
write-host " "

# To see which users have more than one session open
write-host "First 20 Users with more than one citrix session" -fore yellow
$sessionAry | group UserName | Sort Count -desc | select Count,Name -first 20 | ft -auto

Now the script runs 3 times as fast.

This post is part of a 6 part series. Jump to [part 2][part 3][part 4][part 5][part 6]

Value for Value

If you received any value from reading this post, please help by becoming a supporter.

Thanks for reading,
Alain