PowerShell Script Lists App-V Package Dependencies (Dynamic Suite Composition, DSC)

Update 2010-04-20: Thanks to Stefan Henseler the script now works correctly with multiple dependencies in a single file. Be sure to download the current version below.

App-V’s Dynamic Suite Composition is a powerful feature in that it allows multiple “bubbles” to share the same virtual environment. In other words, package A can be made dependent on package B. But if DSC is used extensively, dependencies between packages tend to become difficult to manage – there seems to be no simple way of listing all packages’ dependencies. Well, I have written a PowerShell script that does just that.

Using Get-AppVPackageDependencies

Just call the script with the path (UNC or local) to a folder containing packages. The script will recursively search the path given for OSD files and analyze each OSD file for dependencies. Here is some sample output:

PS D:\> .\Get-AppVPackageDependencies.ps1 .\
Dependencies found:
DaveSoft_CopyRite_Vista.CopyRite -> Nvu
Opera -> Firefox_JRE
All packages found:
Name                             GUID
----                             ----
Nvu                              3AAC7EE6-84C4-4021-966B-56C52FF95AAF
WinDirStat                       3C5E1C59-D56E-4463-B9A0-5190034E6223
DaveSoft_CopyRite_Vista.CopyRite 4A7697E4-ED02-4D87-A8F0-88D7DEB914DE
Firefox_JRE                      999E8458-D477-4975-B3C8-3BCE1252B991
Opera                            24D14B13-1838-45B2-9DAC-78D0A7432F69

In the example above, the script was located in the same folder as the packages, thus the parameter “.\”.

Get-AppVPackageDependencies – the Script

Here is the source code. Let me know if it is useful to you.

#	Get-AppVPackageDependencies by Helge Klein, sepago GmbH, http://blogs.sepago.de/helge/
#	Usage:
#	Get-AppVPackageDependencies <path to folder containing packages>
#	Script version: 1.1
#	-	Minor changes to allow for multiple dependencies in a OSD file (thanks to Stefan Henseler)
#Requires -Version 2
	[System.String[]] $PackageBasePath
# Initialize a hash table that stores GUID -> name associations
$Packages = @{}
# Get a list of all .OSD files below the base path passed in
$SFTFiles	= Get-ChildItem $PackageBasePath -filter *.osd -force -recurse
# Store each OSD file's data (name and GUID)
foreach ($SFTFile in $SFTFiles)
	# Read the OSD file
	[xml]	$SFTFileXML	= Get-Content $SFTFile.FullName
	# Store relevant information
	if ($Packages.ContainsKey($PkgGUID) -eq $false)
		$Packages.Add($PkgGUID, $PkgName)
Write-Output "`n============================================================`nDependencies found:`n============================================================`n"
# Process each package's dependencies
foreach ($SFTFile in $SFTFiles)
	# Read the OSD file
	[xml]	$SFTFileXML	= Get-Content $SFTFile.FullName
	foreach ($PkgDependency in $PkgDependencies)
		# Extract package information (again)
		# Extract the GUID the package depends on
		$PkgDependencyGUID	= $PkgDependency.GUID
		# Look up the depending package's name
		if ($PkgDependencyGUID -ne $null -and $Packages.ContainsKey($PkgDependencyGUID))
			Write-Output "$PkgName -> $($Packages.Get_Item($PkgDependencyGUID))"
Write-Output "`n============================================================`nAll packages found:`n============================================================"
Write-Output $Packages | format-table -auto @{Label="Name";Expression={$_.Value}},@{Label="GUID";Expression={$_.Name}}


You can download a digitally signed version of the script here.

, ,

5 Responses to PowerShell Script Lists App-V Package Dependencies (Dynamic Suite Composition, DSC)

  1. Holger Adam January 7, 2010 at 09:02 #

    Nice script.

    It might boost performance a little, if you store the xml content of each .osd file in a list and iterate that list instead of reading the file content twice.

    • Helge Klein January 7, 2010 at 10:09 #

      Hi Holger,
      I guess I programmed it like this (not keeping all files in memory) to not limit scalability. Although I admit it would need to be a truly great number of OSD files to reach typical 32-bit process memory barriers (2 GB).

  2. Hitesh Pandya February 10, 2010 at 20:07 #

    This is a very good script.
    I always wondered about this issue. To resolve this, I created a windows application that connects to access database. Application allows users to import the OSD files to this database. Once all the information of OSD files is in database, you can generate any report out of it. Currently I am using this application to perform:

    1) check on 8.3 directory names to make sure they are unique before we sequence any app

    2) Generate report on Dynamically suited applications. It allows you to select the app and finds the applications that are including this app as DSC.

    I would appreciate your thoughts or comments on this approach.


    • Helge Klein February 10, 2010 at 21:23 #

      Hi Hitesh,

      you used a different approach than I did. While mine is simpler to implement and use you are independent of the actual OSD files on the server. So both have their pros and cons. I your solution works well, stay with it.


  3. Duncan Murdoch April 21, 2010 at 21:11 #

    Hi Helge,

    It’s good to see others working on the same issues and different ideas comeing out to resolve them. I have also taken a different approach to you and Hitesh in looking at the problem. If you would like to take a look DSC+ is part of the OSD+ suite I have beta release. If you would like to take a look and let me have any feed back that would be great. You can download at http://www.intercept-it.com/AppPlus


Leave a Reply