-
Star
(125)
You must be signed in to star a gist -
Fork
(30)
You must be signed in to fork a gist
-
-
Save broestls/f872872a00acee2fca02017160840624 to your computer and use it in GitHub Desktop.
| # This script will manually rip out all VMware Tools registry entries and files for Windows 2008-2019 | |
| # Tested for 2019, 2016, and probably works on 2012 R2 after the 2016 fixes. | |
| # This function pulls out the common ID used for most of the VMware registry entries along with the ID | |
| # associated with the MSI for VMware Tools. | |
| function Get-VMwareToolsInstallerID { | |
| foreach ($item in $(Get-ChildItem Registry::HKEY_CLASSES_ROOT\Installer\Products)) { | |
| If ($item.GetValue('ProductName') -eq 'VMware Tools') { | |
| return @{ | |
| reg_id = $item.PSChildName; | |
| msi_id = [Regex]::Match($item.GetValue('ProductIcon'), '(?<={)(.*?)(?=})') | Select-Object -ExpandProperty Value | |
| } | |
| } | |
| } | |
| } | |
| $vmware_tools_ids = Get-VMwareToolsInstallerID | |
| # Targets we can hit with the common registry ID from $vmware_tools_ids.reg_id | |
| $reg_targets = @( | |
| "Registry::HKEY_CLASSES_ROOT\Installer\Features\", | |
| "Registry::HKEY_CLASSES_ROOT\Installer\Products\", | |
| "HKLM:\SOFTWARE\Classes\Installer\Features\", | |
| "HKLM:\SOFTWARE\Classes\Installer\Products\", | |
| "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\" | |
| ) | |
| $VMware_Tools_Directory = "C:\Program Files\VMware" | |
| $VMware_Common_Directory = "C:\Program Files\Common Files\VMware" | |
| # Create an empty array to hold all the uninstallation targets and compose the entries into the target array | |
| $targets = @() | |
| If ($vmware_tools_ids) { | |
| foreach ($item in $reg_targets) { | |
| $targets += $item + $vmware_tools_ids.reg_id | |
| } | |
| # Add the MSI installer ID regkey | |
| $targets += "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{$($vmware_tools_ids.msi_id)}" | |
| } | |
| # This is a bit of a shotgun approach, but if we are at a version less than 2016, add the Uninstaller entries we don't | |
| # try to automatically determine. | |
| If ([Environment]::OSVersion.Version.Major -lt 10) { | |
| $targets += "HKCR:\CLSID\{D86ADE52-C4D9-4B98-AA0D-9B0C7F1EBBC8}" | |
| $targets += "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9709436B-5A41-4946-8BE7-2AA433CAF108}" | |
| $targets += "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{FE2F6A2C-196E-4210-9C04-2B1BC21F07EF}" | |
| } | |
| # Add the VMware, Inc regkey | |
| If (Test-Path "HKLM:\SOFTWARE\VMware, Inc.") { | |
| $targets += "HKLM:\SOFTWARE\VMware, Inc." | |
| } | |
| # Add the VMware Tools directory | |
| If(Test-Path $VMware_Tools_Directory) { | |
| $targets += $VMware_Tools_Directory | |
| } | |
| # Thanks to @Gadgetgeek2000 for pointing out that the script leaves some 500mb of extra artifacts on disk. | |
| # This blob removes those. | |
| If(Test-Path $VMware_Common_Directory) { | |
| $targets += $VMware_Common_Directory | |
| } | |
| # Create a list of services to stop and remove | |
| $services = Get-Service -DisplayName "VMware*" | |
| $services += Get-Service -DisplayName "GISvc" | |
| # Warn the user about what is about to happen | |
| # Takes only y for an answer, bails otherwise. | |
| Write-Host "The following registry keys, filesystem folders, and services will be deleted:" | |
| If (!$targets -and !$services ) { | |
| Write-Host "Nothing to do!" | |
| } | |
| Else { | |
| $targets | |
| $services | |
| $user_confirmed = Read-Host "Continue (y/n)" | |
| If ($user_confirmed -eq "y") { | |
| # Stop all running VMware Services | |
| $services | Stop-Service -Confirm:$false | |
| # Cover for Remove-Service not existing in PowerShell versions < 6.0 | |
| If (Get-Command Remove-Service -errorAction SilentlyContinue) { | |
| $services | Remove-Service -Confirm:$false | |
| } | |
| Else { | |
| foreach ($s in $services) { | |
| sc.exe DELETE $($s.Name) | |
| } | |
| } | |
| # Remove all the files that are listed in $targets | |
| foreach ($item in $targets) { | |
| If(Test-Path $item) { | |
| Remove-Item -Path $item -Recurse | |
| } | |
| } | |
| Write-Host "Done. Reboot to complete removal." | |
| } | |
| Else { | |
| Write-Host "Failed to get user confirmation" | |
| } | |
| } |
@Jason-Clark-FG THANK YOU SO MUCH! Really appreciate that script! Super helpful for my migrations!
Glad to hear it @EPiSKiNG, it's been super helpful for us too. I just streamlined a few things I found in various places. Standing on the shoulders of giants as they say :-)
@Jason-Clark-FG Thank's, your script works fine (moving to HPE VME Essentials) on Windows Server 2025 (no VM* Service, no C:\ProgramData\VMware Folder, in the registry there are still some entries containing "VMware" e, g. in Classes which point to C:\Program Files\VMware\VMware Tools und C:\Program Files\Common Files\VMware - but I don't think these will cause a Problem in the future). The only VMware I find on the system partition is in C:\Windows\SoftwareDistribution\Download (which is the Cache for the Update service, so I see no problem with this)
Thanks @pirklb, so is there anything you think we should add to the script? We currently do not have an Windows Server 2025 deployed, so I cannot take a look around in one.
Hello @Jason-Clark-FG - I think it is fine (we are currently in a poc to see, if we can switch from VMware to HPE VME. And for the poc it works "well". If we decide to move - and have to migrate more VMs - maybe I'll find some improvements for the script. If so, I will share it.
I've tried making both of the modifications to the MSI suggested in the script (removed VM_LogStart and VM_CheckRequirements from CustomAction table), but the uninstallation fails (msiexec crash in Application event log). This worked on the previous version of VMware Tools we were using (12.5.2), but no longer works on a newer version (12.5.4). Is this method no longer viable? If so, happy to rely on the script you've provided, but it would be nice if the uninstall process worked as well. Any advice appreciated, thank you.
I've tried making both of the modifications to the MSI suggested in the script (removed VM_LogStart and VM_CheckRequirements from CustomAction table), but the uninstallation fails (msiexec crash in Application event log). This worked on the previous version of VMware Tools we were using (12.5.2), but no longer works on a newer version (12.5.4). Is this method no longer viable? If so, happy to rely on the script you've provided, but it would be nice if the uninstall process worked as well. Any advice appreciated, thank you.
I can only suggest that you post the details of the crash from the event log as well as running the uninstall through msiexec with verbose logging output to see where and why it crashes.
Without that, I won't be able to help, I haven't had VMware for a while.
Thanks @mateuszdrab - I will do that.
Thanks @pirklb, so is there anything you think we should add to the script? We currently do not have an Windows Server 2025 deployed, so I cannot take a look around in one.