-
Notifications
You must be signed in to change notification settings - Fork 0
/
Find MSI Uninstall ID.ps1
75 lines (73 loc) · 2.32 KB
/
Find MSI Uninstall ID.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
## Usage, Add the folowing function to your code.
##
## $process = Get-ProgramUninstallString -Filter "Application Name"
## $process.name
## $process.version
## $process.guid
function Get-ProgramUninstallString {
[CmdletBinding(DefaultParameterSetName = "ByName")]
[OutputType([PSCustomObject])]
param (
[Parameter(
ParameterSetName = "ByName",
ValueFromPipeline = $true,
ValueFromPipelineByPropertyName = $true
)]
[Alias(
"DisplayName"
)]
[String[]]
$Name,
[Parameter(
ParameterSetName = "ByFilter"
)]
[String]
$Filter = "*",
[Parameter()]
[Switch]
$ShowNulls
)
begin {
try {
if (Test-Path -Path "HKLM:\SOFTWARE\WOW6432Node") {
$programs = Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" -ErrorAction Stop
}
$programs += Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" -ErrorAction Stop
$programs += Get-ItemProperty -Path "Registry::\HKEY_USERS\*\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" -ErrorAction SilentlyContinue
} catch {
Write-Error $_
break
}
}
process {
if ($PSCmdlet.ParameterSetName -eq "ByName") {
foreach ($nameValue in $Name) {
$programs = $programs.Where({
$_.DisplayName -eq $nameValue
})
}
} else {
$programs = $programs.Where({
$_.DisplayName -like "*$Filter*"
})
}
if ($null -ne $programs) {
if (-not ($ShowNulls.IsPresent)) {
$programs = $programs.Where({
-not [String]::IsNullOrEmpty(
$_.UninstallString
)
})
}
$output = $programs.ForEach({
[PSCustomObject]@{
Name = $_.DisplayName
Version = $_.DisplayVersion
Guid = $_.PSChildName
UninstallString = $_.UninstallString
}
})
Write-Output -InputObject $output
}
}
}