PS> Get a List of Citrix Delivery Groups then show the member VDA uptime statistics
About
In a typical deployment scenario, the following script can be remotely invoked or ran directly on a Citrix DDC, where the PowerShell snap-ins are installed.
Tip: You can install the same PowerShell snap-ins on an administrative jumpbox. The Windows Installer packages can be found in the Citrix ISO's \x64 folder.
Sample Output
![]() |
Single Delivery Group selected |
![]() |
All Delivery Groups selected |
Script: Get-VDAUptime
Add-PSSnapin citrix* $RebootOldAvailableVDAs = $false $DGList = @() $Item = 0 Function Prompt-Reboot { Write-Host "Do you wish to reboot 'Available' systems with more than 24hr uptimes?" -ForegroundColor Yellow -NoNewline $RebootPrompt = Read-Host " [y/n] (n)" if ($RebootPrompt -eq "y") {$script:RebootOldAvailableVDAs = $true} } Function Show-n-Bounce-VDA { param([int]$DGNumber = 0) # Measure elapsed time of the function $FunctionStartDTM = Get-Date # Get a collection of machines from the delivery group $DeliveryGroup = $DGList[$DGNumber] "== Delivery Group: " + $DeliveryGroup + " ==" $Machines = Get-BrokerMachine -DesktopGroupName $DGList[$DGNumber] $LastBootTime = "" # Get the uptime for each machine enumerated foreach ($MachineID in $Machines) { # Determine if the VDA is in maintenance mode if ($MachineID.InMaintenanceMode -eq "True") { $MaintStatus = "[MAINT]" $StatusColor = "Yellow" } else { $MaintStatus = "" $StatusColor = "White" } if ($MachineID.HostedMachineName) { if ($MachineID.PowerState -ne "Off") { $Server = Get-WmiObject -Class Win32_OperatingSystem -cn $MachineID.HostedMachineName -ErrorAction SilentlyContinue if ($Server.LastBootUpTime -eq $null){ Write-Host ($MachineID.HostedMachineName + "`t[N/A]`t`t" + $MaintStatus) -ForegroundColor Magenta } else { $LastBootTime = $Server.ConvertToDateTime($Server.LastBootUpTime) if ($LastBootTime -ne "") { $UpTime = $Now.Subtract($LastBootTime) $DurationHr = [int]([math]::Round($UpTime.TotalHours)) #Set Status color if uptime is > 24h if ($DurationHr -ge 24) {$StatusColor = "Yellow"} Else {$StatusColor = "White"} $Duration = "{0:d2}:{1:d2}:{2:d2}" -f ($DurationHr), $UpTime.Minutes, $UpTime.Seconds Write-Host ($MachineID.HostedMachineName.PadRight(15) + "`t" ) -ForeGroundColor $StatusColor -NoNewLine Write-Host ($MachineID.SummaryState.ToString().PadRight(13) + "`t") -ForeGroundColor $StatusColor -NoNewLine Write-Host ($Duration + "`t") -ForeGroundColor $StatusColor -NoNewLine Write-Host ("[" + $MachineID.SessionCount + "] `t") -ForeGroundColor $StatusColor -NoNewLine Write-Host ($MaintStatus.PadRight(7)) -ForeGroundColor $StatusColor # Reboot computer as requested if (($RebootOldAvailableVDAs -eq $True) -and ($DurationHr -ge 24) -and ($MachineID.SummaryState -eq "Available")){ Write-Host "Restarting " ($MachineID.HostedMachineName) "..." -ForegroundColor Cyan Restart-Computer $MachineID.HostedMachineName } } } } else { Write-Host ($MachineID.HostedMachineName + "`t[Off]`t`t" + $MaintStatus) -ForegroundColor Yellow } } else { Write-Host "No Machines defined in the Delivery Group" -ForegroundColor Yellow } } # Display the total elapsed time of processing the Delivery Group $ElapsedFunctionDTM = ((Get-Date) - $FunctionStartDTM).ToString("hh\:mm\:ss") Write-Host ("Delivery Group Elapsed time: " + $ElapsedFunctionDTM) # Display Total Sessions in the Delivery Group $TotalSessions = (Get-BrokerDesktopGroup -Name $DGList[$DGNumber]).Sessions Write-Host "Total Sessions: `t$TotalSessions" -ForegroundColor Magenta Write-Host "`n" } ######## START SCRIPT ######## # Get reference time $Now = Get-Date # Get the list of delivery groups $DeliveryGroups = Get-BrokerDesktopGroup # List the Delivery Groups for user selection foreach ($DG in $DeliveryGroups) { if ($DG.InMaintenanceMode -eq $True) { Write-Host ("`t" + ($Item++).ToString() + "`t" + $DG.Name + " [MAINT]") -ForegroundColor DarkGray } else { Write-Host ("`t" + ($Item++).ToString() + "`t" + $DG.Name) -ForegroundColor White } $DGList += $DG.Name } # Prompt the user for the Delivery Group # (or [a]ll) Write-Host "Please enter the number corresponding to the Delivery Group" -ForegroundColor Yellow -NoNewline $DGNumber = Read-Host " ([a] for all)" # Measure elapsed time of the script (after the last prompt) $ScriptStartDTM = Get-Date if ($DGNumber -match "a") { Prompt-Reboot # Prompt user for reboots # Walk through each DG $Script:Item = 0 foreach ($DG in $DeliveryGroups) { # Show Delivery Group and their machines; reboot/skip if applicable Show-n-Bounce-VDA -DGNumber $Script:Item $Script:Item++ } } elseif (([int]$DGNumber -ge 0) -and ([int]$DGNumber -le $DGList.GetUpperBound(0))) { Prompt-Reboot # Prompt user for reboots # Show Delivery Group and their machines; reboot/skip if applicable Show-n-Bounce-VDA -DGNumber $DGNumber } else { Write-Host "Invalid Number. Please try again. ($DGNumber)" } # Display the total elapsed time of processing the Delivery Group $ElapsedScriptDTM = ($(Get-Date) - $ScriptStartDTM).ToString("hh\:mm\:ss") Write-Host ("Total Elapsed time: " + $ElapsedScriptDTM) -ForegroundColor Green
Updates
Initial Release: Dec 03, 2019Dec 30, 2019:
- Changed output color for uptimes of 24hrs and up
Jan 02, 2020:
- Added the Availability of the VDAs
Feb 19, 2020:
- Added option to reboot Available VDAs with uptimes of 24hrs and up
- Added Total Sessions at the end of the list
- Added all Delivery Groups as an option
- Display the elapsed time to process the selected Delivery Group(s).
This is great. Thank you. Any chance of modifying it so it can be emailed rather than displayed on the console?
ReplyDelete