Sei già un cliente NinjaOne? Effettua il login per visualizzare le altre guide e gli ultimi aggiornamenti.

Script personalizzati: Rimuovere TeamViewer (Windows)

Argomento

Questo articolo spiega come utilizzare uno script personalizzato per rimuovere TeamViewer dagli endpoint di Microsoft Windows.

Per gli endpoint macOS, consultare il nostro sito Custom Scripts: Rimuovere TeamViewer (macOS) articolo.

Ambiente

Gestione degli endpoint NinjaOne

Descrizione

Se è necessario rimuovere le istanze di TeamViewer dai propri endpoint, lo script Rimuovi TeamViewer può semplificare il processo.

Potete importarlo dalla nostra Libreria dei modelli o caricare la versione allegata a questo articolo nella vostra Libreria di automazione in formato PowerShell. Quindi, è possibile eseguirlo sui dispositivi utilizzando un'automazione pianificata, un'attività pianificata o ad hoc dal pulsante di riproduzione nella pagina del dispositivo o nella scheda Dispositivi.

Script

#Requires -Version 5.1

<#
.SYNOPSIS
    Uninstalls TeamViewer.
.DESCRIPTION
    Uninstalls TeamViewer.

.EXAMPLE
    (No parameters)

    Verifying that TeamViewer is still installed.
    Removing TeamViewer using 'C:Program Files (x86)TeamVieweruninstall.exe /S'.
    Verifying that TeamViewer has been removed.
    TeamViewer has been successfully removed.

.NOTES
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    Version: 1.0
    Release Notes: Initial Release
#>

[CmdletBinding()]
param ()

