Quickly Updating Persistent MCS VDAs

by David Ott, CTA

I have to maintain the VDA software on roughly 100 persistent MCS desktops. Every time Citrix came out with a new version of Virtual Apps and Desktops (XenApp/XenDesktop), I would cringe at the thought of having to “touch” every one of them. It usually took me two or more weeks to get through them all.  I finally got tired of that process and decided to script it. It has saved me a ton of time (and from pulling out all of my hair), and I hope it can help others as well.

The really short version of how it works:

  1. Gets a list of computers from the DDC (or you can manually input the computer names into the script).
  2. On each computer it will create two scripts, and two scheduled tasks.
    1. The first script loads auto logon information into the registry (local administrator account)
      1. Executed one time to restart the machine
    2. The second script handles the VDA removal and install of the new version.
      1. Executes when the local administrator logs on

At the end, it removes the scheduled tasks, the PowerShell scripts copied to the VDA, and auto logon information.

Here is the script – read through all the comments, so you know how to edit it for your environment.

I also created a video from an older version of the script if you want to get a better idea of how it works. It was designed to work with Citrix Hypervisor (XenServer), but the new one uses a mapped drive instead.


  1. Thank you for this – this is super helpful.

    My question, and apologies for this as I am still a beginner..

    Why do you back tick multiple variables throughout the script? I understand that this is to tell powershell to interpret the following string literally instead of looking for an associated variable.

    I.E. `$log = “logfile”

    Thank you 🙂

  2. Hi for Persistent Full Clone Desktops via MCS

    `$installargs = “/quiet /noreboot /components VDA,PLUGINS /controllers “”deliverycontroller1.domain.com deliverycontroller2.domain.com“” /install_mcsio_driver /enable_remote_assistance /enable_hdx_ports /enable_hdx_udp_ports /optimize /enable_real_time_transport /enable_framehawk_port /masterimage /virtualmachine /exclude “”Personal vDisk“”,“”Citrix Telemetry Service“””

    If its a persistent and not the actual master image i suppose don’t you have to remove the /masterimage if its its own dedicated mcs persistent desktop? also why did you include mcsio_driver if that is for non-persistent desktops?

    Thanks in advance

Leave a Reply