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 -Path "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 = "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(" ") } } }, @{n = "UninstallString"; e = { $_.GetValue("UninstallString") } }, @{n = "QuietUninstallString"; e = { $_.GetValue("QuietUninstallString") } }, @{n = "UninstallKey"; e = { $UninstallKey } } ) Get-ChildItem @gciParams | Where-Object $WhereBlock | Select-Object -Property $selectProperties } } } |