• View Communities
    • Citrix Communities
      Visit the Citrix Communities to get and share technical information and best practices about desktop delivery, datacenter, networking and cloud computing solutions.
    • Citrix Blogs
      Learn the latest from the Citrix employees who are building the future of virtual computing.
    • Citrix Developer Network
      The place for unfiltered straight talk on Citrix products. Find related blogs, best practices, code downloads, APIs and more.
    • Citrix Ready Community Verified
      Does it work with Citrix? Application compatibility questions are a thing of the past with the new Citrix Community Verified site.
  •  Sign In
Citrix Developer Network

PVS Automatic vDisk Update Script

Description

This workflow allows for automatic updates of vDisks on a scheduled or on-call basis.

It uses a dedicated machine as an "updater" to make the process hypervisor/device agnostic, and allows for someone without dedicated PVS admin abilities to update the vDisk, as well as give it a "personality" to run scripts that aren't executed on other machines, such as copying files or running update processes.

The script:

  • Restarts the updater machine with a standard vDisk to free up the Update vDisk ("standby")
  • Makes a copy of the standby vDisk
  • Imports and turns the copy standby into standard
  • Increments the standby disk versioning and forces PVS to recognize the update
  • Restores the standby disk to the update machine to continue gathering updates

The script requires no manual intervention, and can be scheduled nightly, weekly, or any other required time basis. The older disk is preserved, allowing for simple rollback, and disks are datestamped to allow for easy identification.

Required Activity Libraries

The standard Windows activity library is required for this, v. 1.0.0.0 . It can be obtained through Citrix.com

Download

Click the link below to download the workflow, then go to the Workflows section of Workflow Studio and import the file:

PVS vDisk Update.0.9.zip

Follow the instructions in the Readme.txt file for configuration and setup. If you have any issues, please leave a comment here or contact me on Twitter @mcbogo.


Disclaimer

These software applications are provided to you as is with no representations, warranties or conditions of any kind. You may use and distribute it at your own risk. CITRIX DISCLAIMS ALL WARRANTIES WHATSOEVER, EXPRESS, IMPLIED, WRITTEN, ORAL OR STATUTORY, INCLUDING WITHOUT LIMITATION WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NONINFRINGEMENT. Without limiting the generality of the foregoing, you acknowledge and agree that (a) the software application may exhibit errors, design flaws or other problems, possibly resulting in loss of data or damage to property; (b) it may not be possible to make the software application fully functional; and (c) Citrix may, without notice or liability to you, cease to make available the current version and/or any future versions of the software application. In no event should the code be used to support of ultra-hazardous activities, including but not limited to life support or blasting activities. NEITHER CITRIX NOR ITS AFFILIATES OR AGENTS WILL BE LIABLE, UNDER BREACH OF CONTRACT OR ANY OTHER THEORY OF LIABILITY, FOR ANY DAMAGES WHATSOEVER ARISING FROM USE OF THE SOFTWARE APPLICATION, INCLUDING WITHOUT LIMITATION DIRECT, SPECIAL, INCIDENTAL, PUNITIVE, CONSEQUENTIAL OR OTHER DAMAGES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. You agree to indemnify and defend Citrix against any and all claims arising from your use, modification or distribution of the code.

Tags

