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

  • Scripting
  • Published Jan 6, 2010 Updated Oct 27, 2010

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.

Comments

Related Posts

Creating Realistic Test User Accounts in Active Directory

Creating Realistic Test User Accounts in Active Directory
When you need to simulate a real Active Directory with thousands of users you quickly find that creating realistic test accounts is not trivial. Sure enough, you can whip up a quick PowerShell one-liner that creates any number of accounts, but what if you need real first and last names? Real (existing) addresses? Postal codes matching phone area codes? I could go on. The point is that you need two things: input files with names, addresses etc. And script logic that creates user accounts from that data. This blog post provides both.
Scripting

Blocking Office Macros, Managing Windows & macOS via Intune

Blocking Office Macros, Managing Windows & macOS via Intune
How to centrally manage essential security settings of self-managed devices This is a guest post by Martin Kretzschmar, customer success engineer at vast limits, the uberAgent company. One thing I especially like about my everyday working life is the flexibility it offers. I appreciate the freedom of choice in terms of location, time and device. We want to avoid getting into micro-management but, being an IT company, we also need to provide the necessary security where needed.
Scripting

Latest Posts

Filebrowser to Be Archived. Migrate to a Modern Alternative: Sambee

Filebrowser to Be Archived. Migrate to a Modern Alternative: Sambee
Filebrowser is being archived. As the author writes, the codebase dates back to when he was but 15 years old. Having created such a popular file management tool is a more than impressive achievement for anyone, let alone a teenager. However, when it comes to security and reliability, Filebrowser seems to be built on a less than ideal foundation, so much so that the author states:
Home Automation, Networking & Self-Hosting