Uninstall ALL Ms Visio versions

//Uninstall ALL Ms Visio versions
Uninstall ALL Ms Visio versions 2016-08-05T11:11:51+00:00

The Toolkit Forums Deployment Scripts Uninstall ALL Ms Visio versions

  • Author
    Posts
  • Aldin
    Participant
    Post count: 12
    #1496 |

    This script will check wheter any version of MS Visio is installed and uninstall it.
    It doesn’t require any Setup or source files as it will check the Uninstall string and use that one to uninstall.
    For unattended silent uninstalls, an XML file will be created in the Temp folder depending on the installed version of Visio and will be used for the uninstall.

    I have tested this script with following installed products and it worked every time without any issues:
    Microsoft Office Visio Standard 2003
    Microsoft Office Visio Professional 2003
    Microsoft Office Visio Standard 2007
    Microsoft Office Visio Professional 2007
    Microsoft Visio Standard 2010
    Microsoft Visio Professional 2010
    Microsoft Visio Premium 2010
    Microsoft Visio Standard 2013
    Microsoft Visio Professional 2013
    Microsoft Visio Standard 2016
    Microsoft Visio Professional 2016

    I will not post the script here because this forum will screw with the formatting;
    You can find the script here:
    https://drive.google.com/file/d/0B1RmM7netsG3U0pfQmszSFVIOXc/view?usp=sharing

    ————
    For your reference, the Product ID’s for the different Visio versions that have to be used in the XML are:
    VisPro
    Visio Professional 2007
    Visio Professional 2013
    Visio Professional 2016

    VisStd
    Visio Standard 2007
    Visio Standard 2013
    Visio Standard 2016

    Visio
    All Visio 2010

  • Rob
    Participant
    Post count: 3

    Perfect, you’re a lifesaver;)

    How do I change the script to use it foor Project? I changed all the visio and vis text into project and proj but it doesn’t work… Powershell windows stops…

    And how do I implement the script to do this for 200 computers?

  • Aldin
    Participant
    Post count: 12

    Well I actually happen to have an uninstall script for all Ms Project versions from 2003 until 2013.
    We didn’t have 2016 back then, but it shouldn’t be that hard to append to the script.

    I’ve successfully uninstalled approx. 350 Microsoft Projects.
    For your information, there are other ways to accomplish this as well. Like for instance using the Offscrub.vbs files (which I use for my Office upgrades).
    But I seriously had a 100% success rate with my script which basically does a clean uninstall like you would do manually.

    To answer your question…
    Project 2003 and Project 2007 (all versions) have a Product Code that can be used with msiexec to uninstall it.
    So what I did is get the Product Code like this:
    $ProjPro2003 = (Get-InstalledApplication -Name “Microsoft Office Project Professional 2003”).ProductCode
    $ProjStd2003 = (Get-InstalledApplication -Name “Microsoft Office Project Standard 2003”).ProductCode
    $ProjPro2007 = (Get-InstalledApplication -Name “Microsoft Office Project Professional 2007”).ProductCode
    $ProjStd2007 = (Get-InstalledApplication -Name “Microsoft Office Project Standard 2007”).ProductCode

    Then with some if statements (if installed) uninstalled it with:
    Execute-MSI -Action ‘Uninstall’ -Path $ProductKey

    For Project 2010 and Project 2013 I userd the XML files like for Visio.
    Procuct Code for Microsoft Project Standard 2010 and 2013: ProjStd
    Procuct Code for Microsoft Project Professional 2010 and 2013: ProjPro

  • Aldin
    Participant
    Post count: 12

    If you can’t figure it out i can share my script.
    I hate doing it on this forum because it messes the script up.

  • Rob
    Participant
    Post count: 3

    We have this version:
    IdentifyingNumber : {90150000-003B-0000-0000-0000000FF1CE}
    Name : Microsoft Project Professional 2013
    Vendor : Microsoft Corporation
    Version : 15.0.4569.1506
    Caption : Microsoft Project Professional 2013

    From registry:
    MsiExec.exe /X{90150000-003B-0000-0000-0000000FF1CE}

    Changed the script.
    $PrjPro2013 = Get-InstalledApplication -Name “Microsoft Project Professional 2013” -Exact | where {$_.UninstallSubkey -eq “Office15.ProjPRO”}

    It starts and finds Project, no .xml creation…

    Last results:
    [12-21-2016 08:25:19.465] [Pre-Uninstallation] [Get-InstalledApplication] :: Found installed application [Microsoft Project Professional 2013] version [15.0.4569.1506] using exact name matching for search term [Microsoft Project Professional 2013].
    [12-21-2016 08:25:19.490] [Pre-Uninstallation] [Get-InstalledApplication] :: Found installed application [Microsoft Project Professional 2013] version [15.0.4569.1506] using exact name matching for search term [Microsoft Project Professional 2013].
    [12-21-2016 08:25:19.549] [Post-Uninstallation] [Exit-Script] :: Microsoft Project Uninstall Uninstallation completed with exit code [0].
    [12-21-2016 08:25:19.553] [Post-Uninstallation] [Exit-Script] :: ——————————————————————

  • Aldin
    Participant
    Post count: 12

    Yeah that should work as well I guess.
    Best practice is still using setup.exe and the config.xml files
    https://technet.microsoft.com/nl-nl/library/cc178956.aspx#BKMK_uninstall

    • This reply was modified 11 months, 1 week ago by  Aldin.
  • Aldin
    Participant
    Post count: 12

    Here is the complete script…
    As I’ve said. I had a 100% success rate. I’ve uninstalled Project on all targeted machines.

    <#
    .SYNOPSIS
    This script performs the installation or uninstallation of an application(s).
    .DESCRIPTION
    The script is provided as a template to perform an install or uninstall of an application(s).
    The script either performs an “Install” deployment type or an “Uninstall” deployment type.
    The install deployment type is broken down into 3 main sections/phases: Pre-Install, Install, and Post-Install.
    The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application.
    .PARAMETER DeploymentType
    The type of deployment to perform. Default is: Install.
    .PARAMETER DeployMode
    Specifies whether the installation should be run in Interactive, Silent, or NonInteractive mode. Default is: Interactive. Options: Interactive = Shows dialogs, Silent = No dialogs, NonInteractive = Very silent, i.e. no blocking apps. NonInteractive mode is automatically set if it is detected that the process is not user interactive.
    .PARAMETER AllowRebootPassThru
    Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered.
    .PARAMETER TerminalServerMode
    Changes to “user install mode” and back to “user execute mode” for installing/uninstalling applications for Remote Destkop Session Hosts/Citrix servers.
    .PARAMETER DisableLogging
    Disables logging to file for the script. Default is: $false.
    .EXAMPLE
    powershell.exe -Command “& { & ‘.\Deploy-Application.ps1’ -DeployMode ‘Silent’; Exit $LastExitCode }”
    .EXAMPLE
    powershell.exe -Command “& { & ‘.\Deploy-Application.ps1’ -AllowRebootPassThru; Exit $LastExitCode }”
    .EXAMPLE
    powershell.exe -Command “& { & ‘.\Deploy-Application.ps1’ -DeploymentType ‘Uninstall’; Exit $LastExitCode }”
    .EXAMPLE
    Deploy-Application.exe -DeploymentType “Install” -DeployMode “Silent”
    .NOTES
    Toolkit Exit Code Ranges:
    60000 – 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1
    69000 – 69999: Recommended for user customized exit codes in Deploy-Application.ps1
    70000 – 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1
    .LINK

    The Toolkit


    #>
    [CmdletBinding()]
    Param (
    [Parameter(Mandatory=$false)]
    [ValidateSet(‘Install’,’Uninstall’)]
    [string]$DeploymentType = ‘Install’,
    [Parameter(Mandatory=$false)]
    [ValidateSet(‘Interactive’,’Silent’,’NonInteractive’)]
    [string]$DeployMode = ‘Interactive’,
    [Parameter(Mandatory=$false)]
    [switch]$AllowRebootPassThru = $false,
    [Parameter(Mandatory=$false)]
    [switch]$TerminalServerMode = $false,
    [Parameter(Mandatory=$false)]
    [switch]$DisableLogging = $false
    )

    Try {
    ## Set the script execution policy for this process
    Try { Set-ExecutionPolicy -ExecutionPolicy ‘ByPass’ -Scope ‘Process’ -Force -ErrorAction ‘Stop’ } Catch {}

    ##*===============================================
    ##* VARIABLE DECLARATION
    ##*===============================================
    ## Variables: Application
    [string]$appVendor = ‘Microsoft’
    [string]$appName = ‘Project’
    [string]$appVersion = ‘[ALL]’
    [string]$appArch = ”
    [string]$appLang = ‘EN’
    [string]$appRevision = ’01’
    [string]$appScriptVersion = ‘1.0.0’
    [string]$appScriptDate = ’30/05/2016′
    [string]$appScriptAuthor = ‘Aldin T.’
    ##*===============================================
    ## Variables: Install Titles (Only set here to override defaults set by the toolkit)
    [string]$installName = ‘Microsoft Project Uninstall’
    [string]$installTitle = ‘Microsoft Project Uninstall’

    ##* Do not modify section below
    #region DoNotModify

    ## Variables: Exit Code
    [int32]$mainExitCode = 0

    ## Variables: Script
    [string]$deployAppScriptFriendlyName = ‘Deploy Application’
    [version]$deployAppScriptVersion = [version]’3.6.8′
    [string]$deployAppScriptDate = ’02/06/2016′
    [hashtable]$deployAppScriptParameters = $psBoundParameters

    ## Variables: Environment
    If (Test-Path -LiteralPath ‘variable:HostInvocation’) { $InvocationInfo = $HostInvocation } Else { $InvocationInfo = $MyInvocation }
    [string]$scriptDirectory = Split-Path -Path $InvocationInfo.MyCommand.Definition -Parent

    ## Dot source the required App Deploy Toolkit Functions
    Try {
    [string]$moduleAppDeployToolkitMain = “$scriptDirectory\AppDeployToolkit\AppDeployToolkitMain.ps1”
    If (-not (Test-Path -LiteralPath $moduleAppDeployToolkitMain -PathType ‘Leaf’)) { Throw “Module does not exist at the specified location [$moduleAppDeployToolkitMain].” }
    If ($DisableLogging) { . $moduleAppDeployToolkitMain -DisableLogging } Else { . $moduleAppDeployToolkitMain }
    }
    Catch {
    If ($mainExitCode -eq 0){ [int32]$mainExitCode = 60008 }
    Write-Error -Message “Module [$moduleAppDeployToolkitMain] failed to load: n$($_.Exception.Message)n `n$($_.InvocationInfo.PositionMessage)” -ErrorAction ‘Continue’
    ## Exit the script, returning the exit code to SCCM
    If (Test-Path -LiteralPath ‘variable:HostInvocation’) { $script:ExitCode = $mainExitCode; Exit } Else { Exit $mainExitCode }
    }

    #endregion
    ##* Do not modify section above
    ##*===============================================
    ##* END VARIABLE DECLARATION
    ##*===============================================

    If ($deploymentType -ine ‘Uninstall’) {
    ##*===============================================
    ##* PRE-INSTALLATION
    ##*===============================================
    [string]$installPhase = ‘Pre-Installation’

    ## Show Progress Message (with the default message)
    Show-InstallationProgress

    ##*===============================================
    ##* INSTALLATION
    ##*===============================================
    [string]$installPhase = ‘Installation’

    ## Handle Zero-Config MSI Installations
    If ($useDefaultMsi) {
    [hashtable]$ExecuteDefaultMSISplat = @{ Action = ‘Install’; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add(‘Transform’, $defaultMstFile) }
    Execute-MSI @ExecuteDefaultMSISplat; If ($defaultMspFiles) { $defaultMspFiles | ForEach-Object { Execute-MSI -Action ‘Patch’ -Path $_ } }
    }

    ##*===============================================
    ##* POST-INSTALLATION
    ##*===============================================
    [string]$installPhase = ‘Post-Installation’

    ## Display a message at the end of the install
    If (-not $useDefaultMsi) { Show-InstallationPrompt -Message ‘You can customize text to appear at the end of an install or remove it completely for unattended installations.’ -ButtonRightText ‘OK’ -Icon Information -NoWait }
    }
    ElseIf ($deploymentType -ieq ‘Uninstall’)
    {
    ##*===============================================
    ##* PRE-UNINSTALLATION
    ##*===============================================
    [string]$installPhase = ‘Pre-Uninstallation’

    ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing
    Show-InstallationWelcome -CloseApps ‘WINPROJ’ -Silent

    #Check installed version
    $ProjPro2003 = (Get-InstalledApplication -Name “Microsoft Office Project Professional 2003”).ProductCode
    $ProjStd2003 = (Get-InstalledApplication -Name “Microsoft Office Project Standard 2003”).ProductCode
    $ProjPro2007 = (Get-InstalledApplication -Name “Microsoft Office Project Professional 2007”).ProductCode
    $ProjStd2007 = (Get-InstalledApplication -Name “Microsoft Office Project Standard 2007”).ProductCode

    $ProjStd2010 = Get-InstalledApplication -Name “Microsoft Project Standard 2010” -Exact
    $ProjPro2010 = Get-InstalledApplication -Name “Microsoft Project Professional 2010” -Exact
    $ProjStd2013 = Get-InstalledApplication -Name “Microsoft Project Standard 2013” -Exact
    $ProjPro2013 = Get-InstalledApplication -Name “Microsoft Project Professional 2013” -Exact

    #Create XML file depending on installed version
    If ($ProjStd2013 -or $ProjStd2010) {

    #Create XML file for Project Standard:
    New-Item -Path “$env:TEMP\” -Name ProjSilentUninstallConfig.xml -ItemType “file” -Force -Value `
    ‘<Configuration Product=”PrjStd”>
    <Logging Type=”standard” Path=”C:\LogFiles” Template=”Microsoft Office Project Uninstal.txt” />
    <Display Level=”none” CompletionNotice=”no” SuppressModal=”yes” AcceptEula=”yes” />
    <Setting Id=”SETUP_REBOOT” Value=”NEVER” />
    </Configuration>

    }

    If ($ProjPro2013 -or $ProjPro2010) {

    #Create XML file for Project Professional:
    New-Item -Path “$env:TEMP\” -Name ProjSilentUninstallConfig.xml -ItemType “file” -Force -Value `
    ‘<Configuration Product=”PrjPro”>
    <Logging Type=”standard” Path=”C:\LogFiles” Template=”Microsoft Office Project Uninstal.txt” />
    <Display Level=”none” CompletionNotice=”no” SuppressModal=”yes” AcceptEula=”yes” />
    <Setting Id=”SETUP_REBOOT” Value=”NEVER” />
    </Configuration>

    }

    $ConfigXML = ‘”‘ + “$env:TEMP” + “\ProjSilentUninstallConfig.xml” + ‘”‘

    ##*===============================================
    ##* UNINSTALLATION
    ##*===============================================
    [string]$installPhase = ‘Uninstallation’

    ## Handle Zero-Config MSI Uninstallations
    If ($useDefaultMsi) {
    [hashtable]$ExecuteDefaultMSISplat = @{ Action = ‘Uninstall’; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add(‘Transform’, $defaultMstFile) }
    Execute-MSI @ExecuteDefaultMSISplat
    }

    #Project 2003
    If ($ProjPro2003){
    $PrKey = $ProjPro2003.trim()
    Execute-MSI -Action ‘Uninstall’ -Path $PrKey
    }
    If ($ProjStd2003){
    $PrKey = $ProjStd2003.trim()
    Execute-MSI -Action ‘Uninstall’ -Path $PrKey
    }

    #Project 2007
    If ($ProjPro2007){
    $PrKey = $ProjPro2007.trim()
    Execute-MSI -Action ‘Uninstall’ -Path $PrKey
    }
    If ($ProjStd2007){
    $PrKey = $ProjStd2007.trim()
    Execute-MSI -Action ‘Uninstall’ -Path $PrKey
    }

    #Project 2010
    If ($ProjStd2010 -ne $Null){
    $TestSetupPath = Test-Path -Path “C:\Program Files\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe”
    If ($TestSetupPath -eq $True) {
    Execute-Process -Path ‘C:\Program Files\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe’ -Parameters “/uninstall PrjStd /config $ConfigXML”
    } else {
    Execute-Process -Path ‘C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe’ -Parameters “/uninstall PrjStd /config $ConfigXML”
    }
    }

    If ($ProjPro2010 -ne $Null){
    $TestSetupPath = Test-Path -Path “C:\Program Files\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe”
    If ($TestSetupPath -eq $True) {
    Execute-Process -Path ‘C:\Program Files\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe’ -Parameters “/uninstall PrjPro /config $ConfigXML”
    } else {
    Execute-Process -Path ‘C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe’ -Parameters “/uninstall PrjPro /config $ConfigXML”
    }
    }

    #Project 2013
    If ($ProjStd2013 -ne $Null){
    $TestSetupPath = Test-Path -Path “C:\Program Files\Common Files\Microsoft Shared\OFFICE15\Office Setup Controller\setup.exe”
    If ($TestSetupPath -eq $True) {
    Execute-Process -Path ‘C:\Program Files\Common Files\Microsoft Shared\OFFICE15\Office Setup Controller\setup.exe’ -Parameters “/uninstall PrjStd /config $ConfigXML”
    } else {
    Execute-Process -Path ‘C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE15\Office Setup Controller\setup.exe’ -Parameters “/uninstall PrjStd /config $ConfigXML”
    }
    }

    If ($ProjPro2013 -ne $Null){
    $TestSetupPath = Test-Path -Path “C:\Program Files\Common Files\Microsoft Shared\OFFICE15\Office Setup Controller\setup.exe”
    If ($TestSetupPath -eq $True) {
    Execute-Process -Path ‘C:\Program Files\Common Files\Microsoft Shared\OFFICE15\Office Setup Controller\setup.exe’ -Parameters “/uninstall PrjPro /config $ConfigXML”
    } else {
    Execute-Process -Path ‘C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE15\Office Setup Controller\setup.exe’ -Parameters “/uninstall PrjPro /config $ConfigXML”
    }
    }

    ##*===============================================
    ##* POST-UNINSTALLATION
    ##*===============================================
    [string]$installPhase = ‘Post-Uninstallation’

    #cleanup temp files for good housekeeping
    Remove-File -Path $ConfigXML
    }

    ##*===============================================
    ##* END SCRIPT BODY
    ##*===============================================

    ## Call the Exit-Script function to perform final cleanup operations
    Exit-Script -ExitCode $mainExitCode
    }
    Catch {
    [int32]$mainExitCode = 60001
    [string]$mainErrorMessage = “$(Resolve-Error)”
    Write-Log -Message $mainErrorMessage -Severity 3 -Source $deployAppScriptFriendlyName
    Show-DialogBox -Text $mainErrorMessage -Icon ‘Stop’
    Exit-Script -ExitCode $mainExitCode
    }

  • Rob
    Participant
    Post count: 3

    Runned the script.
    It went a little further than mine.
    .XML file is created
    .LOG is created

    [12-21-2016 12:47:20.126] [Pre-Uninstallation] [Get-InstalledApplication] :: Found installed application [Microsoft Project Profess
    ional 2013] version [15.0.4569.1506] using exact name matching for search term [Microsoft Project Professional 2013].
    [12-21-2016 12:47:20.141] [Pre-Uninstallation] [Get-InstalledApplication] :: Found installed application [Microsoft Project Profess
    ional 2013] version [15.0.4569.1506] using exact name matching for search term [Microsoft Project Professional 2013].

    Directory: C:\Users\adminuser\AppData\Local\Temp

    Mode LastWriteTime Length Name
    —- ————- —— —-
    -a—- 21-12-2016 12:47 323 ProjSilentUninstallConfig.xml
    [12-21-2016 12:47:20.242] [Uninstallation] [Execute-Process] :: [C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE15\Offi
    ce Setup Controller\setup.exe] is a valid fully qualified path, continue.
    [12-21-2016 12:47:20.312] [Uninstallation] [Execute-Process] :: Working Directory is [C:\Program Files (x86)\Common Files\Microsoft
    Shared\OFFICE15\Office Setup Controller].
    [12-21-2016 12:47:20.317] [Uninstallation] [Execute-Process] :: Executing [C:\Program Files (x86)\Common Files\Microsoft Shared\OFF
    ICE15\Office Setup Controller\setup.exe /uninstall PrjPro /config ”C:\Users\adminuser\AppData\Local\Temp\ProjSilentUninstallConfig.x
    ml”]…

    Setup.exe is started on remote PC. Than it hangs on something….

  • Brian
    Participant
    Post count: 1

    This doesn’t seem to be working for visio 2016 … the log file shows it as uninstalled, but it isn’t actually uninstalling. Am I missing something?

    • Aldin
      Participant
      Post count: 12

      Strange.
      I remember testing it with “Microsoft Visio Standard 2016” and “Microsoft Visio Professional 2016” back then.
      It worked without problems.

      Does it work when you run the uninstall string from CMD manually?

      I suggest you do the following to troubleshoot:
      In Powershell ISE Open
      \AppDeployToolkit\AppDeployToolkitMain.ps1
      Deploy-Application.ps1

      Run AppDeployToolkitMain.ps1 from within ISE in order to load all functions, like it would if deployed via SCCM.
      That way you can use all the cmdlets and functions from the toolkit.

      I typed a lot more steps but this freaking forum doesn’t let me post it. It says it’s forbidden.
      Probably because I included some cmdlets

  • Raymund
    Participant
    Post count: 2

    Hi Aldin, I’m having some problems recreating the Project uninstaller is there any way you can share it like you did the Visio, cause I’m getting that it access the config.xml file and I’ve changed locations and still doesn’t help. Also, having some issues with the Visio for 2016 it works for 2013 but get Error Record: Message: You cannot call a method on a null-valued expression.
    InnerException:
    FullyQualifiedErrorId: InvokeMethodOnNull
    PositionMessage: At C:\Windows\ccmcache\g\Deploy-Application.ps1:305
    char:75
    + $params+((VisPro2016.UninstallString -split (“”))[2]).trim <<<< 0 + ” /config $ConfigXML_Pro”

    Any help would be greatly appreciative.

    • Aldin
      Participant
      Post count: 12

      Here is the link for MS Projct: https://drive.google.com/open?id=1u0hXcYepvD6qxcazyDkJ3CBj7iU4yWmL
      It’s only until Project 2013 as we didn’t have 2016 back then.

      As for that error you’re getting for Visio.
      The error basically means: You are trying to do something (method) with a value, but the value doesn’t exist.
      The method in that error is .trim
      Basically, this part is blank, so you can’t trim it: (VisPro2016.UninstallString -split (“”))

      did you change line 305?
      It should be this:
      $params = (($VisPro2016.UninstallString -split ('"'))[2]).trim() + " /config $ConfigXML_Pro"

      In order to troubleshoot this, do the following:
      1. Open Powershell ISE as admin
      2. Open file: \AppDeployToolkit\AppDeployToolkitMain.ps1
      3. Run that file. This will load all functions from PsADT
      4. Open Deploy-Application.ps1 and troubleshot step by step

      In your case, execute line 175, which is this:
      $VisPro2016 = Get-InstalledApplication -Name "Microsoft Visio Professional 2016" -Exact | where {$_.UninstallSubkey -eq "Office16.VISPRO"}

      See if that returns any value because this is where it goes wrong.

  • Raymund
    Participant
    Post count: 2

    Thank you, I will start working on this and let you know how it turns out.

You must be logged in to reply to this topic.