workflows workflows Delete
workflow-studio workflow-studio Delete
Enter tags to add to this page:
Please wait 
Looking for a tag? Just start typing.
  1. Jul 27, 2009

    Anonymous says:

    What versions of Provisioning Server are compatible with this workflow?

    What versions of Provisioning Server are compatible with this workflow?

    1. Jul 27, 2009

      Michael Bogobowicz says:

      The script was built on PVS build 5.0.2.2188, but it should work on any 5.x vers...

      The script was built on PVS build 5.0.2.2188, but it should work on any 5.x version, as it's based on the MCLI. It may work on earlier 4.x versions as well, but it hasn't been tested and may need some minor modifications.

  2. May 27, 2010

    Anonymous says:

    I tried the workflow. This works very well, but how about automatic cleanup of "...

    I tried the workflow. This works very well, but how about automatic cleanup of "old" versions of vDisks. Would this be possible with workflow? This would prevent the vDisk store filling up with old files.

  3. Sep 01, 2010

    Anonymous says:

    Hi,  How do I modify the script to use it without workflow? Thanks

    Hi,

     How do I modify the script to use it without workflow?

    Thanks

    1. Sep 01, 2010

      Michael Bogobowicz says:

      It is possible to do it without Workflow Studio - all you have to do is take the...

      It is possible to do it without Workflow Studio - all you have to do is take the separate batch files provided in the script and use scheduling to set them apart by a minute or so, enough time to allow the vDisk desktop/server to reboot.

      Alternately, if you have the most recent version of PVS, you can make a script with PowerShell that mimics this.

  4. Jan 25, 2011

    David Wiedemann says:

    Hi Michael I'm having issues to bring this up and running. I have the following...

    Hi Michael

    I'm having issues to bring this up and running. I have the following setup:

    My disks at D:\PVS\vDisks, I have two disks with the following roles (Site: Wyssache, Store: vDisks):

    • XD-4000: Master disk, Machine, which work with this disk is called XD-4000
    • XD-40xx: Work disk, Machines, that use this disk are XD-4001 (is also defined to be template), XD-4002, XD-4003, ... and so on
      -> Collection name for all these machines: Clients_Test

    -> As I have several setups in the same store, called XD-1000/XD-10xx, XD-2000/XD-20xx and so on with corresponding client names following the upper way and in other Device Collections, I cannot just use a Standby.

    My idea is, to create for each setup an own workflow with it's own set of .bat-files.

    So, what i want, is to copy the Master-Disk into the work-disk, where all the productive clients are working with.

    I cannot really make sene of all the named you used before, and so I have some troubles (For example, have no idea, what all those mcli-commands mean, that are used)...

    So I tried the follwowng:

    Changed step2.bat as following:

     
     ::change to the PVS directory
    cd "C:\Programme\Citrix\Provisioning Services Console"
    
    ::copy the existing files
    copy D:\PVS\vDisks\XD-4000.pvp D:\PVS\vDisks\XD-4000_active.%date:~10,4%%date:~4,2%%date:~7,2%.pvp
    copy D:\PVS\vDisks\XD-4000.vhd D:\PVS\vDisks\XD-4000_active.%date:~10,4%%date:~4,2%%date:~7,2%.vhd
    
    ::add the new disk to the database
    mcli add DiskLocator -r diskLocatorName="active.%date:~10,4%%date:~4,2%%date:~7,2%" siteName="%4" StoreName="%3"
    
    ::sets the new disk to standard mode with cache on server
    ::WriteCacheType Options: 1 (Server Disk), 2(Server Disk Encrypted), 3 (RAM), 4 (Hard Disk), 5 (Hard Disk Encrypted), 6 (RAM Disk), or 7 (Difference Disk)
    mcli set Disk -p diskLocatorName="active.%date:~10,4%%date:~4,2%%date:~7,2%" siteName="%4" StoreName="%3" -r writeCacheType=1
    
    ::sets the current incremental value
    mcli set Disk -p diskLocatorName="active.%date:~10,4%%date:~4,2%%date:~7,2%" siteName="%4" StoreName="%3" -r build=%date:~10,4%%date:~4,2%%date:~7,2%
    
    ::Checks for updates
    mcli Run ApplyAutoUpdate -p SiteName="%4"
    
    ::Re-assign the standby disk to the updater
    mcli Add Device -r DeviceName="null" siteName="%4" deviceMac="00-00-00-00-00-00" collectionName="%5"
    mcli Run CopyPasteDevice -p DeviceNameFrom="null" DeviceName="%1" properties=6
    mcli Delete Device -p DeviceName="null"
    mcli run AssignDiskLocator -p deviceName="%1" diskLocatorName="XD-4000" siteName="%4" StoreName="%3"
    
    ::Reboots the updater to free the vDisk
    mcli run Reboot -p deviceName="%1"
    

    Now I called the files as following, including the result (I just paste the cmd-output)

    C:\>"c:\programme\citrix\provisioning services console\y_xd-4000_step1.bat" xd-4000 xd-4000
    
    C:\>cd "C:\Programme\Citrix\Provisioning Services Console"
    
    C:\Programme\Citrix\Provisioning Services Console>mcli Run CopyPasteDevice -p DeviceNameFrom="xd-4000" DeviceName="xd-4000" properties=6
    
    Executing: Run COPYPASTEDEVICE
    Run succeeded.
    
    C:\Programme\Citrix\Provisioning Services Console>mcli run Reboot -p deviceName="xd-4000"
    
    Executing: Run REBOOT
    Run succeeded.
    
    C:\>
    C:\>
    C:\>
    C:\>
    C:\>"c:\programme\citrix\provisioning services console\z_xd-4000_step2.bat" xd-40xx xd-4000 vDisks Wyssachen Clients_Test
    
    C:\>cd "C:\Programme\Citrix\Provisioning Services Console"
    
    C:\Programme\Citrix\Provisioning Services Console>copy D:\PVS\vDisks\XD-4000.pvp D:\PVS\vDisks\XD-4000_active.1.01.pvp
            1 Datei(en) kopiert.
    
    C:\Programme\Citrix\Provisioning Services Console>copy D:\PVS\vDisks\XD-4000.vhd D:\PVS\vDisks\XD-4000_active.1.01.vhd
            1 Datei(en) kopiert.
    
    C:\Programme\Citrix\Provisioning Services Console>mcli add DiskLocator -r diskLocatorName="active.1.01" siteName="Wyssachen" StoreName="vDisks"
    
    Executing: Add DISKLOCATOR
    ***Error, Add failed: An Add or Set command would have resulted in a duplicate key.
    Eine Zeile mit doppeltem Schlüssel kann in das 'dbo.DiskLocator'-Objekt mit dem eindeutigen 'IDX_DiskLocatorSiteIdName'-Index nicht eingefügt werden.
    Die Anweisung wurde beendet.
    
    C:\Programme\Citrix\Provisioning Services Console>mcli set Disk -p diskLocatorName="active.1.01" siteName="Wyssachen" StoreName="vDisks" -r writeCache
    Type=1
    
    Executing: Set DISK
    ***Error, Set failed: Partial error.
    ***Error, Set failed: Server VM-0014 cannot serve the vDisk active.1.01.
    
    C:\Programme\Citrix\Provisioning Services Console>mcli set Disk -p diskLocatorName="active.1.01" siteName="Wyssachen" StoreName="vDisks" -r build=1.01
    
    
    Executing: Set DISK
    ***Error, Set failed: The build field value is invalid, the minumum is 0 and the maximum is 4294967295.
    
    C:\Programme\Citrix\Provisioning Services Console>mcli Run ApplyAutoUpdate -p SiteName="Wyssachen"
    
    Executing: Run APPLYAUTOUPDATE
    Run succeeded.
    
    C:\Programme\Citrix\Provisioning Services Console>mcli Add Device -r DeviceName="null" siteName="Wyssachen" deviceMac="00-00-00-00-00-00" collectionNa
    me="Clients_Test"
    
    Executing: Add DEVICE
    ***Error, Add failed: No object was added/updated/deleted in the last operation.
    
    C:\Programme\Citrix\Provisioning Services Console>mcli Run CopyPasteDevice -p DeviceNameFrom="null" DeviceName="xd-40xx" properties=6
    
    Executing: Run COPYPASTEDEVICE
    ***Error, Run failed: The device to copy deviceNameFrom=null was not found.
    
    C:\Programme\Citrix\Provisioning Services Console>mcli Delete Device -p DeviceName="null"
    
    Executing: Delete DEVICE
    ***Error, Delete failed: The specified device does not exist.
    
    C:\Programme\Citrix\Provisioning Services Console>mcli run AssignDiskLocator -p deviceName="xd-40xx" diskLocatorName="XD-4000" siteName="Wyssachen" St
    oreName="vDisks"
    
    Executing: Run ASSIGNDISKLOCATOR
    ***Error, Run failed: The specified device does not exist.
    
    C:\Programme\Citrix\Provisioning Services Console>mcli run Reboot -p deviceName="xd-40xx"
    
    Executing: Run REBOOT
    ***Error, Run failed: The specified device does not exist.
    
    C:\Programme\Citrix\Provisioning Services Console>
    

    Sorry for this big thing here - I just really would be glad to get some help!

    Thank you very much for your effort and kind regards

    David

  5. Jan 25, 2011

    Michael Bogobowicz says:

    David, Can you tell me what version of PVS you're using? I'll see if I can play...

    David,

    Can you tell me what version of PVS you're using? I'll see if I can play around and figure out what's going on, though I'm guessing there's a file name mismatch (or possibly a missing command beforehand) at:C:\Programme\Citrix\Provisioning Services Console>mcli add DiskLocator -r diskLocatorName="active.1.01" siteName="Wyssachen" StoreName="vDisks"
     

  6. Jan 26, 2011

    Anonymous says:

    Michael Thank you for your reply. I was playing around as well furthermore an...

    Michael

    Thank you for your reply.

    I was playing around as well furthermore and have found a solution, that works for me. My main issues were a non-understanding of terms/concept in regards of this update-functionality and a mismatch with the format of the date-output (as we use Swiss Location).

    So I constructed my own update-script - and post it here, so anybody, who is interested can use it

    Assumptions:
    PVS Version 5.6 (German, that explains the path below), class and tapes of Disks are set Per Device collections we have a class-name and two types of desktops:

    • Master-Desktop, using a master-disk, both named the same
    • A number of productive desktops using a work-disk
      -> One of them is template
    • Variables-definition in the script

    On all disks Automatic Updates must be enabled

    There are the following main differences to the original ones from Michael:

    • This disk does not depend on the name "standby" for the updater-disk
    • All is been done in one Batch-file, no Workflow is necessary
      :: ---------------------------------------------------------------------------
      :: Script for updating a disk of a PVS Device Collection
      :: -> Based on a script provided by Michael Bogobowicz, Citrix
      ::    See http://community.citrix.com/display/wf/PVS+Automatic+vDisk+Update+Script?showComments=true&showCommentArea=true
      ::
      :: Adjusted for the Company Loosli (http://www.achtung-fertig-loosli.ch)
      ::   - 25.01.2011, David Wiedemann
      ::
      :: ---------------------------------------------------------------------------
      ::
      :: Variables:
      ::   %1: Name of the Master-Desktop / Master-Disk
      ::   %2: Name of the Template-Desktop
      ::   %3: Prefix for the Disk-Name, that are been used as productive disks
      ::   %4: Store-Name of the Disks
      ::   %5: Site Name
      ::   %6: Device Collection-name
      ::
      :: !!! Important: Date-format is German - so take care at the use of the below date-variables
      ::
      :: ---------------------------------------------------------------------------
      
      
      :: Change into the PVS directory
      C:
      cd "C:\Programme\Citrix\Provisioning Services Console"
      
      :: Changes the vDisk assignment of the Master-Desktop (Updater) to use the work-disk temporarely
      mcli Run CopyPasteDevice -p DeviceNameFrom="%2" DeviceName="%1" properties=6
      
      :: Reboots Master-Desktop to free the vDisk
      mcli Run Reboot -p deviceName="%1"
      
      
      :: Wait 5 Minutes
      :: -> Pinging a non-existing IP with one packet, using timeout in miliseconds as defined time (300'000ms = 5 Mins.)
      ping -n 1 -w 300000 192.168.111.111
      
      
      :: Copy the existing vDisk-files into the new files, that will be used in the future for Work-Desktops
      copy D:\PVS\vDisks\%1.pvp D:\PVS\vDisks\%3.%date:~6,4%-%date:~3,2%-%date:~0,2%.pvp
      copy D:\PVS\vDisks\%1.vhd D:\PVS\vDisks\%3.%date:~6,4%-%date:~3,2%-%date:~0,2%.vhd
      
      :: Add the new disk to the database
      mcli add DiskLocator -r diskLocatorName="%3.%date:~6,4%-%date:~3,2%-%date:~0,2%" siteName="%5" StoreName="%4"
      
      :: Sets the new disk to standard mode with cache on server and sets the current date as Build-value
      mcli set Disk -p diskLocatorName="%3.%date:~6,4%-%date:~3,2%-%date:~0,2%" siteName="%5" StoreName="%4" -r writeCacheType=1
      mcli set Disk -p diskLocatorName="%3.%date:~6,4%-%date:~3,2%-%date:~0,2%" siteName="%5" StoreName="%4" -r build=%date:~6,4%%date:~3,2%%date:~0,2%
      
      :: Forces checks for updates
      :: -> All working Desktops will get the new Disk as their active Disk
      mcli Run ApplyAutoUpdate -p SiteName="%5"
      
      :: Re-Assign the Master-Disk to the master-Desktop (Updater)
      mcli Add Device -r DeviceName="null" siteName="%5" deviceMac="00-00-00-00-00-00" collectionName="%6"
      mcli Run CopyPasteDevice -p DeviceNameFrom="null" DeviceName="%1" properties=6
      mcli Delete Device -p DeviceName="null"
      mcli run AssignDiskLocator -p deviceName="%1" diskLocatorName="%1" siteName="%5" StoreName="%4"
      
      :: Reboots the Master-Desktop to use again the Master-Disk
      mcli run Reboot -p deviceName="%1"
       
      

    1. Jan 26, 2011

      Michael Bogobowicz says:

      I like the ping trick as a wait, and thanks for sharing the script! Glad to ...

      I like the ping trick as a wait, and thanks for sharing the script! Glad to see everything worked out & that you were able to get away from the Workflow Studio requirement of the previous script.

  7. Jan 27, 2011

    David Wiedemann says:

    Michael Small Addition to the script: Get rid of the limitation, that it can b...

    Michael

    Small Addition to the script: Get rid of the limitation, that it can be ran only once a  day:
    Generate the variables vDiskName and the Build-Number containing additionally the time (Hour:Minutes), and then work with these variables in the script. So we can use it quite a number of times a day.

    • I had to shorten the date/year, so minutes can work, as PVS doesn't not like too long numbers (only 10 characters)
    • At the year 2100, it will be tricky, that it works - but as most of us will then be retired (if even still alife), it does not really matter
    • And as a nice side-effect (at least for me): The script seems to be easier to read...

    Also consider here, that the date/time are used as it fits for Swiss date- and time-format. That might need some tricky workaround with english time format (And: PVS cannot handle alphanumeric characters as Build-numbers - you cannot use "a" for "am" or something similar)...

    Script:

     
    :: -------------------------------------------------------------------------------
    :: Script for updating a disk of a PVS Device Collection
    :: -> Based on a script provided by Michael Bogobowicz, Citrix
    ::    See http://community.citrix.com/display/wf/PVS+Automatic+vDisk+Update+Script?showComments=true&showCommentArea=true
    ::
    :: Adjusted for the Company Loosli (http://www.achtung-fertig-loosli.ch)
    ::   - 25.01.2011, David Wiedemann
    ::
    :: -------------------------------------------------------------------------------
    ::
    :: Assumptions:
    :: PVS Version 5.6 (German, that explains the path below), class and tapes of Disks are set
    :: Per Device collections we have a class-name and two types of desktops:
    ::   - Master-Desktop, using a master-disk, both named the same
    ::   - A number of productive desktops using a work-disk
    ::     -> One of them is template
    :: On all disks Automatic Updates must be enabled
    ::
    :: Variables:
    ::   %1: Name of the Master-Desktop / Master-Disk
    ::   %2: Name of the Template-Desktop
    ::   %3: Prefix for the Disk-Name, that are been used as productive disks
    ::   %4: Store-Name of the Disks
    ::   %5: Site Name
    ::   %6: Device Collection-name
    ::
    :: !!! Important: Date-format is German - so take care at the use of the below date-variables
    ::
    :: -------------------------------------------------------------------------------
    
    :: Change into the PVS directory
    C:
    cd "C:\Programme\Citrix\Provisioning Services Console"
    
    :: Changes the vDisk assignment of the Master-Desktop (Updater) to use the work-disk temporarely
    mcli Run CopyPasteDevice -p DeviceNameFrom="%2" DeviceName="%1" properties=6
    
    :: Reboots Master-Desktop to free the vDisk
    mcli Run Reboot -p deviceName="%1"
    
    
    :: Wait 5 Minutes
    :: -> Pinging a non-existing IP with one packet, using timeout in miliseconds as defined time (300'000ms = 5 Mins.)
    ping -n 1 -w 300000 192.168.111.111
    
    
    :: Generate Disk-name and build-number with Date and time
    set DateYear=%date:~8,2%
    set DateMonth=%date:~3,2%
    set DateDay=%date:~0,2%
    set TimeHour=%time:~0,2%
    set TimeMin=%time:~3,2%
    
    set vDiskName=%3.%DateYear%-%DateMonth%-%DateDay%_%TimeHour%%TimeMin%
    set BuildNumber=%DateYear%%DateMonth%%DateDay%%TimeHour%%TimeMin%
    
    
    :: Copy the existing vDisk-files into the new files, that will be used in the future for Work-Desktops
    copy D:\PVS\vDisks\%1.pvp D:\PVS\vDisks\%vDiskName%.pvp
    copy D:\PVS\vDisks\%1.vhd D:\PVS\vDisks\%vDiskName%.vhd
    
    
    :: Add the new disk to the database
    mcli add DiskLocator -r diskLocatorName="%vDiskName%" siteName="%5" StoreName="%4"
    
    :: Sets the new disk to standard mode with cache on server and sets the current date as Build-value
    mcli set Disk -p diskLocatorName="%vDiskName%" siteName="%5" StoreName="%4" -r writeCacheType=1
    mcli set Disk -p diskLocatorName="%vDiskName%" siteName="%5" StoreName="%4" -r build=%BuildNumber%
    
    :: Forces checks for updates
    :: -> All working Desktops will get the new Disk as their active Disk
    mcli Run ApplyAutoUpdate -p SiteName="%5"
    
    
    :: Re-Assign the Master-Disk to the master-Desktop (Updater)
    mcli Add Device -r DeviceName="null" siteName="%5" deviceMac="00-00-00-00-00-00" collectionName="%6"
    mcli Run CopyPasteDevice -p DeviceNameFrom="null" DeviceName="%1" properties=6
    mcli Delete Device -p DeviceName="null"
    mcli run AssignDiskLocator -p deviceName="%1" diskLocatorName="%1" siteName="%5" StoreName="%4"
    
    :: Reboots the Master-Desktop to use again the Master-Disk
    mcli run Reboot -p deviceName="%1"
    
    




    Kind regards

    David

  8. Feb 02, 2011

    Anonymous says:

    Hey guys, I updated the script a little further and have posted it on my site: h...

    Hey guys, I updated the script a little further and have posted it on my site: http://www.randyprice.org/2011/02/02/automatically-updating-a-vdisk-using-powershell-to-apply-os-patches-and-antivirus-definitions/.

    Basically, I added support for an additional PVS server, some event logging, the ability to reboot a device collection if needed, and the option to only keep so many revisions of a vDisk image. This can be a scheduled job using any Enterpise Job scheduling software or even Task Scheduler on any machine that has the Provisioning Services Console installed. Check it out and let me know what you think.

Related Links