Dynamic Uninstall

//Dynamic Uninstall
Dynamic Uninstall 2017-10-01T18:18:57+00:00

The Toolkit Forums Deployment Scripts Dynamic Uninstall

  • Author
    Posts
  • Matt
    Participant
    Post count: 11
    #2327 |

    The Scenario: App installs but may update itself or generate a random key every time (idiots).
    The Solve: If the below script comes out correctly formatted, it has the logic to detect the uninstall strings and piece together the uninstall. Keep in mind the app is 32-bit and I didn’t want to spend more time than I had to.

    <pre class=”brush: text; gutter: true; first-line: 1; highlight: []; html-script: false”>
    #Find dynamic uninstall string
    $DName = "<DisplayNameHere>"
    $Exe= "<ExpectedUninstallerName"
    $QUS = "<KeyDataName"
    $root = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    $root64 = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
    if ($is64bit) {
    $keys = gci $root64
    }
    else {
    $keys = gci $root
    }
    foreach ($key in $keys) {
    $Inst = (get-itemproperty $key.pspath | ? {$_.DisplayName -match $DName}).$QUS
    $Split1 = $Inst -split '/' | ? {$_.trim() -ne "" }
    $Split2 = $Split1 -split "rn"
    foreach ($Split in $Split2) {
    if ($Split -like "*$Exe*") {
    $Uninst = $Split.Replace("`"","")
    }
    else {
    $Parameters += "/" + $Split
    }
    }
    }

    #Execute gathered string
    Execute-Process -Path $Uninst -Parameters "$Parameters"

  • Jim
    Participant
    Post count: 43

    Matt,

    I’ve seen other people on here post similar scripts to uninstall software. Out of curiosity, why not use the get-installedapplication function to get the uninstall string? That way you let the function figure out if it’s 64-bit or not…

    Something like this:

    $VC2013 = ((Get-InstalledApplication -Name 'Microsoft Visual C++ 2013 Redistributable (x64) - 12.0.30501').UninstallString -split '" ').Trim('"')
    If ($VC2013) {
    $VC2013Uninst = $VC2013[0]
    $VC2013Params = $VC2013[1]
    Execute-Process -Path $VC2013Uninst -Parameters "$VC2013Params /quiet /norestart"
    }

    Or my post here, “http://psappdeploytoolkit.com/forums/topic/execute-process-odd-behavior/#post-2248”.

  • Matt
    Participant
    Post count: 11

    Simple, that function only gets certain values:
    UninstallSubkey
    ProductCode
    DisplayName
    DisplayVersion
    UninstallString
    InstallSource
    InstallLocation
    InstallDate
    Publisher
    Is64BitApplication

    The function would be best served by allowing input to include (partial) display name, specific reg value (quietuninstallstring here). This method also generated the Uninstall command for me so that I didn’t need to know switches. I put this into a function which I used in both preinstall and uninstall state. Also expanded it a little more to include logging…it’s much more effective now.

  • Jim
    Participant
    Post count: 43

    The get-installedapplication does support partial display names. It supports name, exact and even wildcard. You could submit a feature request to have QuietUninstall added to the list of values it finds or even just add it yourself- QuietUninstallString = $regKeyApp.QuietUninstallString. I think I’m going to do that. Thanks for the idea. My way above got the default uninstall parameters, I just manually added the /quiet /norestart since I wasn’t pulling the QuietUninstall key and didn’t have all the parameters. But it did have the /uninstall. So it looks like both of our methods get the job done, just in different ways.

You must be logged in to reply to this topic.