Files
Powershell-Scripts/Reinstall Scripts/App - Teams Nuke - Aggressive Reinstall.ps1
T

157 lines
6.2 KiB
PowerShell

<#
Author: Gabe Kerntke
Date: 03-06-2024
.Synopsis
.Modified
2024-03-06 (GabeK) - Original script created
2025-08-09 (GabeK) - Updated to use functions script
#>
[CmdletBinding()]
Param(
[Parameter(Mandatory = $false)]
$App_Name = "Teams",
[Parameter(Mandatory = $false)]
$File_Name_Extension = "exe",
[Parameter(Mandatory = $false)]
$Install_Parameters = "-p" ,
[Parameter(Mandatory = $false)]
$EPCache_Folder = "3rd Party Patches\$App_Name",
[Parameter(Mandatory = $false)]
$File_Name = "$App_Name.$File_Name_Extension",
[Parameter(Mandatory = $false)]
$users = (Get-ChildItem -path c:\users).name,
[Parameter(Mandatory = $false)]
$CurrentUser = ((get-ciminstance win32_computersystem | ForEach-Object username) -split '\\')[1]
)
$initialURL = "https://learn.microsoft.com/en-us/microsoftteams/new-teams-bulk-install-client"
# Download the HTML content
$html = (New-Object System.Net.WebClient).DownloadString("$initialURL")
# Split the content on ">" and "<" characters to extract the text content
$text = $html.Split([char[]]@(">", "<"), [StringSplitOptions]::RemoveEmptyEntries)
# Sort the start and end index of the page
$startIndex = $text.IndexOf("Option 1A: Download and install new Teams for a single computer")
$endIndex = $text.IndexOf("Option 1B: Download and install new Teams using an offline installer")
# Extract the rows
$rows = $text[$startIndex..$endIndex]
# Filter out only the rows containing version numbers
$Sort = $rows | Where-Object { $_ -match "https" }
$Split = $Sort.split() | Select-Object -First 2 | Select-Object -Last 1
$DownloadURL = $Split.Substring(5) -replace '"', ""
#Region Functions
Function Uninstall-Teams {
Stop-Process -name *teams* -Force -ErrorAction SilentlyContinue -Verbose
Start-Sleep 10
$Applist = Get-Software | Where-Object { $_.DisplayName -like "*$Name*" }
$Uninstall = Get-WmiObject Win32_Product -filter "name like 'Teams%'" | ForEach-Object { $_.Uninstall() } -Verbose -ErrorAction SilentlyContinue
$Value = $Uninstall | Select-Object -ExpandProperty ReturnValue
If ($Value -eq "0") {
Write-Host "Successfull uninstall via WmiObject"
Remove-TeamsFolder
}
ElseIf ($null -eq $Applist) {
Remove-TeamsFolder
}
Else {
$UninstallPath = $Applist | Select-Object -ExpandProperty PSPath
$B = $UninstallPath -replace "Microsoft.PowerShell.Core", ""
$C = $B.Substring(1)
Remove-Item -Path $C -Force
Start-Sleep 5
Remove-TeamsFolder
}
}
Function Remove-TeamsFolder {
$ErrorActionPreference = "SilentlyContinue"
trap {
$message = $Error[0].Exception.Message
#If ($message) {
#Write-Host -Object "Error: $message" -ForegroundColor Red
# }
#exit -1
}
Get-AppxPackage -name *Teams* -AllUsers | Select-Object -ExpandProperty PackageFullName | Remove-AppxPackage -AllUsers -ErrorAction SilentlyContinue
Get-ChildItem "C:\Program Files\WindowsApps" | Where-Object { $_.Name -like "*Teams*" } | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
$programData = "$($env:ProgramData)\$($_.Name)\Microsoft\Teams"
If (Test-Path "$($programData)\Current\Teams.exe") {
Start-Process -FilePath "$($programData)\Current\Teams.exe" -ArgumentList "--uninstall /s" -PassThru -Wait
Remove-Item "$($env:ProgramData)\$($_.Name)\Microsoft\Teams" -Force -Recurse
}
$users = Get-ChildItem C:\Users
foreach ($user in $users) {
$path = "C:\Users\$($user.Name)\AppData\Local\Microsoft\Teams"
If (Test-Path $path) {
Remove-Item $path -Force -Recurse
}
}
RegDelete
}
Function RegDelete {
New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS -ErrorAction SilentlyContinue | Out-Null
foreach ($user in $users) {
If ($user -eq $currentuser) { continue; }
reg load "hku\$user" "C:\Users\$user\NTUSER.DAT" | Out-Null
# Do whatever you need with "hkey_users\$user" here which links to each users' HKU
If (Test-Path "HKU:$user\Software\Microsoft\Windows\CurrentVersion\Uninstall") {
Get-ChildItem "HKU:$user\Software\Microsoft\Windows\CurrentVersion\Uninstall" | Where-Object { $_ -like "*Teams*" } | Remove-Item -Force -Recurse -Verbose -ErrorAction SilentlyContinue
Start-Sleep 5
}
}
foreach ($user in $users) {
If ($user -eq $currentuser) { continue; }
Start-Sleep 5
reg unload "hku\$user" | Out-Null
}
$Keys = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\" -Recurse
$SIDs = $Keys.PSChildName
foreach ($SID in $SIDs) {
If (Test-Path "HKU:\$SID\Software\Microsoft\Windows\CurrentVersion\Uninstall") {
Get-ChildItem "HKU:\$SID\Software\Microsoft\Windows\CurrentVersion\Uninstall" | Where-Object { $_ -like "*Teams*" } | Remove-Item -Force -Recurse -Verbose -ErrorAction SilentlyContinue
}
If (Test-Path "HKU:\$SID\Software\Microsoft\Windows\CurrentVersion\Uninstall\*teams*") {
Write-Host "Teams uninstall key for $SID still exists."
}
}
<#
Foreach ($Key in $Keys) {
If (($key.GetValueNames() | ForEach-Object { $key.GetValue($_) }) -match "\b$CurrentUser\b" ) { $sid = $key }
}
$sid = $sid.pschildname
If (Test-Path "HKU:\$sid\Software\Microsoft\Windows\CurrentVersion\Uninstall") {
Get-ChildItem "HKU:\$sid\Software\Microsoft\Windows\CurrentVersion\Uninstall" | Where-Object { $_ -like "*Teams*" } | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
}
else { Write-Host "No Teams reg key under currently signed in user $CurrentUser" }
#>
}
#Region Script Start
If ((Test-Path "C:\Temp\Script Cache") -eq $False) { New-Item -ItemType directory -Path "C:\Temp\Script Cache" }
Invoke-WebRequest -UseBasicParsing "https://scripts.gabesville.com/Gabesville/Powershell-Scripts/raw/branch/main/Functions%20Scripts/Functions.ps1" -outfile "C:\Temp\Script Cache\Functions.ps1"
. "C:\Temp\Script Cache\Functions.ps1"
Close-App
Uninstall-Teams
Test-Probe_Online
Install-App
#Region Script End