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
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.
5 Comments
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.
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).
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.
Thanks,
Hitesh
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.
Helge
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
Cheers
Duncan