I have found very easy PS command to view users shared mailbox in case they have forgotten there shared mailbox name. Run PS cmdlt using runas admin and use the following cmdlt
Get-MailboxStatistics -Database “Mailbox Database Name”
it will automatically exports to csv file and reference MS article
Let me know if this is useful
It is now official, as Citrix announced the changes during Synergy 2018. The message is clear, Citrix IS the brand! Read more to learn if your favorite brand made it through.
The new branding incorporates two meaningful categorization groups, Workspace and Networking, and Citrix has assigned its products to these categories. The Workspace portfolio comprises:
Old name | New name |
Cedexis | Citrix Intelligent Traffic Management |
Citrix Provisioning Service | Citrix Provisioning |
Citrix Receiver | Citrix Workspace App |
Citrix Workspace Service | Citrix Workspace |
Citrix Workspace Suite | Citrix Workspace |
Citrix XenApp | Citrix Virtual Apps |
Citrix XenApp and XenDesktop | Citrix Virtual Apps and Desktops |
Citrix XenApp and XenDesktop Service | Citrix Virtual Apps and Desktops |
Citrix XenDesktop | Citrix Virtual Desktops |
Citrix XenMobile | Citrix Endpoint Management |
ShareFile | Citrix Content Collaboration |
StoreFront | StoreFront (on-prem only) |
XenServer | Citrix Hypervisor |
And the Networking portfolio comprises
Old name | Name |
NetScaler ADC | Citrix ADC |
NetScaler AppFirewall | Citrix Web App Firewall |
NetScaler Access Gateway | Citrix Gateway |
NetScaler Management and Analytics System | Citrix Application Delivery Management |
NetScaler SD-WAN | Citrix SD-WAN |
NetScaler Secure Web Gateway | Citrix Secure Web Gateway |
NetScaler Unified Gateway | Citrix Gateway |
NetScaler Web App Security | Citrix Web App Firewall |
Source: https://www.citrix.com/support/citrix-product-guide.html
Citrix Cloud
Citrix cloud connector needs TCP 443 opened for all outbound communications to the Citrix Managed Control plane. Additionally the Host management and Machine Creation Management capabilities of Citrix cloud also require TCP 9350-9354 opened for communications to the Citrix Managed control plane.
Following is the Citrix Cloud communication ports required to be open on Hybrid environment
Source | Description | Destination | Port |
CC-01 | Connecotrs | 192.10.10.18 | 443 |
CC-02 | 192.10.10.19 | 443 | |
Xapp-01 | Application | 192.10.10.22 | 443,1494,2598,80 |
XD-01 | VDI | 192.10.10.25 | 443,1494,2598,80 |
CC-01 | Connectors | Internet | DP 123/UDP W32Time TCP 135/TCP RPC EndpointMapper TCP 464/TCP/UDP Kerberos password change TCP 49152-65535/TCP RPC for LSA, SAM, Netlogon (*) TCP/UDP 389/TCP/UDP LDAP TCP 636/TCP LDAP SSL |
CC-01 | Connectors | Actvie Directory | TCP 3268/TCP LDAP GC TCP 3269/TCP LDAP GC SSL TCP/UDP 53/TCP/UDP DNS TCP 49152 -65535/TCP FRS RPC (*) TCP/UDP 88/TCP/UDP Kerberos TCP/UDP 445/TCP SMB |
TCP 3269/TCP LDAP GC SSL | |||
TCP/UDP 53/TCP/UDP DNS | |||
TCP 49152 -65535/TCP FRS RPC (*) | |||
TCP/UDP 88/TCP/UDP Kerberos | |||
TCP/UDP 445/TCP SM | |||
CC-Web1 | Cloud Connector | TCP 80/443 (encrypt with certificates) | |
Net-DC | Connectors | Cloud Connector | TCP 80/443 (encrypt with certificates) |
CC-01 | Cloud Connector | TCP 80 Traffic encrypted using Kerberos | |
CC-01 | Connectors | VDA XenApp/Xendesktop | TCP 80 Traffic encrypted using Kerberos |
Please check a beow link for xenapp and xendesktop health check and you can download the ps script
https://github.com/sacha81/XA-and-XD-HealthCheck
copy past in notepad and save as XA-and -XD-Healthcheck.ps1
save#==============================================================================================
2 # Created on: 11.2014 Version: 1.1.0
3 # Created by: Sacha / sachathomet.ch & Contributers (see changelog)
4 # File name: XA-and-XD-HealthCheck.ps1
5 #
6 # Description: This script checks a Citrix XenDesktop and/or XenApp 7.x Farm
7 # It generates a HTML output File which will be sent as Email.
8 #
9 # Initial versions tested on XenApp/XenDesktop 7.6-7.11 and XenDesktop 5.6
10 # Newest version tested on XenApp/XenDesktop 7.9-7.11
11 #
12 # Prerequisite: Config file, a XenDesktop Controller with according privileges necessary
13 # Config file: In order for the script to work properly, it needs a configuration file.
14 # This has the same name as the script, with extension _Parameters.
15 # The script name can’t contain any another point, even with a version.
16 # Example: Script = “XA and XD HealthCheck.ps1”, Config = “XA and XD HealthCheck_Parameters.xml”
17 #
18 # Call by : Manual or by Scheduled Task, e.g. once a day
19 # Code History at the end of the file
20 #==============================================================================================
21 # Load only the snap-ins, which are used
22 if ((Get-PSSnapin “Citrix.Broker.Admin.*” -EA silentlycontinue) -eq $null) {
23 try { Add-PSSnapin Citrix.Broker.Admin.* -ErrorAction Stop }
24 catch { write-error “Error Get-PSSnapin Citrix.Broker.Admin.* Powershell snapin”; Return }
25 }
26 # Change the below variables to suit your environment
27 #==============================================================================================
28
29 # Import Variables from XML:
30
31 If (![string]::IsNullOrEmpty($hostinvocation)) {
32 [string]$Global:ScriptPath = [System.IO.Path]::GetDirectoryName([System.Windows.Forms.Application]::ExecutablePath)
33 [string]$Global:ScriptFile = [System.IO.Path]::GetFileName([System.Windows.Forms.Application]::ExecutablePath)
34 [string]$global:ScriptName = [System.IO.Path]::GetFileNameWithoutExtension([System.Windows.Forms.Application]::ExecutablePath)
35 } ElseIf ($Host.Version.Major -lt 3) {
36 [string]$Global:ScriptPath = Split-Path -parent $MyInvocation.MyCommand.Definition
37 [string]$Global:ScriptFile = Split-Path -Leaf $script:MyInvocation.MyCommand.Path
38 [string]$global:ScriptName = $ScriptFile.Split(‘.’)[0].Trim()
39 } Else {
40 [string]$Global:ScriptPath = $PSScriptRoot
41 [string]$Global:ScriptFile = Split-Path -Leaf $PSCommandPath
42 [string]$global:ScriptName = $ScriptFile.Split(‘.’)[0].Trim()
43 }
44
45 Set-StrictMode -Version Latest
46
47 # Import parameter file
48 $Global:ParameterFile = $ScriptName + “_Parameters.xml”
49 $Global:ParameterFilePath = $ScriptPath
50 [xml]$cfg = Get-Content ($ParameterFilePath + “\” + $ParameterFile) # Read content of XML file
51
52 # Import variables
53 Function New-XMLVariables {
54 # Create a variable reference to the XML file
55 $cfg.Settings.Variables.Variable | foreach {
56 # Set Variables contained in XML file
57 $VarValue = $_.Value
58 $CreateVariable = $True # Default value to create XML content as Variable
59 switch ($_.Type) {
60 # Format data types for each variable
61 ‘[string]’ { $VarValue = [string]$VarValue } # Fixed-length string of Unicode characters
62 ‘[char]’ { $VarValue = [char]$VarValue } # A Unicode 16-bit character
63 ‘[byte]’ { $VarValue = [byte]$VarValue } # An 8-bit unsigned character
64 ‘[bool]’ { If ($VarValue.ToLower() -eq ‘false’){$VarValue = [bool]$False} ElseIf ($VarValue.ToLower() -eq ‘true’){$VarValue = [bool]$True} } # An boolean True/False value
65 ‘[int]’ { $VarValue = [int]$VarValue } # 32-bit signed integer
66 ‘[long]’ { $VarValue = [long]$VarValue } # 64-bit signed integer
67 ‘[decimal]’ { $VarValue = [decimal]$VarValue } # A 128-bit decimal value
68 ‘[single]’ { $VarValue = [single]$VarValue } # Single-precision 32-bit floating point number
69 ‘[double]’ { $VarValue = [double]$VarValue } # Double-precision 64-bit floating point number
70 ‘[DateTime]’ { $VarValue = [DateTime]$VarValue } # Date and Time
71 ‘[Array]’ { $VarValue = [Array]$VarValue.Split(‘,’) } # Array
72 ‘[Command]’ { $VarValue = Invoke-Expression $VarValue; $CreateVariable = $False } # Command
73 }
74 If ($CreateVariable) { New-Variable -Name $_.Name -Value $VarValue -Scope $_.Scope -Force }
75 }
76 }
77
78 New-XMLVariables
79
80
81 $PvsWriteMaxSize = $PvsWriteMaxSize * 1Gb
82
83 ForEach ($DeliveryController in $DeliveryControllers){
84 If ($DeliveryController -ieq “LocalHost”){
85 $DeliveryController = [System.Net.DNS]::GetHostByName(”).HostName
86 }
87 If (Test-Connection $DeliveryController) {
88 $AdminAddress = $DeliveryController
89 break
90 }
91 }
92
93 $ReportDate = (Get-Date -UFormat “%A, %d. %B %Y %R”)
94
95
96 $currentDir = Split-Path $MyInvocation.MyCommand.Path
97 $logfile = Join-Path $currentDir (“CTXXDHealthCheck.log”)
98 $resultsHTM = Join-Path $currentDir (“CTXXDHealthCheck.htm”)
99
100 #Header for Table “XD/XA Controllers” Get-BrokerController
101 $XDControllerFirstheaderName = “ControllerServer”
102 $XDControllerHeaderNames = “Ping”, “State”,”DesktopsRegistered”, “ActiveSiteServices”, “CFreespace”, “DFreespace”, “AvgCPU”, “MemUsg”, “Uptime”
103 $XDControllerHeaderWidths = “2”, “2”, “2”, “10”, “4”, “4”, “4”, “4”, “4”
104 $XDControllerTableWidth= 1200
105
106 #Header for Table “MachineCatalogs” Get-BrokerCatalog
107 $CatalogHeaderName = “CatalogName”
108 $CatalogHeaderNames = “AssignedToUser”, “AssignedToDG”, “NotToUserAssigned”,”ProvisioningType”, “AllocationType”
109 $CatalogWidths = “4”, “8”, “8”, “8”, “8”
110 $CatalogTablewidth = 900
111
112 #Header for Table “DeliveryGroups” Get-BrokerDesktopGroup
113 $AssigmentFirstheaderName = “DeliveryGroup”
114 $vAssigmentHeaderNames = “PublishedName”,”DesktopKind”, “TotalDesktops”,”DesktopsAvailable”,”DesktopsUnregistered”, “DesktopsInUse”,”DesktopsFree”, “MaintenanceMode”
115 $vAssigmentHeaderWidths = “4”, “4”, “4”, “4”, “4”, “4”, “4”, “2”
116 $Assigmenttablewidth = 900
117
118 #Header for Table “VDI Checks” Get-BrokerMachine
119 $VDIfirstheaderName = “Desktop-Name”
120
121 $VDIHeaderNames = “CatalogName”,”PowerState”, “Ping”, “MaintenanceMode”, “Uptime”, “RegistrationState”,”AssociatedUserNames”, “VDAVersion”, “WriteCacheType”, “WriteCacheSize”, “HostedOn”
122 $VDIHeaderWidths = “4”, “4”,”4″, “4”, “4”, “4”, “4”, “4”, “4”, “4”, “4”
123
124 $VDItablewidth = 1200
125
126 #Header for Table “XenApp Checks” Get-BrokerMachine
127 $XenAppfirstheaderName = “XenApp-Server”
128 if ($ShowConnectedXenAppUsers -eq “1”) {
129
130 $XenAppHeaderNames = “CatalogName”, “DesktopGroupName”, “Serverload”, “Ping”, “MaintMode”,”Uptime”, “RegState”, “Spooler”, “CitrixPrint”, “CFreespace”, “DFreespace”, “AvgCPU”, “MemUsg”, “ActiveSessions”, “VDAVersion”, “WriteCacheType”, “WriteCacheSize”, “ConnectedUsers” , “HostedOn”
131 $XenAppHeaderWidths = “4”, “4”, “4”, “4”, “4”, “4”, “4”, “6”, “4”, “4”, “4”, “4”, “4”, “4”, “4”, “4”, “4”, “4”, “4”
132 }
133 else {
134 $XenAppHeaderNames = “CatalogName”, “DesktopGroupName”, “Serverload”, “Ping”, “MaintMode”,”Uptime”, “RegState”, “Spooler”, “CitrixPrint”, “CFreespace”, “DFreespace”, “AvgCPU”, “MemUsg”, “ActiveSessions”, “VDAVersion”, “WriteCacheType”, “WriteCacheSize”, “HostedOn”
135 $XenAppHeaderWidths = “4”, “4”, “4”, “4”, “4”, “4”, “4”, “6”, “4”, “4”, “4”, “4”, “4”, “4”, “4”, “4”, “4”, “4”
136
137 }
138
139 $XenApptablewidth = 1200
140
141 #==============================================================================================
142 #log function
143 function LogMe() {
144 Param(
145 [parameter(Mandatory = $true, ValueFromPipeline = $true)] $logEntry,
146 [switch]$display,
147 [switch]$error,
148 [switch]$warning,
149 [switch]$progress
150 )
151
152 if ($error) { $logEntry = “[ERROR] $logEntry” ; Write-Host “$logEntry” -Foregroundcolor Red }
153 elseif ($warning) { Write-Warning “$logEntry” ; $logEntry = “[WARNING] $logEntry” }
154 elseif ($progress) { Write-Host “$logEntry” -Foregroundcolor Green }
155 elseif ($display) { Write-Host “$logEntry” }
156
157 #$logEntry = ((Get-Date -uformat “%D %T”) + ” – ” + $logEntry)
158 $logEntry | Out-File $logFile -Append
159 }
160
161 #==============================================================================================
162 function Ping([string]$hostname, [int]$timeout = 200) {
163 $ping = new-object System.Net.NetworkInformation.Ping #creates a ping object
164 try { $result = $ping.send($hostname, $timeout).Status.ToString() }
165 catch { $result = “Failure” }
166 return $result
167 }
168 #==============================================================================================
169 # The function will check the processor counter and check for the CPU usage. Takes an average CPU usage for 5 seconds. It check the current CPU usage for 5 secs.
170 Function CheckCpuUsage()
171 {
172 param ($hostname)
173 Try { $CpuUsage=(get-counter -ComputerName $hostname -Counter “\Processor(_Total)\% Processor Time” -SampleInterval 1 -MaxSamples 5 -ErrorAction Stop | select -ExpandProperty countersamples | select -ExpandProperty cookedvalue | Measure-Object -Average).average
174 $CpuUsage = [math]::round($CpuUsage, 1); return $CpuUsage
175 } Catch { “Error returned while checking the CPU usage. Perfmon Counters may be fault” | LogMe -error; return 101 }
176 }
177 #==============================================================================================
178 # The function check the memory usage and report the usage value in percentage
179 Function CheckMemoryUsage()
180 {
181 param ($hostname)
182 Try
183 { $SystemInfo = (Get-WmiObject -computername $hostname -Class Win32_OperatingSystem -ErrorAction Stop | Select-Object TotalVisibleMemorySize, FreePhysicalMemory)
184 $TotalRAM = $SystemInfo.TotalVisibleMemorySize/1MB
185 $FreeRAM = $SystemInfo.FreePhysicalMemory/1MB
186 $UsedRAM = $TotalRAM – $FreeRAM
187 $RAMPercentUsed = ($UsedRAM / $TotalRAM) * 100
188 $RAMPercentUsed = [math]::round($RAMPercentUsed, 2);
189 return $RAMPercentUsed
190 } Catch { “Error returned while checking the Memory usage. Perfmon Counters may be fault” | LogMe -error; return 101 }
191 }
192 #==============================================================================================
193
194 # The function check the HardDrive usage and report the usage value in percentage and free space
195 Function CheckHardDiskUsage()
196 {
197 param ($hostname, $deviceID)
198 Try
199 {
200 $HardDisk = $null
201 $HardDisk = Get-WmiObject Win32_LogicalDisk -ComputerName $hostname -Filter “DeviceID=’$deviceID'” -ErrorAction Stop | Select-Object Size,FreeSpace
202 if ($HardDisk -ne $null)
203 {
204 $DiskTotalSize = $HardDisk.Size
205 $DiskFreeSpace = $HardDisk.FreeSpace
206 $frSpace=[Math]::Round(($DiskFreeSpace/1073741824),2)
207 $PercentageDS = (($DiskFreeSpace / $DiskTotalSize ) * 100); $PercentageDS = [math]::round($PercentageDS, 2)
208
209 Add-Member -InputObject $HardDisk -MemberType NoteProperty -Name PercentageDS -Value $PercentageDS
210 Add-Member -InputObject $HardDisk -MemberType NoteProperty -Name frSpace -Value $frSpace
211 }
212
213 return $HardDisk
214 } Catch { “Error returned while checking the Hard Disk usage. Perfmon Counters may be fault” | LogMe -error; return $null }
215 }
216
217 #==============================================================================================
218 Function writeHtmlHeader
219 {
220 param($title, $fileName)
221 $date = $ReportDate
222 $head = @”
223 <html>
224 <head>
225 <meta http-equiv=’Content-Type’ content=’text/html; charset=iso-8859-1′>
226 <title>$title</title>
227 <STYLE TYPE=”text/css”>
228 <!–
229 td {
230 font-family: Tahoma;
231 font-size: 11px;
232 border-top: 1px solid #999999;
233 border-right: 1px solid #999999;
234 border-bottom: 1px solid #999999;
235 border-left: 1px solid #999999;
236 padding-top: 0px;
237 padding-right: 0px;
238 padding-bottom: 0px;
239 padding-left: 0px;
240 overflow: hidden;
241 }
242 body {
243 margin-left: 5px;
244 margin-top: 5px;
245 margin-right: 0px;
246 margin-bottom: 10px;
247 table {
248 table-layout:fixed;
249 border: thin solid #000000;
250 }
251 –>
252 </style>
253 </head>
254 <body>
255 <table width=’1200′>
256 <tr bgcolor=’#CCCCCC’>
257 <td colspan=’7′ height=’48’ align=’center’ valign=”middle”>
258 <font face=’tahoma’ color=’#003399′ size=’4′>
259 <strong>$title – $date</strong></font>
260 </td>
261 </tr>
262 </table>
263 “@
264 $head | Out-File $fileName
265 }
266
267 # ==============================================================================================
268 Function writeTableHeader
269 {
270 param($fileName, $firstheaderName, $headerNames, $headerWidths, $tablewidth)
271 $tableHeader = @”
272
273 <table width=’$tablewidth’><tbody>
274 <tr bgcolor=#CCCCCC>
275 <td width=’6%’ align=’center’><strong>$firstheaderName</strong></td>
276 “@
277
278 $i = 0
279 while ($i -lt $headerNames.count) {
280 $headerName = $headerNames[$i]
281 $headerWidth = $headerWidths[$i]
282 $tableHeader += “<td width='” + $headerWidth + “%’ align=’center’><strong>$headerName</strong></td>”
283 $i++
284 }
285
286 $tableHeader += “</tr>”
287
288 $tableHeader | Out-File $fileName -append
289 }
290
291 # ==============================================================================================
292 Function writeTableFooter
293 {
294 param($fileName)
295 “</table><br/>”| Out-File $fileName -append
296 }
297
298 #==============================================================================================
299 Function writeData
300 {
301 param($data, $fileName, $headerNames)
302
303 $tableEntry =””
304 $data.Keys | sort | foreach {
305 $tableEntry += “<tr>”
306 $computerName = $_
307 $tableEntry += (“<td bgcolor=’#CCCCCC’ align=center><font color=’#003399′>$computerName</font></td>”)
308 #$data.$_.Keys | foreach {
309 $headerNames | foreach {
310 #”$computerName : $_” | LogMe -display
311 try {
312 if ($data.$computerName.$_[0] -eq “SUCCESS”) { $bgcolor = “#387C44”; $fontColor = “#FFFFFF” }
313 elseif ($data.$computerName.$_[0] -eq “WARNING”) { $bgcolor = “#FF7700”; $fontColor = “#FFFFFF” }
314 elseif ($data.$computerName.$_[0] -eq “ERROR”) { $bgcolor = “#FF0000”; $fontColor = “#FFFFFF” }
315 else { $bgcolor = “#CCCCCC”; $fontColor = “#003399” }
316 $testResult = $data.$computerName.$_[1]
317 }
318 catch {
319 $bgcolor = “#CCCCCC”; $fontColor = “#003399”
320 $testResult = “”
321 }
322 $tableEntry += (“<td bgcolor='” + $bgcolor + “‘ align=center><font color='” + $fontColor + “‘>$testResult</font></td>”)
323 }
324 $tableEntry += “</tr>”
325 }
326 $tableEntry | Out-File $fileName -append
327 }
328
329 # ==============================================================================================
330 Function writeHtmlFooter
331 {
332 param($fileName)
333 @”
334 </table>
335 <table width=’1200′>
336 <tr bgcolor=’#CCCCCC’>
337 <td colspan=’7′ height=’25’ align=’left’>
338 <font face=’courier’ color=’#000000′ size=’2′><strong>Uptime Threshold =</strong></font><font color=’#003399′ face=’courier’ size=’2′> $maxUpTimeDays days</font>
339 </td>
340 </table>
341 </body>
342 </html>
343 “@ | Out-File $FileName -append
344 }
345
346 # ==============================================================================================
347 Function ToHumanReadable()
348 {
349 param($timespan)
350
351 If ($timespan.TotalHours -lt 1) {
352 return $timespan.Minutes + “minutes”
353 }
354
355 $sb = New-Object System.Text.StringBuilder
356 If ($timespan.Days -gt 0) {
357 [void]$sb.Append($timespan.Days)
358 [void]$sb.Append(” days”)
359 [void]$sb.Append(“, “)
360 }
361 If ($timespan.Hours -gt 0) {
362 [void]$sb.Append($timespan.Hours)
363 [void]$sb.Append(” hours”)
364 }
365 If ($timespan.Minutes -gt 0) {
366 [void]$sb.Append(” and “)
367 [void]$sb.Append($timespan.Minutes)
368 [void]$sb.Append(” minutes”)
369 }
370 return $sb.ToString()
371 }
372
373 # ==============================================================================================
374
375 $wmiOSBlock = {param($computer)
376 try { $wmi=Get-WmiObject -class Win32_OperatingSystem -computer $computer }
377 catch { $wmi = $null }
378 return $wmi
379 }
380
381 #==============================================================================================
382 # == MAIN SCRIPT ==
383 #==============================================================================================
384 rm $logfile -force -EA SilentlyContinue
385 rm $resultsHTM -force -EA SilentlyContinue
386
387 “#### Begin with Citrix XenDestop / XenApp HealthCheck ######################################################################” | LogMe -display -progress
388
389 ” ” | LogMe -display -progress
390
391 # Log the loaded Citrix PS Snapins
392 (Get-PSSnapin “Citrix.*” -EA silentlycontinue).Name | ForEach {“PSSnapIn: ” + $_ | LogMe -display -progress}
393
394 #== Controller Check ============================================================================================
395 “Check Controllers #############################################################################” | LogMe -display -progress
396
397 ” ” | LogMe -display -progress
398
399 $ControllerResults = @{}
400 $Controllers = Get-BrokerController -AdminAddress $AdminAddress
401
402 # Get first DDC version (should be all the same unless an upgrade is in progress)
403 $ControllerVersion = $Controllers[0].ControllerVersion
404 “Version: $controllerversion ” | LogMe -display -progress
405
406 if ($ControllerVersion -lt 7 ) {
407 “XenDesktop/XenApp Version below 7.x ($controllerversion) – only DesktopCheck will be performed” | LogMe -display -progress
408 $ShowXenAppTable = 0
409 } else {
410 “XenDesktop/XenApp Version above 7.x ($controllerversion) – XenApp and DesktopCheck will be performed” | LogMe -display -progress
411 }
412
413 foreach ($Controller in $Controllers) {
414 $tests = @{}
415
416 #Name of $Controller
417 $ControllerDNS = $Controller | %{ $_.DNSName }
418 “Controller: $ControllerDNS” | LogMe -display -progress
419
420 #Ping $Controller
421 $result = Ping $ControllerDNS 100
422 if ($result -ne “SUCCESS”) { $tests.Ping = “Error”, $result }
423 else { $tests.Ping = “SUCCESS”, $result
424
425 #Now when Ping is ok also check this:
426
427 #State of this controller
428 $ControllerState = $Controller | %{ $_.State }
429 “State: $ControllerState” | LogMe -display -progress
430 if ($ControllerState -ne “Active”) { $tests.State = “ERROR”, $ControllerState }
431 else { $tests.State = “SUCCESS”, $ControllerState }
432
433 #DesktopsRegistered on this controller
434 $ControllerDesktopsRegistered = $Controller | %{ $_.DesktopsRegistered }
435 “Registered: $ControllerDesktopsRegistered” | LogMe -display -progress
436 $tests.DesktopsRegistered = “NEUTRAL”, $ControllerDesktopsRegistered
437
438 #ActiveSiteServices on this controller
439 $ActiveSiteServices = $Controller | %{ $_.ActiveSiteServices }
440 “ActiveSiteServices $ActiveSiteServices” | LogMe -display -progress
441 $tests.ActiveSiteServices = “NEUTRAL”, $ActiveSiteServices
442
443
444 #==============================================================================================
445 # CHECK CPU AND MEMORY USAGE
446 #==============================================================================================
447
448 # Check the AvgCPU value for 5 seconds
449 $AvgCPUval = CheckCpuUsage ($ControllerDNS)
450 #$VDtests.LoadBalancingAlgorithm = “SUCCESS”, “LB is set to BEST EFFORT”}
451
452 if( [int] $AvgCPUval -lt 75) { “CPU usage is normal [ $AvgCPUval % ]” | LogMe -display; $tests.AvgCPU = “SUCCESS”, “$AvgCPUval %” }
453 elseif([int] $AvgCPUval -lt 85) { “CPU usage is medium [ $AvgCPUval % ]” | LogMe -warning; $tests.AvgCPU = “WARNING”, “$AvgCPUval %” }
454 elseif([int] $AvgCPUval -lt 95) { “CPU usage is high [ $AvgCPUval % ]” | LogMe -error; $tests.AvgCPU = “ERROR”, “$AvgCPUval %” }
455 elseif([int] $AvgCPUval -eq 101) { “CPU usage test failed” | LogMe -error; $tests.AvgCPU = “ERROR”, “Err” }
456 else { “CPU usage is Critical [ $AvgCPUval % ]” | LogMe -error; $tests.AvgCPU = “ERROR”, “$AvgCPUval %” }
457 $AvgCPUval = 0
458
459 # Check the Physical Memory usage
460 $UsedMemory = CheckMemoryUsage ($ControllerDNS)
461 if( $UsedMemory -lt 75) { “Memory usage is normal [ $UsedMemory % ]” | LogMe -display; $tests.MemUsg = “SUCCESS”, “$UsedMemory %” }
462 elseif( [int] $UsedMemory -lt 85) { “Memory usage is medium [ $UsedMemory % ]” | LogMe -warning; $tests.MemUsg = “WARNING”, “$UsedMemory %” }
463 elseif( [int] $UsedMemory -lt 95) { “Memory usage is high [ $UsedMemory % ]” | LogMe -error; $tests.MemUsg = “ERROR”, “$UsedMemory %” }
464 elseif( [int] $UsedMemory -eq 101) { “Memory usage test failed” | LogMe -error; $tests.MemUsg = “ERROR”, “Err” }
465 else { “Memory usage is Critical [ $UsedMemory % ]” | LogMe -error; $tests.MemUsg = “ERROR”, “$UsedMemory %” }
466 $UsedMemory = 0
467
468 # Check C Disk Usage
469 $HardDisk = CheckHardDiskUsage -hostname $ControllerDNS -deviceID “C:”
470 if ($HardDisk -ne $null) {
471 $XAPercentageDS = $HardDisk.PercentageDS
472 $frSpace = $HardDisk.frSpace
473
474 If ( [int] $XAPercentageDS -gt 15) { “Disk Free is normal [ $XAPercentageDS % ]” | LogMe -display; $tests.CFreespace = “SUCCESS”, “$frSpace GB” }
475 ElseIf ([int] $XAPercentageDS -eq 0) { “Disk Free test failed” | LogMe -error; $tests.CFreespace = “ERROR”, “Err” }
476 ElseIf ([int] $XAPercentageDS -lt 5) { “Disk Free is Critical [ $XAPercentageDS % ]” | LogMe -error; $tests.CFreespace = “ERROR”, “$frSpace GB” }
477 ElseIf ([int] $XAPercentageDS -lt 15) { “Disk Free is Low [ $XAPercentageDS % ]” | LogMe -warning; $tests.CFreespace = “WARNING”, “$frSpace GB” }
478 Else { “Disk Free is Critical [ $XAPercentageDS % ]” | LogMe -error; $tests.CFreespace = “ERROR”, “$frSpace GB” }
479
480 $XAPercentageDS = 0
481 $frSpace = 0
482 $HardDisk = $null
483 }
484
485 $tests.DFreespace = “NEUTRAL”, “N/A”
486 if ( $ControllerHaveD -eq “1” ) {
487 # Check D Disk Usage on DeliveryController
488 $HardDiskd = CheckHardDiskUsage -hostname $ControllerDNS -deviceID “D:”
489 if ($HardDiskd -ne $null)
490 {
491 $XAPercentageDSd = $HardDiskd.PercentageDS
492 $frSpaced = $HardDiskd.frSpace
493
494 If ( [int] $XAPercentageDSd -gt 15) { “D: Disk Free is normal [ $XAPercentageDSd % ]” | LogMe -display; $tests.DFreespace = “SUCCESS”, “$frSpaced GB” }
495 ElseIf ([int] $XAPercentageDSd -eq 0) { “D: Disk Free test failed” | LogMe -error; $tests.DFreespace = “ERROR”, “Err” }
496 ElseIf ([int] $XAPercentageDSd -lt 5) { “D: Disk Free is Critical [ $XAPercentageDSd % ]” | LogMe -error; $tests.DFreespace = “ERROR”, “$frSpaced GB” }
497 ElseIf ([int] $XAPercentageDSd -lt 15) { “D: Disk Free is Low [ $XAPercentageDSd % ]” | LogMe -warning; $tests.DFreespace = “WARNING”, “$frSpaced GB” }
498 Else { “D: Disk Free is Critical [ $XAPercentageDSd % ]” | LogMe -error; $tests.DFreespace = “ERROR”, “$frSpaced GB” }
499
500 $XAPercentageDSd = 0
501 $frSpaced = 0
502 $HardDiskd = $null
503 }
504 }
505
506 # Check uptime (Query over WMI)
507 $tests.WMI = “ERROR”,”Error”
508 try { $wmi=Get-WmiObject -class Win32_OperatingSystem -computer $ControllerDNS }
509 catch { $wmi = $null }
510
511 # Perform WMI related checks
512 if ($wmi -ne $null) {
513 $tests.WMI = “SUCCESS”, “Success”
514 $LBTime=$wmi.ConvertToDateTime($wmi.Lastbootuptime)
515 [TimeSpan]$uptime=New-TimeSpan $LBTime $(get-date)
516
517 if ($uptime.days -lt $minUpTimeDaysDDC){
518 “reboot warning, last reboot: {0:D}” -f $LBTime | LogMe -display -warning
519 $tests.Uptime = “WARNING”, (ToHumanReadable($uptime))
520 }
521 else { $tests.Uptime = “SUCCESS”, (ToHumanReadable($uptime)) }
522 }
523 else { “WMI connection failed – check WMI for corruption” | LogMe -display -error }
524 }
525
526
527
528 ” — ” | LogMe -display -progress
529 #Fill $tests into array
530 $ControllerResults.$ControllerDNS = $tests
531 }
532
533 #== Catalog Check ============================================================================================
534 “Check Catalog #################################################################################” | LogMe -display -progress
535 ” ” | LogMe -display -progress
536
537 $CatalogResults = @{}
538 $Catalogs = Get-BrokerCatalog -AdminAddress $AdminAddress
539
540 foreach ($Catalog in $Catalogs) {
541 $tests = @{}
542
543 #Name of MachineCatalog
544 $CatalogName = $Catalog | %{ $_.Name }
545 “Catalog: $CatalogName” | LogMe -display -progress
546
547 if ($ExcludedCatalogs -contains $CatalogName) {
548 “Excluded Catalog, skipping” | LogMe -display -progress
549 } else {
550 #CatalogAssignedCount
551 $CatalogAssignedCount = $Catalog | %{ $_.AssignedCount }
552 “Assigned: $CatalogAssignedCount” | LogMe -display -progress
553 $tests.AssignedToUser = “NEUTRAL”, $CatalogAssignedCount
554
555 #CatalogUnassignedCount
556 $CatalogUnAssignedCount = $Catalog | %{ $_.UnassignedCount }
557 “Unassigned: $CatalogUnAssignedCount” | LogMe -display -progress
558 $tests.NotToUserAssigned = “NEUTRAL”, $CatalogUnAssignedCount
559
560 # Assigned to DeliveryGroup
561 $CatalogUsedCountCount = $Catalog | %{ $_.UsedCount }
562 “Used: $CatalogUsedCountCount” | LogMe -display -progress
563 $tests.AssignedToDG = “NEUTRAL”, $CatalogUsedCountCount
564
565 #ProvisioningType
566 $CatalogProvisioningType = $Catalog | %{ $_.ProvisioningType }
567 “ProvisioningType: $CatalogProvisioningType” | LogMe -display -progress
568 $tests.ProvisioningType = “NEUTRAL”, $CatalogProvisioningType
569
570 #AllocationType
571 $CatalogAllocationType = $Catalog | %{ $_.AllocationType }
572 “AllocationType: $CatalogAllocationType” | LogMe -display -progress
573 $tests.AllocationType = “NEUTRAL”, $CatalogAllocationType
574
575 “”, “”
576 $CatalogResults.$CatalogName = $tests
577 }
578 ” — ” | LogMe -display -progress
579 }
580
581 #== DeliveryGroups Check ============================================================================================
582 “Check Assigments #############################################################################” | LogMe -display -progress
583
584 ” ” | LogMe -display -progress
585
586 $AssigmentsResults = @{}
587 $Assigments = Get-BrokerDesktopGroup -AdminAddress $AdminAddress
588
589 foreach ($Assigment in $Assigments) {
590 $tests = @{}
591
592 #Name of DeliveryGroup
593 $DeliveryGroupName = $Assigment | %{ $_.Name }
594 “DeliveryGroup: $DeliveryGroupName” | LogMe -display -progress
595
596 if ($ExcludedCatalogs -contains $DeliveryGroupName) {
597 “Excluded Delivery Group, skipping” | LogMe -display -progress
598 } else {
599
600 #PublishedName
601 $AssigmentDesktopPublishedName = $Assigment | %{ $_.PublishedName }
602 “PublishedName: $AssigmentDesktopPublishedName” | LogMe -display -progress
603 $tests.PublishedName = “NEUTRAL”, $AssigmentDesktopPublishedName
604
605 #DesktopsTotal
606 $TotalDesktops = $Assigment | %{ $_.TotalDesktops }
607 “DesktopsAvailable: $TotalDesktops” | LogMe -display -progress
608 $tests.TotalDesktops = “NEUTRAL”, $TotalDesktops
609
610 #DesktopsAvailable
611 $AssigmentDesktopsAvailable = $Assigment | %{ $_.DesktopsAvailable }
612 “DesktopsAvailable: $AssigmentDesktopsAvailable” | LogMe -display -progress
613 $tests.DesktopsAvailable = “NEUTRAL”, $AssigmentDesktopsAvailable
614
615 #DesktopKind
616 $AssigmentDesktopsKind = $Assigment | %{ $_.DesktopKind }
617 “DesktopKind: $AssigmentDesktopsKind” | LogMe -display -progress
618 $tests.DesktopKind = “NEUTRAL”, $AssigmentDesktopsKind
619
620 #inMaintenanceMode
621 $AssigmentDesktopsinMaintenanceMode = $Assigment | %{ $_.inMaintenanceMode }
622 “inMaintenanceMode: $AssigmentDesktopsinMaintenanceMode” | LogMe -display -progress
623 if ($AssigmentDesktopsinMaintenanceMode) { $tests.MaintenanceMode = “WARNING”, “ON” }
624 else { $tests.MaintenanceMode = “SUCCESS”, “OFF” }
625
626 #DesktopsUnregistered
627 $AssigmentDesktopsUnregistered = $Assigment | %{ $_.DesktopsUnregistered }
628 “DesktopsUnregistered: $AssigmentDesktopsUnregistered” | LogMe -display -progress
629 if ($AssigmentDesktopsUnregistered -gt 0 ) {
630 “DesktopsUnregistered > 0 ! ($AssigmentDesktopsUnregistered)” | LogMe -display -progress
631 $tests.DesktopsUnregistered = “WARNING”, $AssigmentDesktopsUnregistered
632 } else {
633 $tests.DesktopsUnregistered = “SUCCESS”, $AssigmentDesktopsUnregistered
634 “DesktopsUnregistered <= 0 ! ($AssigmentDesktopsUnregistered)” | LogMe -display -progress
635 }
636
637 #DesktopsInUse
638 $AssigmentDesktopsInUse = $Assigment | %{ $_.DesktopsInUse }
639 “DesktopsInUse: $AssigmentDesktopsInUse” | LogMe -display -progress
640 $tests.DesktopsInUse = “NEUTRAL”, $AssigmentDesktopsInUse
641
642 #DesktopFree
643 $AssigmentDesktopsFree = $AssigmentDesktopsAvailable – $AssigmentDesktopsInUse
644 “DesktopsFree: $AssigmentDesktopsFree” | LogMe -display -progress
645
646 if ($AssigmentDesktopsKind -eq “shared”) {
647 if ($AssigmentDesktopsFree -gt 0 ) {
648 “DesktopsFree < 1 ! ($AssigmentDesktopsFree)” | LogMe -display -progress
649 $tests.DesktopsFree = “SUCCESS”, $AssigmentDesktopsFree
650 } elseif ($AssigmentDesktopsFree -lt 0 ) {
651 “DesktopsFree < 1 ! ($AssigmentDesktopsFree)” | LogMe -display -progress
652 $tests.DesktopsFree = “SUCCESS”, “N/A”
653 } else {
654 $tests.DesktopsFree = “WARNING”, $AssigmentDesktopsFree
655 “DesktopsFree > 0 ! ($AssigmentDesktopsFree)” | LogMe -display -progress
656 }
657 } else {
658 $tests.DesktopsFree = “SUCCESS”, “N/A”
659 }
660
661 #Fill $tests into array
662 $AssigmentsResults.$DeliveryGroupName = $tests
663 }
664 ” — ” | LogMe -display -progress
665 }
666
667 # ======= Desktop Check ========
668 “Check virtual Desktops ####################################################################################” | LogMe -display -progress
669 ” ” | LogMe -display -progress
670
671 if($ShowDesktopTable -eq 1 ) {
672
673 $allResults = @{}
674
675 $machines = Get-BrokerMachine -MaxRecordCount $maxmachines -AdminAddress $AdminAddress| Where-Object {$_.SessionSupport -eq “SingleSession”}
676
677 # SessionSupport only availiable in XD 7.x – for this reason only distinguish in Version above 7 if Desktop or XenApp
678 if($controllerversion -lt 7 ) { $machines = Get-BrokerMachine -MaxRecordCount $maxmachines -AdminAddress $AdminAddress}
679 else { $machines = Get-BrokerMachine -MaxRecordCount $maxmachines -AdminAddress $AdminAddress| Where-Object {$_.SessionSupport -eq “SingleSession” } }
680
681 foreach($machine in $machines) {
682 $tests = @{}
683
684 $ErrorVDI = 0
685
686 # Column Name of Desktop
687 $machineDNS = $machine | %{ $_.DNSName }
688 “Machine: $machineDNS” | LogMe -display -progress
689
690 # Column CatalogName
691 $CatalogName = $machine | %{ $_.CatalogName }
692 “Catalog: $CatalogName” | LogMe -display -progress
693 $tests.CatalogName = “NEUTRAL”, $CatalogName
694
695 # Column Powerstate
696 $Powered = $machine | %{ $_.PowerState }
697 “PowerState: $Powered” | LogMe -display -progress
698 $tests.PowerState = “NEUTRAL”, $Powered
699
700 if ($Powered -eq “Off” -OR $Powered -eq “Unknown”) {
701 $tests.PowerState = “NEUTRAL”, $Powered
702 }
703
704 if ($Powered -eq “On”) {
705 $tests.PowerState = “SUCCESS”, $Powered
706 }
707
708 if ($Powered -eq “On” -OR $Powered -eq “Unknown”) {
709
710
711 # Column Ping Desktop
712 $result = Ping $machineDNS 100
713 if ($result -eq “SUCCESS”) {
714 $tests.Ping = “SUCCESS”, $result
715
716 #==============================================================================================
717 # Column Uptime (Query over WMI – only if Ping successfull)
718 $tests.WMI = “ERROR”,”Error”
719 $job = Start-Job -ScriptBlock $wmiOSBlock -ArgumentList $machineDNS
720 $wmi = Wait-job $job -Timeout 15 | Receive-Job
721
722 # Perform WMI related checks
723 if ($wmi -ne $null) {
724 $tests.WMI = “SUCCESS”, “Success”
725 $LBTime=[Management.ManagementDateTimeConverter]::ToDateTime($wmi.Lastbootuptime)
726 [TimeSpan]$uptime=New-TimeSpan $LBTime $(get-date)
727
728 if ($uptime.days -gt $maxUpTimeDays) {
729 “reboot warning, last reboot: {0:D}” -f $LBTime | LogMe -display -warning
730 $tests.Uptime = “WARNING”, $uptime.days
731 $ErrorVDI = $ErrorVDI + 1
732 } else {
733 $tests.Uptime = “SUCCESS”, $uptime.days
734 }
735 } else {
736 “WMI connection failed – check WMI for corruption” | LogMe -display -error
737 stop-job $job
738 }
739 }
740 else {
741 $tests.Ping = “Error”, $result
742 $ErrorVDI = $ErrorVDI + 1
743 }
744 #END of Ping-Section
745
746 # Column RegistrationState
747 $RegistrationState = $machine | %{ $_.RegistrationState }
748 “State: $RegistrationState” | LogMe -display -progress
749 if ($RegistrationState -ne “Registered”) {
750 $tests.RegistrationState = “ERROR”, $RegistrationState
751 $ErrorVDI = $ErrorVDI + 1
752 }
753 else { $tests.RegistrationState = “SUCCESS”, $RegistrationState }
754
755 }
756
757 # Column MaintenanceMode
758 $MaintenanceMode = $machine | %{ $_.InMaintenanceMode }
759 “MaintenanceMode: $MaintenanceMode” | LogMe -display -progress
760 if ($MaintenanceMode) { $tests.MaintenanceMode = “WARNING”, “ON”
761 $ErrorVDI = $ErrorVDI + 1
762 }
763 else { $tests.MaintenanceMode = “SUCCESS”, “OFF” }
764
765 # Column HostedOn
766 $HostedOn = $machine | %{ $_.HostingServerName }
767 “HostedOn: $HostedOn” | LogMe -display -progress
768 $tests.HostedOn = “NEUTRAL”, $HostedOn
769
770 # Column VDAVersion AgentVersion
771 $VDAVersion = $machine | %{ $_.AgentVersion }
772 “VDAVersion: $VDAVersion” | LogMe -display -progress
773 $tests.VDAVersion = “NEUTRAL”, $VDAVersion
774
775
776
777
778 # Column AssociatedUserNames
779 $AssociatedUserNames = $machine | %{ $_.AssociatedUserNames }
780 “Assigned to $AssociatedUserNames” | LogMe -display -progress
781 $tests.AssociatedUserNames = “NEUTRAL”, $AssociatedUserNames
782
783 ” — ” | LogMe -display -progress
784
785 # Fill $tests into array if error occured OR $ShowOnlyErrorVDI = 0
786 # Check to see if the server is in an excluded folder path
787 if ($ExcludedCatalogs -contains $CatalogName) {
788 “$machineDNS in excluded folder – skipping” | LogMe -display -progress
789 }
790 else {
791 # Check if error exists on this vdi
792 if ($ShowOnlyErrorVDI -eq 0 ) { $allResults.$machineDNS = $tests }
793 else {
794 if ($ErrorVDI -gt 0) { $allResults.$machineDNS = $tests }
795 else { “$machineDNS is ok, no output into HTML-File” | LogMe -display -progress }
796 }
797 }
798 }
799 }
800 else { “Desktop Check skipped because ShowDesktopTable = 0 ” | LogMe -display -progress }
801
802 # ======= XenApp Check ========
803 “Check XenApp Servers ####################################################################################” | LogMe -display -progress
804 ” ” | LogMe -display -progress
805
806 # Check XenApp only if $ShowXenAppTable is 1
807 if($ShowXenAppTable -eq 1 ) {
808 $allXenAppResults = @{}
809
810 $XAmachines = Get-BrokerMachine -MaxRecordCount $maxmachines -AdminAddress $AdminAddress | Where-Object {$_.SessionSupport -eq “MultiSession”}
811
812 foreach ($XAmachine in $XAmachines) {
813 $tests = @{}
814
815 $ErrorXA = 0
816
817 # Column Name of Machine
818 $machineDNS = $XAmachine | %{ $_.DNSName }
819 “Machine: $machineDNS” | LogMe -display -progress
820
821 # Column CatalogNameName
822 $CatalogName = $XAmachine | %{ $_.CatalogName }
823 “Catalog: $CatalogName” | LogMe -display -progress
824 $tests.CatalogName = “NEUTRAL”, $CatalogName
825
826 # Ping Machine
827 $result = Ping $machineDNS 100
828 if ($result -eq “SUCCESS”) {
829 $tests.Ping = “SUCCESS”, $result
830
831 #==============================================================================================
832 # Column Uptime (Query over WMI – only if Ping successfull)
833 $tests.WMI = “ERROR”,”Error”
834 $job = Start-Job -ScriptBlock $wmiOSBlock -ArgumentList $machineDNS
835 $wmi = Wait-job $job -Timeout 15 | Receive-Job
836
837 # Perform WMI related checks
838 if ($wmi -ne $null) {
839 $tests.WMI = “SUCCESS”, “Success”
840 $LBTime=[Management.ManagementDateTimeConverter]::ToDateTime($wmi.Lastbootuptime)
841 [TimeSpan]$uptime=New-TimeSpan $LBTime $(get-date)
842
843 if ($uptime.days -gt $maxUpTimeDays) {
844 “reboot warning, last reboot: {0:D}” -f $LBTime | LogMe -display -warning
845 $tests.Uptime = “WARNING”, $uptime.days
846 $ErrorXA = $ErrorXA + 1
847 } else {
848 $tests.Uptime = “SUCCESS”, $uptime.days
849 }
850 } else {
851 “WMI connection failed – check WMI for corruption” | LogMe -display -error
852 stop-job $job
853 }
854 #—-
855
856 # Column WriteCacheSize (only if Ping is successful)
857 ################ PVS SECTION ###############
858 if (test-path \\$machineDNS\c$\Personality.ini) {
859 # Test if PVS cache is of type “device’s hard drive”
860 $PvsWriteCacheUNC = Join-Path “\\$machineDNS” ($PvsWriteCacheDrive+”$”+”\.vdiskcache”)
861 $CacheDiskOnHD = Test-Path $PvsWriteCacheUNC
862
863 if ($CacheDiskOnHD -eq $True) {
864 $CacheDiskExists = $True
865 $CachePVSType = “Device HD”
866 } else {
867 # Test if PVS cache is of type “device RAM with overflow to hard drive”
868 $PvsWriteCacheUNC = Join-Path “\\$machineDNS” ($PvsWriteCacheDrive+”$”+”\vdiskdif.vhdx”)
869 $CacheDiskRAMwithOverflow = Test-Path $PvsWriteCacheUNC
870 if ($CacheDiskRAMwithOverflow -eq $True) {
871 $CacheDiskExists = $True
872 $CachePVSType = “Device RAM with overflow to disk”
873 } else {
874 $CacheDiskExists = $False
875 $CachePVSType = “”
876 }
877 }
878
879 if ($CacheDiskExists -eq $True) {
880 $CacheDisk = [long] ((get-childitem $PvsWriteCacheUNC -force).length)
881 $CacheDiskGB = “{0:n2}GB” -f($CacheDisk / 1GB)
882 “PVS Cache file size: {0:n2}GB” -f($CacheDisk / 1GB) | LogMe
883 #”PVS Cache max size: {0:n2}GB” -f($PvsWriteMaxSize / 1GB) | LogMe -display
884 $tests.WriteCacheType = “NEUTRAL”, $CachePVSType
885 if ($CacheDisk -lt ($PvsWriteMaxSize * 0.5)) {
886 “WriteCache file size is low” | LogMe
887 $tests.WriteCacheSize = “SUCCESS”, $CacheDiskGB
888 }
889 elseif ($CacheDisk -lt ($PvsWriteMaxSize * 0.8)) {
890 “WriteCache file size moderate” | LogMe -display -warning
891 $tests.WriteCacheSize = “WARNING”, $CacheDiskGB
892 $ErrorXA = $ErrorXA + 1
893 }
894 else {
895 “WriteCache file size is high” | LogMe -display -error
896 $tests.WriteCacheSize = “ERROR”, $CacheDiskGB
897 $ErrorXA = $ErrorXA + 1
898 }
899 }
900 $Cachedisk = 0
901 }
902 else { $tests.WriteCacheSize = “SUCCESS”, “N/A” }
903 ############## END PVS SECTION #############
904
905 # Check services
906 $services = Get-Service -Computer $machineDNS
907
908 if (($services | ? {$_.Name -eq “Spooler”}).Status -Match “Running”) {
909 “SPOOLER service running…” | LogMe
910 $tests.Spooler = “SUCCESS”,”Success”
911 }
912 else {
913 “SPOOLER service stopped” | LogMe -display -error
914 $tests.Spooler = “ERROR”,”Error”
915 $ErrorXA = $ErrorXA + 1
916 }
917
918 if (($services | ? {$_.Name -eq “cpsvc”}).Status -Match “Running”) {
919 “Citrix Print Manager service running…” | LogMe
920 $tests.CitrixPrint = “SUCCESS”,”Success”
921 }
922 else {
923 “Citrix Print Manager service stopped” | LogMe -display -error
924 $tests.CitrixPrint = “ERROR”,”Error”
925 $ErrorXA = $ErrorXA + 1
926 }
927
928 }
929 else {
930 $tests.Ping = “Error”, $result
931 $ErrorXA = $ErrorXA + 1
932 }
933 #END of Ping-Section
934
935 # Column Serverload
936 $Serverload = $XAmachine | %{ $_.LoadIndex }
937 “Serverload: $Serverload” | LogMe -display -progress
938 if ($Serverload -ge $loadIndexError) {
939 $tests.Serverload = “ERROR”, $Serverload
940 $ErrorXA = $ErrorXA + 1
941 } elseif ($Serverload -ge $loadIndexWarning) {
942 $tests.Serverload = “WARNING”, $Serverload
943 $ErrorXA = $ErrorXA + 1
944 } else {
945 $tests.Serverload = “SUCCESS”, $Serverload
946 }
947
948 # Column MaintMode
949 $MaintMode = $XAmachine | %{ $_.InMaintenanceMode }
950 “MaintenanceMode: $MaintMode” | LogMe -display -progress
951 if ($MaintMode) {
952 $tests.MaintMode = “WARNING”, “ON”
953 $ErrorXA = $ErrorXA + 1
954 } else { $tests.MaintMode = “SUCCESS”, “OFF” }
955
956 # Column RegState
957 $RegState = $XAmachine | %{ $_.RegistrationState }
958 “State: $RegState” | LogMe -display -progress
959
960 if ($RegState -ne “Registered”) {
961 $tests.RegState = “ERROR”, $RegState
962 $ErrorXA = $ErrorXA + 1
963 }
964 else { $tests.RegState = “SUCCESS”, $RegState }
965
966 # Column VDAVersion AgentVersion
967 $VDAVersion = $XAmachine | %{ $_.AgentVersion }
968 “VDAVersion: $VDAVersion” | LogMe -display -progress
969 $tests.VDAVersion = “NEUTRAL”, $VDAVersion
970
971 # Column HostedOn
972 $HostedOn = $XAmachine | %{ $_.HostingServerName }
973 “HostedOn: $HostedOn” | LogMe -display -progress
974 $tests.HostedOn = “NEUTRAL”, $HostedOn
975
976
977 # Column ActiveSessions
978 $ActiveSessions = $XAmachine | %{ $_.SessionCount }
979 “Active Sessions: $ActiveSessions” | LogMe -display -progress
980 $tests.ActiveSessions = “NEUTRAL”, $ActiveSessions
981
982 # Column ConnectedUsers
983 $ConnectedUsers = $XAmachine | %{ $_.AssociatedUserNames }
984 “Connected users: $ConnectedUsers” | LogMe -display -progress
985 $tests.ConnectedUsers = “NEUTRAL”, $ConnectedUsers
986
987 # Column DesktopGroupName
988 $DesktopGroupName = $XAmachine | %{ $_.DesktopGroupName }
989 “DesktopGroupName: $DesktopGroupName” | LogMe -display -progress
990 $tests.DesktopGroupName = “NEUTRAL”, $DesktopGroupName
991
992
993 #==============================================================================================
994 # CHECK CPU AND MEMORY USAGE
995 #==============================================================================================
996
997 # Check the AvgCPU value for 5 seconds
998 $XAAvgCPUval = CheckCpuUsage ($machineDNS)
999 #$VDtests.LoadBalancingAlgorithm = “SUCCESS”, “LB is set to BEST EFFORT”}
1000
1001 if( [int] $XAAvgCPUval -lt 75) { “CPU usage is normal [ $XAAvgCPUval % ]” | LogMe -display; $tests.AvgCPU = “SUCCESS”, “$XAAvgCPUval %” }
1002 elseif([int] $XAAvgCPUval -lt 85) { “CPU usage is medium [ $XAAvgCPUval % ]” | LogMe -warning; $tests.AvgCPU = “WARNING”, “$XAAvgCPUval %”; $ErrorXA = $ErrorXA + 1 }
1003 elseif([int] $XAAvgCPUval -lt 95) { “CPU usage is high [ $XAAvgCPUval % ]” | LogMe -error; $tests.AvgCPU = “ERROR”, “$XAAvgCPUval %”; $ErrorXA = $ErrorXA + 1 }
1004 elseif([int] $XAAvgCPUval -eq 101) { “CPU usage test failed” | LogMe -error; $tests.AvgCPU = “ERROR”, “Err”; $ErrorXA = $ErrorXA + 1 }
1005 else { “CPU usage is Critical [ $XAAvgCPUval % ]” | LogMe -error; $tests.AvgCPU = “ERROR”, “$XAAvgCPUval %”; $ErrorXA = $ErrorXA + 1 }
1006 $XAAvgCPUval = 0
1007
1008 # Check the Physical Memory usage
1009 [int] $XAUsedMemory = CheckMemoryUsage ($machineDNS)
1010 if( [int] $XAUsedMemory -lt 75) { “Memory usage is normal [ $XAUsedMemory % ]” | LogMe -display; $tests.MemUsg = “SUCCESS”, “$XAUsedMemory %” }
1011 elseif( [int] $XAUsedMemory -lt 85) { “Memory usage is medium [ $XAUsedMemory % ]” | LogMe -warning; $tests.MemUsg = “WARNING”, “$XAUsedMemory %”; $ErrorXA = $ErrorXA + 1 }
1012 elseif( [int] $XAUsedMemory -lt 95) { “Memory usage is high [ $XAUsedMemory % ]” | LogMe -error; $tests.MemUsg = “ERROR”, “$XAUsedMemory %”; $ErrorXA = $ErrorXA + 1 }
1013 elseif( [int] $XAUsedMemory -eq 101) { “Memory usage test failed” | LogMe -error; $tests.MemUsg = “ERROR”, “Err”; $ErrorXA = $ErrorXA + 1 }
1014 else { “Memory usage is Critical [ $XAUsedMemory % ]” | LogMe -error; $tests.MemUsg = “ERROR”, “$XAUsedMemory %”; $ErrorXA = $ErrorXA + 1 }
1015 $XAUsedMemory = 0
1016
1017 # Check C Disk Usage
1018 $HardDisk = CheckHardDiskUsage -hostname $machineDNS -deviceID “C:”
1019 if ($HardDisk -ne $null) {
1020 $XAPercentageDS = $HardDisk.PercentageDS
1021 $frSpace = $HardDisk.frSpace
1022
1023 If ( [int] $XAPercentageDS -gt 15) { “Disk Free is normal [ $XAPercentageDS % ]” | LogMe -display; $tests.CFreespace = “SUCCESS”, “$frSpace GB” }
1024 ElseIf ([int] $XAPercentageDS -eq 0) { “Disk Free test failed” | LogMe -error; $tests.CFreespace = “ERROR”, “Err”; $ErrorXA = $ErrorXA + 1 }
1025 ElseIf ([int] $XAPercentageDS -lt 5) { “Disk Free is Critical [ $XAPercentageDS % ]” | LogMe -error; $tests.CFreespace = “ERROR”, “$frSpace GB”; $ErrorXA = $ErrorXA + 1 }
1026 ElseIf ([int] $XAPercentageDS -lt 15) { “Disk Free is Low [ $XAPercentageDS % ]” | LogMe -warning; $tests.CFreespace = “WARNING”, “$frSpace GB”; $ErrorXA = $ErrorXA + 1 }
1027 Else { “Disk Free is Critical [ $XAPercentageDS % ]” | LogMe -error; $tests.CFreespace = “ERROR”, “$frSpace GB”; $ErrorXA = $ErrorXA + 1 }
1028
1029 $XAPercentageDS = 0
1030 $frSpace = 0
1031 $HardDisk = $null
1032 }
1033
1034 $tests.DFreespace = “NEUTRAL”, “N/A”
1035 if ( $XAServerHaveD -eq “1” ) {
1036 # Check D Disk Usage
1037 $HardDiskd = CheckHardDiskUsage -hostname $machineDNS -deviceID “D:”
1038 if ($HardDiskd -ne $null) {
1039 $XAPercentageDSd = $HardDiskd.PercentageDS
1040 $frSpaced = $HardDiskd.frSpace
1041
1042 If ( [int] $XAPercentageDSd -gt 15) { “Disk Free is normal [ $XAPercentageDSd % ]” | LogMe -display; $tests.CFreespace = “SUCCESS”, “$frSpaced GB” }
1043 ElseIf ([int] $XAPercentageDSd -eq 0) { “Disk Free test failed” | LogMe -error; $tests.CFreespace = “ERROR”, “Err”; $ErrorXA = $ErrorXA + 1 }
1044 ElseIf ([int] $XAPercentageDSd -lt 5) { “Disk Free is Critical [ $XAPercentageDSd % ]” | LogMe -error; $tests.CFreespace = “ERROR”, “$frSpaced GB”; $ErrorXA = $ErrorXA + 1 }
1045 ElseIf ([int] $XAPercentageDSd -lt 15) { “Disk Free is Low [ $XAPercentageDSd % ]” | LogMe -warning; $tests.CFreespace = “WARNING”, “$frSpaced GB”; $ErrorXA = $ErrorXA + 1 }
1046 Else { “Disk Free is Critical [ $XAPercentageDSd % ]” | LogMe -error; $tests.CFreespace = “ERROR”, “$frSpaced GB”; $ErrorXA = $ErrorXA + 1 }
1047
1048 $XAPercentageDSd = 0
1049 $frSpaced = 0
1050 $HardDiskd = $null
1051 }
1052 }
1053
1054
1055
1056
1057
1058 ” — ” | LogMe -display -progress
1059
1060 # Check to see if the server is in an excluded folder path
1061 if ($ExcludedCatalogs -contains $CatalogName) {
1062 “$machineDNS in excluded folder – skipping” | LogMe -display -progress
1063 } else {
1064 # Check if error exists on this vdi
1065 if ($ShowOnlyErrorXA -eq 0 ) {
1066 $allXenAppResults.$machineDNS = $tests
1067 } else {
1068 if ($ErrorXA -gt 0) {
1069 $allXenAppResults.$machineDNS = $tests
1070 } else {
1071 “$machineDNS is ok, no output into HTML-File” | LogMe -display -progress
1072 }
1073 }
1074 }
1075 }
1076
1077 }
1078 else { “XenApp Check skipped because ShowXenAppTable = 0 or Farm is < V7.x ” | LogMe -display -progress }
1079
1080 “####################### Check END ####################################################################################” | LogMe -display -progress
1081
1082 # ======= Write all results to an html file =================================================
1083 # Add Version of XenDesktop to EnvironmentName
1084 $XDmajor, $XDminor = $controllerversion.Split(“.”)[0..1]
1085 $XDVersion = “$XDmajor.$XDminor”
1086 $EnvironmentName = “$EnvironmentName $XDVersion”
1087 $emailSubject = (“$EnvironmentName Farm Report – ” + $ReportDate)
1088
1089 Write-Host (“Saving results to html report: ” + $resultsHTM)
1090 writeHtmlHeader “$EnvironmentName Farm Report” $resultsHTM
1091
1092 # Write Table with the Controllers
1093 writeTableHeader $resultsHTM $XDControllerFirstheaderName $XDControllerHeaderNames $XDControllerHeaderWidths $XDControllerTableWidth
1094 $ControllerResults | sort-object -property XDControllerFirstheaderName | %{ writeData $ControllerResults $resultsHTM $XDControllerHeaderNames }
1095 writeTableFooter $resultsHTM
1096
1097 # Write Table with the Catalogs
1098 writeTableHeader $resultsHTM $CatalogHeaderName $CatalogHeaderNames $CatalogWidths $CatalogTablewidth
1099 $CatalogResults | %{ writeData $CatalogResults $resultsHTM $CatalogHeaderNames}
1100 writeTableFooter $resultsHTM
1101
1102
1103 # Write Table with the Assignments (Delivery Groups)
1104 writeTableHeader $resultsHTM $AssigmentFirstheaderName $vAssigmentHeaderNames $vAssigmentHeaderWidths $Assigmenttablewidth
1105 $AssigmentsResults | sort-object -property ReplState | %{ writeData $AssigmentsResults $resultsHTM $vAssigmentHeaderNames }
1106 writeTableFooter $resultsHTM
1107
1108 # Write Table with all XenApp Servers
1109 if ($ShowXenAppTable -eq 1 ) {
1110 writeTableHeader $resultsHTM $XenAppFirstheaderName $XenAppHeaderNames $XenAppHeaderWidths $XenApptablewidth
1111 $allXenAppResults | sort-object -property collectionName | %{ writeData $allXenAppResults $resultsHTM $XenAppHeaderNames }
1112 writeTableFooter $resultsHTM
1113 }
1114 else { “No XenApp output in HTML ” | LogMe -display -progress }
1115
1116 # Write Table with all Desktops
1117 if ($ShowDesktopTable -eq 1 ) {
1118 writeTableHeader $resultsHTM $VDIFirstheaderName $VDIHeaderNames $VDIHeaderWidths $VDItablewidth
1119 $allResults | sort-object -property collectionName | %{ writeData $allResults $resultsHTM $VDIHeaderNames }
1120 writeTableFooter $resultsHTM
1121 }
1122 else { “No XenDesktop output in HTML ” | LogMe -display -progress }
1123
1124
1125 writeHtmlFooter $resultsHTM
1126
1127 #send email
1128 $emailMessage = New-Object System.Net.Mail.MailMessage
1129 $emailMessage.From = $emailFrom
1130 $emailMessage.To.Add( $emailTo )
1131 $emailMessage.Subject = $emailSubject
1132 $emailMessage.IsBodyHtml = $true
1133 $emailMessage.Body = (gc $resultsHTM) | Out-String
1134 $emailMessage.Attachments.Add($resultsHTM)
1135 $emailMessage.Priority = ($emailPrio)
1136
1137 $smtpClient = New-Object System.Net.Mail.SmtpClient( $smtpServer , $smtpServerPort )
1138 $smtpClient.EnableSsl = $smtpEnableSSL
1139
1140 # If you added username an password, add this to smtpClient
1141 If ((![string]::IsNullOrEmpty($smtpUser)) -and (![string]::IsNullOrEmpty($smtpPW))){
1142 $pass = $smtpPW | ConvertTo-SecureString -key $smtpKey
1143 $cred = New-Object System.Management.Automation.PsCredential($smtpUser,$pass)
1144
1145 $Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($cred.Password)
1146 $smtpUserName = $cred.Username
1147 $smtpPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
1148
1149 $smtpClient.Credentials = New-Object System.Net.NetworkCredential( $smtpUserName , $smtpPassword );
1150 }
1151
1152 $smtpClient.Send( $emailMessage )
1153
1154
1155 #=========== History ===========================================================================
1156 # Version 0.6
1157 # Edited on December 15th 2014 by Sebastiaan Brozius (NORISK IT Groep)
1158 # – Added MaintenanceMode-column for XenApp-servers, Fixed some typos, Cleaned up layout
1159 #
1160 # Version 0.7
1161 # Edited on December 15th 2014 by Sebastiaan Brozius (NORISK IT Groep)
1162 # – Added ServerLoad-column for XenApp-servers
1163 # – Added loadIndexError and loadIndexWarning-variables which are used as thresholds for the ServerLoad-column
1164 # – Removed line $machines = Get-BrokerMachine | Where-Object {$_.SessionSupport -eq “SingleSession”} from the XenApp-section (because this is for VDI)
1165 # – Removed Column-positions from comments
1166 #
1167 # Version 0.8
1168 # Edited on January 17th 2015 by Sacha Thomet
1169 # – Added MaintenanceMode-column for Assignments (DeliveryGroups), added MaintenanceMode-column for VDIs
1170 #
1171 # Version 0.9
1172 # Edited on May 5th 2015 by Sacha Thomet
1173 # – Changed some wording terms into account of XenDesktop/XenApp 7.x
1174 # (Assignment to DeliveryGroup, AssignedCount to AssignedToUser, UsedCount to AssignedToDG,
1175 # UnassignedCount to NotToUserAssigned)
1176 # – Added some columns the MachineCatalog (ProvisioningType, AllocationType)
1177 # – Added some columns the DeliveryGroups (PublishedName, DesktopKind)
1178 #
1179 # Version 0.92
1180 # Edited on July 2015 by Sacha Thomet
1181 # – Adjusted some typo
1182 # – Delivery-Group-Section: XenDesktop show Total Desktops assigned to this group (FeatureRequest Luis G)
1183 # – Delivery-Group-Section: XenDesktop Filter out shared Desktops on count for free Desktops (FeatureRequest James)
1184 #
1185 # Version 0.93
1186 # Edited on August 2015 by Stefan Beckmann (Unico Data AG)
1187 # – Added loadIndexError and loadIndexWarning as variable in the config section
1188 # – Specifying the PowerShell SnapIn which must be loaded
1189 # – You can now specify the delivery controller. This makes it possible to execute the script on a system which is not Delivery Controller or VDA.
1190 # – Added the connected users in the table
1191 # – Remove the old report bevor main script starts
1192 # – Log Citrix PS Snapins
1193 # – Run Citrix Cmdlet with AdminAdress to run this script remote
1194 # – If you run script remote, now returned correctly the version of XenDesktop. In the first Get-BrokerController command I added the parameter DNSName.
1195 # – New Way to send mail, which also allows passwords
1196 # – To send a mail without user and password I could not test
1197 #
1198 # # Version 0.94
1199 # Edited on October 2015 by Sacha Thomet
1200 # – Removed PVS WriteCache column – if you need that check this on PVS Health Check. XenApp/XenDesktop is maybe provisioned without PVS.
1201 # – Add possibility to set a Mail-Priority
1202 #
1203 # # Version 0.95
1204 # Edited on May 2016 by Sacha Thomet
1205 # – Check CPU, Memory and C: of Controllers
1206 # – XenApp: Add values: CPU & Memory and Disk Usage
1207 # – XenApp: Option to toggle on/off to show Connected Users
1208 # – XenApp: DesktopFree set to N/A because not relevant
1209 #
1210 # ToDo in a further version (Correction & Feature Requests)
1211 # – XenApp: Add more relevant values: Number of active users per server / Logon Enabled / SessionSupport
1212 # – XenDesktop: show Connected User
1213 # – XenApp: Get-BrokerSession per Machine for unique Sessions (?)(Feature Request Majeed Attar) => need better specification of the need.
1214 #
1215 # # Version 0.96
1216 # Edited on May 2016 by Sacha Thomet
1217 # Added D: for Controller and XenApp Server
1218 #
1219 # # Version 0.99
1220 # Edited on September 2016 by Sacha Thomet
1221 # – Show PowerState and do some checks not on powered off maschone (Ping, RegistrationState)
1222 # – Show VDA Version of XA or XD
1223 # – Show Host
1224 #
1225 # # Version 0.992
1226 # Edited on September 2016 by Stefan Beckmann
1227 # – Variable $EnvironmentName adjusted without version, and joined in the script later
1228 # – Variable $PvsWriteCache and $PvsWriteMaxSize re-added, since it is still used in the script
1229 # – Created timestamp report as variable $ReportDate
1230 # – $EnvironmentName and $emailSubject redefined in the report generation, incl. XenDesktop version with the new variable $XDmajor, $XDminor and $XDVersion
1231 #
1232 # # Version 0.995
1233 # Edited on September 2016 by Stefan Beckmann
1234 # – Configuration via an XML file
1235 # – Redefined display the date for the report
1236 # – Replaced generate the date in the second place by variable
1237 #
1238 # # Version 0.996 – 1.00
1239 # Edited on September 2016 by Sacha Thomet
1240 # – minor bug fixes
1241 #
1242 # # Version 1.0.1
1243 # Edited on September 2016 by Tyron Scholem
1244 # – localization correction for systems with decimal separator of “,”
1245 #
1246 # # Version 1.1.0
1247 # Edited on September 2016 by Tyron Scholem
1248 # – added uptime information for Delivery Controllers
1249 #
1250 #=========== History END ===========================================================================
1. Checked for pending updates in the VM from Studio.
2. Checked for active prov tasks by running the command: Get-ProvTask -Active $true.
3. Ran the command: Get-ProvVM “name_of_catalog” |select BootedImage, IdentityDiskid to fetch the UUID of the base disk that
is currently in use by the catalog.
4. Now ran the following command on the XenServer pool master to enumerate the UUID of the base disks with the same xxx: xe
vdi-list name-label-“xxx” | grep uuid
5. Except the base disk which has the same UUID in the above two commands, deleted the other base disks by using the
command: xe vdi-destroy uuid=xxxxx
6. Verified the same in the Storage using GUI whether the disks were deleted.
- xe vm-shutdown uuid=1f4e9596-d3e8-f91e-68a2-9bb105b50b31 force=true
- xe vm-reset-powerstate uuid=11b846ae-b982-e6b4-7431-f671c81e2cdf force=true
- list_domains
- /opt/xensource/debug/xenops destroy_domain –domid 35
NVIDIA Card installation steps.
use WinSCP for copying rmp file to temp folder in xenserver
- CAT /ETC/XENSOURCE/POOL.CONF
- nvidia-smi -a | more
- cd /
- rpm -qa | grep -i NVidi
- rpm -iv NVIDIA-vGPU-kepler-xenserver-6.5-361.40.x86_64.rpm
- nvidia-smi
Symptoms or Error
When accessing a store website on StoreFront, the following error message is displayed:
“Cannot complete your request. You can log on and try again, or contact your help desk for assistance.”
Solution
Important! This article is intended for use by System Administrators. If you are experiencing this issue and you are not a System Administrator, contact your organization’s Help Desk for assistance.
Note: The first troubleshooting step should be to review?? the messages in the Event Viewer of StoreFront, and the local computer account running the Receiver which displays “Cannot complete your request”. The errors in the Event Viewer logs?? will provide you guidance?? on where to start investigating the behavior in the sections listed in?? this article.
The article is divided into the following sections:
Certificate/IIS
1.Verify if the StoreFront server can resolve the StoreFront FQDN by pinging the FQDN from the command prompt.
User-added image
Configure the StoreFront Service to point to itself in a load balanced environment. For additional information, refer to Citrix Documentation – Load balancing with NetScaler.
In a single-server deployment, the Server Base URL must resolve to the StoreFront’s server local IP address.
2.Verify if the StoreFront IIS server is bound?? to 443 and is configured with a certificate?? corresponding to the FQDN.
3.Verify if the common name of the certificate binding in IIS matches the StoreFront’s base URL. If the certificate does not match, issue a new certificate to reflect the StoreFront URL or change the StoreFront URL to match the certificate. After performing the adjustments, run iisreset.
4.If accessing the server externally, validate the callback URL is configured correctly on the StoreFront Server. The behavior can occur?? when the callback URL resolves to the wrong IP or the entered NetScaler Gateway FQDN does not match the certificate on the NetScaler Gateway.
5.Verify that?? the server certificate?? and any intermediate certificate are?? installed on NetScaler Gateway and StoreFront server.
6.If the same FQDN is used on both the NetScaler Gateway and StoreFront, refer to?? Citrix Documentation – Create a single Fully Qualified Domain Name (FQDN) to access a store internally and externally.
7.Verify if a third party tool has made changes to IIS on StoreFront server, such as Windows Updates. Within a specific situation, the error appeared on IIS after a Windows Update:
“Details: CertEnroll::CX509Enrollment::p_InstallResponse: ASN1 bad tag value met. 0x8009310b (ASN:276)”
In this example, the resolution was?? to uninstall and reinstall the certificate on the IIS server.
8.Verify if any legacy sites were upgraded to the latest version of StoreFront.?? In this example,?? an entry was found in the web.config file under?? “C:\inetpub\wwwroot\Citrix\Authentication”?? for the “component id=”pnaAuthenticationStartupModule”. Backup the web.config file and remove?? the entry.
Authentication
1.Verify if the “User name and password” authentication method is enabled on the StoreFront server.
User-added image
2.Verify if the Base URL is configured with an FQDN “example.com” instead of NetBIOS “example”.
User-added image
3.Verify if the?? Citrix Default Domain Services?? Windows Service?? is running. By default, the startup type will be set to Automatic (Delayed Start). Confirm the service is running after the StoreFront server reboots. ??
4.Verify if users do not have different names in Active Directory. For?? example,?? the user principal name (UPN)?? name1@domain does not match the pre-Windows 2000 naming?? convention “down-level logon”?? domain\ABCname1.
Adjust the down-level logon to?? match the UPN. For the example, the down-level logon would show in the user profile as?? domain\name1. For additional information, refer to?? User Name Formats.
NetScaler Gateway Authentication
1.Verify if the Single Sign-on?? (SSO) Domain is configured correctly on the NetScaler Gateway.
2.Verify if there is an SSO domain mismatch on NetScaler Gateway and StoreFront.
3.NetScaler Gateway SSO might not be passing the correct information due to incorrect configuration. Verify that the following attributes are configured:
Server Logon Name Attribute: samAccountName
Group Attribute: MemberOf
Sub Attribute Name: CN
SSO Name Attribute: samAccountName
Security Type: PlainText
Note:?? When LDAP is configured as userPrincipalName, confirm that the SSO Name Attribute field shows the value sAMAccountName when using StoreFront with NetScaler or NetScaler Gateway. Refer to Citrix Documentation – User authentication for more information.
3.Verify the “No Rewrite Clientless” policy on the NetScaler Gateway is configured to use the expression TRUE.
User-added image
4.In the event log on StoreFront server, the following error is displayed: “CitrixAGBasic single sign-on failed because the credentials failed verification with reason FailedPasswordComplexity”.
In this example, a?? network trace on NetScaler shows the following:
User-added image
Inside the POST, the credentials are shown.
User-added image
A blank password field causes the failure. For client certificate to successfully log on to NetScaler Gateway two?? factor authentication,?? LDAP should be set as the primary. Also, LDAP is required to be set to the primary in the session policy credential index.
5.For domain users in a multi-domain environment, add the SSO Name Attribute field as UserPrincipalName under LDAP configuration and uncheck the Single Sign-on Domain for the authentication.
User-added image
User-added image
Load Balancer??
1.Verify the configuration for?? Method and Persistence in the Load Balancer Virtual Server section within the NetScaler:
Set LoadBalancing Method?? to LEASTCONNECTION
Set Persistence to COOKIEINSERT
For additional information, refer to the Citrix Documentation – Load balancing with NetScaler.
2.Verify if the Load Balancer can resolve the base URL of StoreFront when one of the StoreFront Server is taken offline.
3.If XML servers are load balanced, ensure that X-FORWARDED-FOR is configured for XML LoadBalanced vip.
Antivirus/Firewall
1.Verify if?? antivirus firewall is installed on the StoreFront server. Disable antivirus firewall and test the connection. Exclude the StoreFront ports within the antivirus firewall. Refer to CTX101810 – Communication Ports Used by Citrix Technologies for the list of StoreFront ports.
2.If McAfee Enterprise antivirus protection is enabled on the StoreFront server, random user will see the error message “Cannot complete your request”.?? Typically, the first user account will always?? see this error. Add the IIS process W3WP.exe to McAfee exclusion list and restart the server.
Refer to the following links for more information:
https://community.mcafee.com/thread/74874
https://kc.mcafee.com/corporate/index?page=content&id=KB81595
3.Verify if NetScaler is using Application Firewall. Test the configuration by disabling the Application Firewall.?? If successful re-enable the Application Firewall in learning mode,?? it can Learn and Allow the necessary StoreFront traffic.
4.If a proxy server is configured on the network, verify that the URL?? for proxy is set correctly within the browser LAN settings for Use automatic configuration script setting.
User-added image
Miscellaneous
1.Verify the Credential Wallet service is not started or in hung state.
User-added image
Ensure that the Citrix Credential Wallet Service is set for a Delayed Start and started on the StoreFront server.?? Restart the Citrix Credential Wallet Service.
2.The Credential Wallet component of StoreFront can prevent users from storing securely used password. When the password cannot be stored using the Credential Wallet, the authentication process cannot complete. Restart the Credential Wallet service on the affected server to restore the functionality. In certain situation, the behavior can reoccur. To permanently resolve the issue, Citrix recommends upgrading to the latest StoreFront.
3.Citrix recommends allowing at least an additional 2 GB of RAM dedicated to StoreFront. The memory allocated to StoreFront will be above the requirements for the operating system and applications installed on the server. Refer to Citrix Blog – StoreFront Scalability Update for additional information.
4.Verify if the Event Viewer has the following error:
Event ID 7: Unhandled exception thrown for route “ExplicitFormsAuthentication/AuthenticateStart” System.Configuration.ConfigurationErrorsException, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a The Forms Template Engine could not be found in the service locator. at Citrix.DeliveryServices.Authentication.Explicit.FormsCommon.Conversations.ExplicitConversationEngine.CreateConversationState(RequestToken requestToken, ITokenService tokenIssuingService) at Citrix.DeliveryServices.Authentication.FormsProtocol.Conversations.ConversationEngine.StartConversation(RequestToken requestToken, ITokenService tokenIssuingService)
Update the system environment variable directory to C:\Temp instead of D:\Temp.
5.It has been reported that using Microsoft “NLB” type load balancing with unicast mode might trigger this issue. Switching to multicast mode helps resolve this issue.
6.Delete the subnet IP address from StoreFront NetScaler Gateway configuration when internally browsing StoreFront site.
User-added image
Additional links Auto discovery
https://www.citrix.com/blogs/2013/04/01/configuring-email-based-account-discovery-for-citrix-receiver/?_ga=1.9196085.1832547337.1436199587
Load balancing
http://docs.citrix.com/en-us/storefront/3/integrate-with-netscaler-and-netscaler-gateway/load-balancing-with-netscaler.html
Moreinformaiton
http://support.en.ctx.org.cn/ctx133904.citrix
To run the script, perform the following steps:
1.Go to http://techblog.deptive.co.nz/2013/03/xenapp-farm-health-check-v2.html and download the latest version of the script.
2.Save the script to a folder on the XenApp server.
3.Edit the script by changing the variables to match your XenApp environment.
Tip
Ensure valid e-mail and mail server settings are applied.
4.Save the changes to the script.
5.Open a PowerShell prompt by navigating to Start | All Programs | Accessories | Windows PowerShell.
6.Go to the folder containing the script with the following command:
cd \
7.Run the script with the following command: