XATools.psm1 is a work in progress. Most of the functions are still being developed. Please use at your own risk.
Start-XASessionCounter
Get-XASessionCount
Measure-XAZoneLatency
Test-XAActiveICASession
Test-XALatencyValue
New-XAPublishDesktop
XATools.psm1
Function Get-XASessionCount()
{
BEGIN
{
#Uses Citrix MCLI Powershell snapin
Add-PSSnapin Citrix* -ErrorAction SilentlyContinue
}
PROCESS
{
$dateTime = Get-Date
$sessions = Get-XaSession
Clear-Host
$active = ($sessions | ? {$_.State -eq "Active" -and $_.Protocol -eq "Ica"}).Count
$disconnected = ($sessions | ? {$_.State -eq "Disconnected" -and $_.Protocol -eq "Ica"}).Count
$total = ($sessions | ? {$_.Protocol -eq "Ica"}).Count
if($active -gt $global:peakActiveSessions)
{
$global:peakActiveSessions = $active
$global:peakASTime = $dateTime.ToString()
}
if($disconnected -gt $global:peakDisconnectedSessions)
{
$global:peakDisconnectedSessions = $disconnected
$global:peakDSTime = $dateTime.ToString()
}
if($total -gt $global:peakTotalSessions)
{
$global:peakTotalSessions = $total
$global:peakTSTime = $dateTime.ToString()
}
Write-Host $dateTime
Write-Host "`nActive Sessions: $active"
Write-Host "Disconnected Sessions: $disconnected"
Write-Host "Total Sessions: $total"
}
}
Function Measure-XAZoneLatency()
{
param
(
[Parameter(Mandatory=$true,
ValueFromPipeline=$true)]
[string]$zoneName=""
)
BEGIN
{
}
PROCESS
{
foreach($zone in $zoneName)
{
$XASessions = Get-XAServer -ZoneName $zone -OnlineOnly | Get-XASession
$XASessionCounters = $XASessions | Where-Object {(Test-XAActiveICASession -XASession $_)} | Get-XASessionCounter -ErrorAction SilentlyContinue
$XASessionCounters = $XASessionCounters | Where-Object {(Test-XALatencyValue -Value $_.AverageLatency)}
$XASessionCounters = $XASessionCounters | Where-Object {(Test-XALatencyValue -Value $_.LastLatency)}
$XASessionCounters = $XASessionCounters | Where-Object {(Test-XALatencyValue -Value $_.LatencyDeviation)}
$AverageLatency = $XASessionCounters | Measure-Object -Property AverageLatency -ave -max -min
$LastLatency = $XASessionCounters | Measure-Object -Property LastLatency -ave -max -min
$LatencyDeviation = $XASessionCounters | Measure-Object -Property LatencyDeviation -ave -max -min
$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name ZoneName -Value $zone
$obj | Add-Member -MemberType NoteProperty -Name AverageLatency -Value ("{0:N2}" -f $AverageLatency.Average)
$obj | Add-Member -MemberType NoteProperty -Name MinAverageLatency -Value ("{0:N2}" -f $AverageLatency.Minimum)
$obj | Add-Member -MemberType NoteProperty -Name MaxAverageLatency -Value ("{0:N2}" -f $AverageLatency.Maximum)
$obj | Add-Member -MemberType NoteProperty -Name AvgLastLatency -Value ("{0:N2}" -f $LastLatency.Average)
$obj | Add-Member -MemberType NoteProperty -Name MinLastLatency -Value ("{0:N2}" -f $LastLatency.Minimum)
$obj | Add-Member -MemberType NoteProperty -Name MaxLastLatency -Value ("{0:N2}" -f $LastLatency.Maximum)
$obj | Add-Member -MemberType NoteProperty -Name AvgLatencyDeviation -Value ("{0:N2}" -f $LatencyDeviation.Average)
$obj | Add-Member -MemberType NoteProperty -Name MinLatencyDeviation -Value ("{0:N2}" -f $LatencyDeviation.Minimum)
$obj | Add-Member -MemberType NoteProperty -Name MaxLatencyDeviation -Value ("{0:N2}" -f $LatencyDeviation.Maximum)
$obj
}
}
}
Function Start-XASessionCounter()
{
param
(
[Parameter(Mandatory=$false)]
[int]$UpdateInterval=30,
[Parameter(Mandatory=$false)]
[boolean]$showPeak=$true
)
BEGIN
{
#Uses Citrix MCLI Powershell snapin
Add-PSSnapin Citrix* -ErrorAction SilentlyContinue
$global:peakActiveSessions = 0
$global:peakASTime = ""
$global:peakDisconnectedSessions = 0
$global:peakDSTime = ""
$global:peakTotalSessions = 0
$global:peakTSTime = ""
}
PROCESS
{
while($true)
{
Get-XASessionCount
if($showPeak)
{
Write-Host "`nPeak Active Sessions: $global:peakActiveSessions @ $global:peakASTime"
Write-Host "Peak Disconnected Sessions: $global:peakDisconnectedSessions @ $global:peakDSTime"
Write-Host "Peak Total Sessions: $global:peakTotalSessions @ $global:peakTSTime"
}
Start-Sleep -seconds $UpdateInterval
}
}
}
Function Test-XAActiveICASession()
{
param
(
[Parameter(Mandatory=$true,
ValueFromPipeLine=$true)]
$XASession
)
BEGIN
{
}
PROCESS
{
[boolean]$result = $true
if($XASession.State -ne "Active")
{
$result = $false
}
if(-not $XASession.SessionName.StartsWith("ICA"))
{
$result = $false
}
if($XASession.Protocol -ne "Ica")
{
$result = $false
}
return $result
}
}
Function Test-XALatencyValue()
{
param
(
[Parameter(Mandatory=$true)]
[long]$Value
)
BEGIN
{
$badValues = @(4294967295)
}
PROCESS
{
[int]$minValue = 0
[boolean]$result = $true
foreach($badValue in $badValues)
{
if($Value -eq $badValue)
{
$result = $false
}
}
if($Value -lt $minValue)
{
$result = $false
}
return $result
}
}
Function New-XAPublishDesktop()
{
param
(
[Parameter(ValueFromPipeline=$true)]
[string]$ServerName,
[Parameter(Mandatory=$true)]
[string]$TemplateName
)
BEGIN
{
Add-PSSnapin Citrix* -ErrorAction SilentlyContinue
}
PROCESS
{
foreach($Server in $ServerName)
{
$app = Copy-XAApplication -BrowserName $TemplateName
$app = Add-XAApplicationServer -InputObject $app -ServerNames $Server
$NewDisplayName = $Server.ToUpper()+" Desktop"
$app = Rename-XAApplication -BrowserName ($app).BrowserName -NewDisplayName $NewDisplayName
$app
}
}
}
Comments