begin {

    function Find-InstallKey {
        [CmdletBinding()]
        param (
            [Parameter(ValueFromPipeline = $True)]
            [String]$DisplayName,
            [Parameter()]
            [Switch]$UninstallString,
            [Parameter()]
            [String]$UserBaseKey
        )
        process {
            # Initialize a list to store found installation keys
            $InstallList = New-Object System.Collections.Generic.List[Object]

            # If no custom user base key is provided, search in the standard HKLM paths
            if (!$UserBaseKey) {
                # Search in the 32-bit uninstall registry key and add results to the list
                try {
                    $Result = Get-ChildItem -Path "Registry::HKEY_LOCAL_MACHINESoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*" | Get-ItemProperty | Where-Object { $_.DisplayName -like "*$DisplayName*" }
                    if ($Result) { $InstallList.Add($Result) }
                } catch {
                    Write-Host -Object "[Warning] Failed to retrieve registry keys at 'HKEY_LOCAL_MACHINESoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*'."
                    throw $_
                }

                # Search in the 64-bit uninstall registry key and add results to the list
                try {
                    $Result = Get-ChildItem -Path "Registry::HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionUninstall*" | Get-ItemProperty | Where-Object { $_.DisplayName -like "*$DisplayName*" }
                    if ($Result) { $InstallList.Add($Result) }
                } catch {
                    Write-Host -Object "[Warning] Failed to retrieve registry keys at 'HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionUninstall*'."
                    throw $_
                }
            } else {
                # If a custom user base key is provided, search in the corresponding Wow6432Node path and add results to the list
                try {
                    $Result = Get-ChildItem -Path "$UserBaseKeySoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*" | Get-ItemProperty | Where-Object { $_.DisplayName -like "*$DisplayName*" }
                    if ($Result) { $InstallList.Add($Result) }
                } catch {
                    Write-Host -Object "[Warning] Failed to retrieve registry keys at '$UserBaseKeySoftwareWow6432NodeMicrosoftWindowsCurrentVersionUninstall*'."
                    throw $_
                }

                try {
                    # Search in the custom user base key for the standard uninstall path and add results to the list
                    $Result = Get-ChildItem -Path "$UserBaseKeySoftwareMicrosoftWindowsCurrentVersionUninstall*" | Get-ItemProperty | Where-Object { $_.DisplayName -like "*$DisplayName*" }
                    if ($Result) { $InstallList.Add($Result) }
                } catch {
                    Write-Host -Object "[Warning] Failed to retrieve registry keys at '$UserBaseKeySoftwareMicrosoftWindowsCurrentVersionUninstall*'."
                    throw $_
                }
            }

            # If the UninstallString switch is set, return only the UninstallString property of the found keys
            if ($UninstallString) {
                $InstallList | Select-Object -ExpandProperty UninstallString -ErrorAction SilentlyContinue
            } else {
                $InstallList
            }
        }
    }
    function Test-IsElevated {
        [CmdletBinding()]
        param ()

        # Get the current Windows identity of the user running the script
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()

        # Create a WindowsPrincipal object based on the current identity
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)

        # Check if the current user is in the Administrator role
        # The function returns $True if the user has administrative privileges, $False otherwise
        # 544 is the value for the Built In Administrators role
        # Reference: https://learn.microsoft.com/en-us/dotnet/api/system.security.principal.windowsbuiltinrole
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]'544')
    }

    function Wait-ForTeamViewer {
        [CmdletBinding()]
        param()

        $Start = Get-Date
        $Timeout = [TimeSpan]::FromMinutes(5)

        if (Get-Process -Name "TeamViewer", "TeamViewer_Service", "Un_A", "Un_B" -ErrorAction SilentlyContinue) {
            Write-Host -Object "Waiting for the TeamViewer process to stop."
        }

        while (Get-Process -Name "TeamViewer", "TeamViewer_Service", "Un_A", "Un_B" -ErrorAction SilentlyContinue) {
            if (((Get-Date) - $Start) -ge $Timeout) {
                Write-Host -Object "[Warning] The five minute timeout has been reached."
                break
            }

            Start-Sleep -Milliseconds 100
        }
    }

    if (!$ExitCode) {
        $ExitCode = 0
    }
}
process {
    # Attempt to determine if the current session is running with Administrator privileges.
    try {
        $IsElevated = Test-IsElevated -ErrorAction Stop
    } catch {
        # Output error if unable to determine elevation status
        Write-Host -Object "[Error] $($_.Exception.Message)"
        Write-Host -Object "[Error] Unable to determine if the account '$env:Username' is running with Administrator privileges."
        exit 1
    }

    # Exit if not running as administrator
    if (!$IsElevated) {
        Write-Host -Object "[Error] Access Denied: Please run with Administrator privileges."
        exit 1
    }

    # Check if TeamViewer is still installed by searching uninstall registry keys
    Write-Host -Object "Verifying that TeamViewer is still installed."
    try {
        $TeamViewerInstalls = Find-InstallKey -DisplayName "TeamViewer" -UninstallString -ErrorAction Stop
    } catch {
        # Output error if unable to verify installation
        Write-Host -Object "[Error] $($_.Exception.Message)"
        Write-Host -Object "[Error] Failed to verify whether TeamViewer is still installed."
        exit 1
    }

    # Check for TeamViewer uninstaller in Program Files (x86)
    if (Test-Path -Path "${env:ProgramFiles(x86)}TeamVieweruninstall.exe" -PathType Leaf -ErrorAction SilentlyContinue) {
        $TeamViewerUninstallerFound = $True
    }

    # Check for TeamViewer uninstaller in Program Files
    if (Test-Path -Path "${env:ProgramFiles}TeamVieweruninstall.exe" -PathType Leaf -ErrorAction SilentlyContinue) {
        $TeamViewerUninstallerFound = $True
    }

    # Check if TeamViewer is currently running
    $TeamViewerRunning = Get-Process -Name "TeamViewer", "TeamViewer_Service" -ErrorAction SilentlyContinue

    # If neither registry nor uninstaller found, TeamViewer is already removed
    if (!$TeamViewerInstalls -and !$TeamViewerUninstallerFound) {
        if ($TeamViewerRunning) {
            Write-Host -Object "[Alert] The TeamViewer QuickSupport tool was detected. The QuickSupport tool is not installed on the system because it is a portable app."
        }
        Write-Host -Object "[Error] TeamViewer is not installed on this system."
        exit 1
    }

    # If TeamViewer was installed via MSI, uninstall using MsiExec
    if ($TeamViewerInstalls -match "MsiExec.exe /I") {
        $TeamViewerInstalls | ForEach-Object {
            # Prepare MSI uninstall arguments
            $MsiExecArguments = @(
                ($_ -replace "^MsiExec.exe " -replace "/I", "/x")
                "/qn"
                "/norestart"
            )

            try {
                Write-Host -Object "Removing TeamViewer using '$env:WINDIRSystem32MsiExec.exe $($MsiExecArguments -join " ")'."
                # Start MSI uninstall process
                $UninstallProcess = Start-Process -FilePath "$env:WINDIRSystem32MsiExec.exe" -ArgumentList $MsiExecArguments -NoNewWindow -Wait -PassThru -ErrorAction Stop
                if ($UninstallProcess.ExitCode -ne 0) {
                    Write-Host -Object "[Warning] The last exit code '$($UninstallProcess.ExitCode)' does not indicate success."
                }
            } catch {
                # Output error if MSI uninstall fails
                Write-Host -Object "[Error] Exit Code: $($UninstallProcess.ExitCode)"
                Write-Host -Object "[Error] $($_.Exception.Message)"
                Write-Host -Object "[Error] Failed to uninstall TeamViewer."
                $ExitCode = 1
            }

            try {
                # Wait for TeamViewer processes to exit
                Wait-ForTeamViewer -ErrorAction Stop
            } catch {
                Write-Host -Object "[Error] $($_.Exception.Message)"
                Write-Host -Object "[Error] Failed to wait for the TeamViewer uninstaller process to complete."
                $ExitCode = 1
            }
        }
    }

    # If TeamViewer was installed with the exe, run the uninstaller
    if ($TeamViewerInstalls -match "uninstall.exe") {
        $TeamViewerInstalls | ForEach-Object {
            # Extract the uninstall.exe path from the uninstall string
            $UninstallString = $_ -split '"([^"]+)"'
            $FilePath = $UninstallString | Where-Object { $_ -match "uninstall.exe" }

            # Prepare silent uninstall arguments
            $UninstallArguments = @(
                "/S"
            )

            try {
                Write-Host -Object "Removing TeamViewer using '$FilePath $($UninstallArguments -join " ")'."
                # Start uninstall process
                $UninstallProcess = Start-Process -FilePath $FilePath -ArgumentList $UninstallArguments -NoNewWindow -Wait -PassThru -ErrorAction Stop
                if ($UninstallProcess.ExitCode -ne 0) {
                    Write-Host -Object "[Warning] The last exit code '$($UninstallProcess.ExitCode)' does not indicate success."
                }
            } catch {
                # Output error if uninstall.exe fails
                Write-Host -Object "[Error] Exit Code: $($UninstallProcess.ExitCode)"
                Write-Host -Object "[Error] $($_.Exception.Message)"
                Write-Host -Object "[Error] Failed to uninstall TeamViewer."
                $ExitCode = 1
            }

            try {
                # Wait for TeamViewer processes to exit
                Wait-ForTeamViewer -ErrorAction Stop
            } catch {
                Write-Host -Object "[Error] $($_.Exception.Message)"
                Write-Host -Object "[Error] Failed to wait for the TeamViewer uninstaller process to complete."
                $ExitCode = 1
            }
        }
    }

    # Fallback: If uninstall.exe exists in Program Files (x86), run it directly
    if (Test-Path -Path "${env:ProgramFiles(x86)}TeamVieweruninstall.exe" -PathType Leaf -ErrorAction SilentlyContinue) {
        try {
            Write-Host -Object "Removing TeamViewer using '${env:ProgramFiles(x86)}TeamVieweruninstall.exe /S'."
            $UninstallProcess = Start-Process -FilePath "${env:ProgramFiles(x86)}TeamVieweruninstall.exe" -ArgumentList "/S" -NoNewWindow -PassThru -ErrorAction Stop
            if ($UninstallProcess.ExitCode -ne 0) {
                Write-Host -Object "[Warning] The last exit code '$($UninstallProcess.ExitCode)' does not indicate success."
            }
        } catch {
            # Output error if uninstall.exe fails
            Write-Host -Object "[Error] Exit Code: $($UninstallProcess.ExitCode)"
            Write-Host -Object "[Error] $($_.Exception.Message)"
            Write-Host -Object "[Error] Failed to uninstall TeamViewer."
            $ExitCode = 1
        }

        try {
            # Wait for TeamViewer processes to exit
            Wait-ForTeamViewer -ErrorAction Stop
        } catch {
            Write-Host -Object "[Error] $($_.Exception.Message)"
            Write-Host -Object "[Error] Failed to wait for the TeamViewer uninstaller process to complete."
            $ExitCode = 1
        }
    }

    # Fallback: If uninstall.exe exists in Program Files, run it directly
    if (Test-Path -Path "${env:ProgramFiles}TeamVieweruninstall.exe" -PathType Leaf -ErrorAction SilentlyContinue) {
        try {
            Write-Host -Object "Removing TeamViewer using '${env:ProgramFiles}TeamVieweruninstall.exe /S'."
            $UninstallProcess = Start-Process -FilePath "${env:ProgramFiles}TeamVieweruninstall.exe" -ArgumentList "/S" -NoNewWindow -PassThru -ErrorAction Stop
            if ($($UninstallProcess.ExitCode) -ne 0) {
                Write-Host -Object "[Warning] The last exit code '$($UninstallProcess.ExitCode)' does not indicate success."
            }
        } catch {
            # Output error if uninstall.exe fails
            Write-Host -Object "[Error] Exit Code: $($UninstallProcess.ExitCode)"
            Write-Host -Object "[Error] $($_.Exception.Message)"
            Write-Host -Object "[Error] Failed to uninstall TeamViewer."
            $ExitCode = 1
        }

        try {
            # Wait for TeamViewer processes to exit
            Wait-ForTeamViewer -ErrorAction Stop
        } catch {
            Write-Host -Object "[Error] $($_.Exception.Message)"
            Write-Host -Object "[Error] Failed to wait for the TeamViewer uninstaller process to complete."
            $ExitCode = 1
        }
    }

    # Final verification that TeamViewer has been removed
    Write-Host -Object "Verifying that TeamViewer has been removed."
    try {
        $TeamViewerInstalls = Find-InstallKey -DisplayName "TeamViewer" -UninstallString -ErrorAction Stop
    } catch {
        # Output error if unable to verify removal
        Write-Host -Object "[Error] $($_.Exception.Message)"
        Write-Host -Object "[Error] Failed to verify whether TeamViewer is still installed."
        exit 1
    }

    # Check again for uninstall.exe in both Program Files locations
    if (Test-Path -Path "${env:ProgramFiles(x86)}TeamVieweruninstall.exe" -PathType Leaf -ErrorAction SilentlyContinue) {
        $TeamViewerUninstallerFoundAgain = $True
    }

    if (Test-Path -Path "${env:ProgramFiles}TeamVieweruninstall.exe" -PathType Leaf -ErrorAction SilentlyContinue) {
        $TeamViewerUninstallerFoundAgain = $True
    }

    # If neither registry nor uninstaller found, removal was successful
    if (!$TeamViewerInstalls -and !$TeamViewerUninstallerFoundAgain) {
        Write-Host -Object "TeamViewer has been successfully removed."
    } else {
        Write-Host -Object "[Error] TeamViewer is still installed."
        exit 1
    }

    exit $ExitCode
}
end {
    
    
    
}

 

Domande frequenti

Passi successivi