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

Helge Klein's picture

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, https://www.sepago.de/helge
#
#   Usage:
#
#   Get-AppVPackageDependencies <path to folder containing packages>
#

#Requires -Version 2

param(
   [ValidateNotNullOrEmpty()] 
   [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
   $PkgName   = $SFTFileXML.SOFTPKG.NAME
   $PkgGUID   = $SFTFileXML.SOFTPKG.IMPLEMENTATION.CODEBASE.GUID

   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
   
   $PkgDependencies   = $SFTFileXML.SOFTPKG.IMPLEMENTATION.VIRTUALENV.DEPENDENCIES.CODEBASE
   
   foreach ($PkgDependency in $PkgDependencies)
   {
      # Extract package information (again)
      $PkgName   = $SFTFileXML.SOFTPKG.NAME
      $PkgGUID   = $SFTFileXML.SOFTPKG.IMPLEMENTATION.CODEBASE.GUID
      
      # 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}}

Download

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