Private/Get-InstalledSoftware.ps1
Function Get-InstalledSoftware { <# .SYNOPSIS Retrieves a list of all software installed .EXAMPLE Get-InstalledSoftware This example retrieves all software installed on the local computer .PARAMETER Name The software title you'd like to limit the query to. .NOTES Author: Adam Bertram URL: https://4sysops.com/archives/find-the-product-guid-of-installed-software-with-powershell/ #> [OutputType([System.Management.Automation.PSObject])] [CmdletBinding()] param ( [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $Name ) $UninstallKeys = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall", "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" $null = New-PSDrive -Name HKU -PSProvider Registry -Root Registry::HKEY_USERS $UninstallKeys += Get-ChildItem HKU: -ErrorAction SilentlyContinue | Where-Object { $_.Name -match 'S-\d-\d+-(\d+-){1,14}\d+$' } | ` ForEach-Object { "HKU:\$($_.PSChildName)\Software\Microsoft\Windows\CurrentVersion\Uninstall" } if (-not $UninstallKeys) { Write-Verbose -Message "$($MyInvocation.MyCommand): No software registry keys found." } else { foreach ($UninstallKey in $UninstallKeys) { if ($PSBoundParameters.ContainsKey('Name')) { $WhereBlock = { ($_.PSChildName -match '^{[A-Z0-9]{8}-([A-Z0-9]{4}-){3}[A-Z0-9]{12}}$') -and ($_.GetValue('DisplayName') -like "$Name*") } } else { $WhereBlock = { ($_.PSChildName -match '^{[A-Z0-9]{8}-([A-Z0-9]{4}-){3}[A-Z0-9]{12}}$') -and ($_.GetValue('DisplayName')) } } $gciParams = @{ Path = $UninstallKey ErrorAction = 'SilentlyContinue' } $selectProperties = @( @{n = 'Publisher'; e = { $_.GetValue('Publisher') } }, @{n = 'Name'; e = { $_.GetValue('DisplayName') } }, @{n = 'Version'; e = { $_.GetValue('DisplayVersion') } }, @{n = 'ProductCode'; e = { $_.PSChildName } }, @{n = 'UninstallString'; e = { $_.GetValue('UninstallString') } }, @{n = 'QuietUninstallString'; e = { $_.GetValue('QuietUninstallString') } }, @{n = 'BundleCachePath'; e = { $_.GetValue('BundleCachePath') } }, @{n = 'Architecture'; e = { If ($_.GetValue('DisplayName') -like "*x64*") { "x64" } Else { "x86" } } }, @{n = 'Release'; e = { If ($_.GetValue('DisplayName') -match [regex]"(\d{4})\s+") { $matches[0].Trim(" ") } } } ) Get-ChildItem @gciParams | Where-Object $WhereBlock | Select-Object -Property $selectProperties } } } |