# $APP_NAME must be set by the calling script or specified here

# Get all of the uninstall registry keys
$UNINSTALL_KEYS = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
$UNINSTALL_KEYS += Get-ChildItem -Path HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall

Function Get-GUIDFromMSIUninstallString {
    param([string]$str)
    $start = $str.IndexOf('{') + 1
    $end = $str.IndexOf('}')
    Return $str.Substring($start, $end - $start)
}

# Track whether an app was uninstalled or not
$PRODUCTUNINSTALLED = $false

Foreach ( $reg in $UNINSTALL_KEYS ) {
    # Get the uninstall key
    $REG_PROPERTY = Get-ItemProperty -Path $reg.PSPath

    # Get the display name of the app
    $DISPLAY_NAME = $REG_PROPERTY.DisplayName

    # Get the UninstallString
    $UNINSTALLSTRING = $REG_PROPERTY.UninstallString

    # Get the ModifyPath
    $MODIFYPATH = $REG_PROPERTY.ModifyPath

    # Make sure the DisplayName matches what we're looking for
    If ( $DISPLAY_NAME -ilike $APP_NAME ) {
        # Make sure the software was installed using an MSI
        If ( $REG_PROPERTY.WindowsInstaller -eq 1 ) {
            # Get the product code from the UninstallString
            If ( $UNINSTALLSTRING ) { $PRODUCT_CODE = $(Get-GUIDFromMSIUninstallString -str $UNINSTALLSTRING) }

            # Get the product code from the ModifyPath
            ElseIf ( $MODIFYPATH ) { $PRODUCT_CODE = $(Get-GUIDFromMSIUninstallString -str $MODIFYPATH) }

            # Uninstall the app
            If ( $PRODUCT_CODE ) {
                LogMsg "Uninstalling ${DISPLAY_NAME} ${PRODUCT_CODE}"
                $arguments = '/X{' + $PRODUCT_CODE + '} /qn /norestart'
                Try { Start-Process -FilePath "msiexec.exe" -ArgumentList $arguments -Wait ; $PRODUCTUNINSTALLED = $true }
                Catch { LogErr $_.Exception.Message }
            }
        }
        Else {
            LogMsg "Cannot uninstall ""${DISPLAY_NAME}""`n                      UninstallString: ${UNINSTALLSTRING}"
        }
    }
}

If ( $PRODUCTUNINSTALLED -eq $false ) { LogMsg "No product matching ${APP_NAME} was found"}