Private/Get-MSIProductCodesWithNames.ps1
<#
.SYNOPSIS Function .DESCRIPTION #************************************************************************************************************ # Disclaimer # # This sample script is not supported under any Microsoft standard support program or service. This sample # script is provided AS IS without warranty of any kind. Microsoft further disclaims all implied warranties # including, without limitation, any implied warranties of merchantability or of fitness for a particular # purpose. The entire risk arising out of the use or performance of this sample script and documentation # remains with you. In no event shall Microsoft, its authors, or anyone else involved in the creation, # production, or delivery of this script be liable for any damages whatsoever (including, without limitation, # damages for loss of business profits, business interruption, loss of business information, or other # pecuniary loss) arising out of the use of or inability to use this sample script or documentation, even # if Microsoft has been advised of the possibility of such damages. # #************************************************************************************************************ #> #region Get-MSIProductCodesWithNames function Get-MSIProductCodesWithNames { $results = @() $registryPaths = @( "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" ) foreach ($path in $registryPaths) { if (Test-Path $path) { Get-ChildItem -Path $path | ForEach-Object { $key = $_ $productCode = $key.PSChildName if ($productCode -match '^\{[0-9A-F\-]{36}\}$') { $props = Get-ItemProperty -Path $key.PSPath -ErrorAction SilentlyContinue $displayName = $props.DisplayName $results += [PSCustomObject]@{ ProductCode = $productCode Name = $displayName } } } } } return $results } #endregion |