Flickering Screen in an Citrix Environment
Problem
After we moved the customer environment from XA 6.15 to 7.15 we had the problem, that the users complained about their desktop. it was flickering every now and then. Sometimes after 2 MInutes sometimes after an hour. No special programm was runned which could have been causing the issue.After a long troubleshooting session we came accross, that the flickering always occured during the GPO Upate running all 90 minutes in the background. We made a call with Microsoft and they responded it was by design
- "Consider notifying users that their policy is updated
periodically so that they recognize the signs of a policy update. When Group Policy is updated,
the Windows desktop is refreshed; it flickers briefly and closes open menus.
Also, restrictions imposed by Group Policies, such as those that limit the
programs users can run, might interfere with tasks in progress."
Workaround
We now took the user policy auto update out of the productive environment and created a powershell script for urgent updates, where we can roll out the policies without user impact in the background.
The machine policys will be updated every 8 hours.
Here is the Powershellscript for manually updating the User policy:
<#
.SYNOPSIS
Run GPupdate remote on Citrix Servers
(The used command Invoke-GPupdate generates a scheduled task on the servers.
This task starts the GPupdate process normally in the next 10 minutes.)
.PARAMETER Farm
Select Citrix Farm "Prod" or "Test"
.PARAMETER DeliveryGroup
Select the DeliveryGroup which will get the GPupdate
Use "all" to send GPupdate to all Citrix Servers
#>
# Get user choice for XA Farm "Prod" or "Test" or what else you have
Write-Host
$Farm = Read-Host -Prompt "1 = XA7 Prod`n2 = XA7 Test`nPlease Enter Farm Number "
# "1 = XA7 Prod`n2 = XA7 Test`nPlease Enter Farm Number " enteryour Farm Names here
# Set DeliveryController according to "Prod" or "Test" or how ever you call your farm
Switch ($Farm) {
1 {
$DeliveryController = "YOURDELIVERYCONTROLLER"
}
2 {
$DeliveryController = "YOURDELIVERYCONTROLLER"
}
default {
"No Farm selected, exiting"
exit
}
}
Write-Host
Write-Host "Using Delivery Controller '$DeliveryController'"
Add-PSSnapin Citrix*
# Read available DeliveryGroups
$DeliveryGroups = Get-BrokerDesktopGroup -AdminAddress $DeliveryController | Sort-Object -Property Name
# Write DeliveryGroups with count in hashtable
$DeliveryGroupsHash = @{}
$Count = 1
foreach ($DeliveryGroup in $DeliveryGroups) {
$DeliveryGroupsHash.Add("$($Count.toString("00"))", "$($DeliveryGroup.name)")
$count++
}
# Add selection for "All Servers" to hastable
$DeliveryGroupsHash.Add("99","All Servers")
# Show selection menu
Write-Host "==============================================="
$DeliveryGroupsHash.GetEnumerator() | sort -Property name | ft -AutoSize
Write-Host "==============================================="
Write-Host
# Get selection from user input
$SelectedDeliveryGroup = Read-Host -Prompt "Please Enter Number of DeliveryGroup"
Write-Host
$SelectedDeliveryGroup = $DeliveryGroupsHash.Get_Item("$SelectedDeliveryGroup")
if ($SelectedDeliveryGroup -eq $null) {Write-Host "Wrong Number, exiting" -ForegroundColor Red; break}
# Write user choice
if ($SelectedDeliveryGroup -eq "All Servers") {
Write-Host "Your choice: All Servers"
write-Host
}
else {
$SelectedDeliveryGroup = $SelectedDeliveryGroup.Substring(0)
Write-Host "Your choice: $SelectedDeliveryGroup"
write-Host
}
# Read "All Servers" or "Servers from specified DeliveryGroup"
if ($SelectedDeliveryGroup -eq "All Servers") {
$Servers = (get-brokermachine -AdminAddress $DeliveryController -MaxRecordCount 9999).HostedMachineName
}
else {
$Servers = (get-brokermachine -AdminAddress $DeliveryController -DesktopGroupName $SelectedDeliveryGroup -MaxRecordCount 9999).HostedMachineName
}
Write-Host "Wait 10 seconds, then GPupdate will start on '$SelectedDeliveryGroup'"
Write-Host
sleep -Seconds 10
# Start GPupdate on the servers
foreach ($Server in $Servers) {
Invoke-GPUpdate -Computer $Server -Target "Computer" -ErrorAction Ignore
Write-Host Starting GPupdate on $Server
}
write-Host
Write-Host "Wait 60 seconds, then script will exit"
sleep -Seconds 60
<#
.SYNOPSIS
Run GPupdate remote on Citrix Servers
(The used command Invoke-GPupdate generates a scheduled task on the servers.
This task starts the GPupdate process normally in the next 10 minutes.)
.PARAMETER Farm
Select Citrix Farm "Prod" or "Test"
.PARAMETER DeliveryGroup
Select the DeliveryGroup which will get the GPupdate
Use "all" to send GPupdate to all Citrix Servers
#>
# Get user choice for XA Farm "Prod" or "Test" or what else you have
Write-Host
$Farm = Read-Host -Prompt "1 = XA7 Prod`n2 = XA7 Test`nPlease Enter Farm Number "
# "1 = XA7 Prod`n2 = XA7 Test`nPlease Enter Farm Number " enteryour Farm Names here
# Set DeliveryController according to "Prod" or "Test" or how ever you call your farm
Switch ($Farm) {
1 {
$DeliveryController = "YOURDELIVERYCONTROLLER"
}
2 {
$DeliveryController = "YOURDELIVERYCONTROLLER"
}
default {
"No Farm selected, exiting"
exit
}
}
Write-Host
Write-Host "Using Delivery Controller '$DeliveryController'"
Add-PSSnapin Citrix*
# Read available DeliveryGroups
$DeliveryGroups = Get-BrokerDesktopGroup -AdminAddress $DeliveryController | Sort-Object -Property Name
# Write DeliveryGroups with count in hashtable
$DeliveryGroupsHash = @{}
$Count = 1
foreach ($DeliveryGroup in $DeliveryGroups) {
$DeliveryGroupsHash.Add("$($Count.toString("00"))", "$($DeliveryGroup.name)")
$count++
}
# Add selection for "All Servers" to hastable
$DeliveryGroupsHash.Add("99","All Servers")
# Show selection menu
Write-Host "==============================================="
$DeliveryGroupsHash.GetEnumerator() | sort -Property name | ft -AutoSize
Write-Host "==============================================="
Write-Host
# Get selection from user input
$SelectedDeliveryGroup = Read-Host -Prompt "Please Enter Number of DeliveryGroup"
Write-Host
$SelectedDeliveryGroup = $DeliveryGroupsHash.Get_Item("$SelectedDeliveryGroup")
if ($SelectedDeliveryGroup -eq $null) {Write-Host "Wrong Number, exiting" -ForegroundColor Red; break}
# Write user choice
if ($SelectedDeliveryGroup -eq "All Servers") {
Write-Host "Your choice: All Servers"
write-Host
}
else {
$SelectedDeliveryGroup = $SelectedDeliveryGroup.Substring(0)
Write-Host "Your choice: $SelectedDeliveryGroup"
write-Host
}
# Read "All Servers" or "Servers from specified DeliveryGroup"
if ($SelectedDeliveryGroup -eq "All Servers") {
$Servers = (get-brokermachine -AdminAddress $DeliveryController -MaxRecordCount 9999).HostedMachineName
}
else {
$Servers = (get-brokermachine -AdminAddress $DeliveryController -DesktopGroupName $SelectedDeliveryGroup -MaxRecordCount 9999).HostedMachineName
}
Write-Host "Wait 10 seconds, then GPupdate will start on '$SelectedDeliveryGroup'"
Write-Host
sleep -Seconds 10
# Start GPupdate on the servers
foreach ($Server in $Servers) {
Invoke-GPUpdate -Computer $Server -Target "Computer" -ErrorAction Ignore
Write-Host Starting GPupdate on $Server
}
write-Host
Write-Host "Wait 60 seconds, then script will exit"
sleep -Seconds 60
Comments
Post a Comment