Das hier bereitgestellte PowerShell Script führt automatisch die von TrendMicro empfohlenen Aktionen zur manuellen Deinstallation vom Worry-Free Business Security Agent aus.
Des Weiteren erstellt das Script vorher ein Backup der Windows Registry und reaktiviert den Windows Defender, wie hier beschrieben:
Windows Defender in Windows 10 und Server 2016 deaktivieren | WindowsPro
Dies hat TrendMicro leider in ihrem Blogeintrag vergessen zu erwähnen, was dazu führt, dass man den Defender selbst nach erfolgreicher Deinstallation nicht gestartet bekommt.
Die Schritte sind im folgenden Blogeintrag beschrieben.
Leider ist dies sehr langwierig und TrendMicro liefert kein Script zum automatischen Ausführen der Schritte mit.
Manually removing the Security Agent – Worry-Free Business Security (trendmicro.com)
Das Script führt die 32Bit sowie die 64Bit befehle aus, um alles abzudecken.
# Von Darian Kroll
# Version 1.0
# Zuletzt bearbeitet 03.06.2024
# Benutzung auf eigene Gefahr!
# Logdatei wird definiert
$ScriptData = "$PSScriptRoot\remove_trendMicro"
$Logfile = "$ScriptData\PS_Remove_Trendmicro.log"
if (-not (Test-Path -Path $ScriptData)) {
New-Item -ItemType Directory -Path $ScriptData -Force | Out-Null
}
Add-Content $Logfile -Value "--------------------------Script Start------------------------------"
# Funktionen werden definiert
Function Write-Log {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$False)]
[ValidateSet("INFO", "WARN", "ERROR", "FATAL", "DEBUG")]
[String]
$Level = "INFO",
[Parameter(Mandatory=$True)]
[string]
$Message,
[Parameter(Mandatory=$False)]
[string]
$logfile
)
$Stamp = (Get-Date).ToString("dd/MM/yyyy HH:mm:ss")
$Line = "$Stamp | $Level | $Message"
If ($logfile) {
Add-Content $logfile -Value $Line
Write-Host $Line
} Else {
Write-Output $Line
}
}
function Stop-ProcessWithRetries {
param (
[string]$processName,
[int]$maxRestarts = 10,
[int]$waitTimeInSeconds = 2
)
$currentRestarts = 0
# Funktion zum Beenden des Prozesses
function Stop-ProcessByName {
param (
[string]$name
)
$processes = Get-Process -Name $name -ErrorAction SilentlyContinue
if ($processes) {
foreach ($process in $processes) {
try {
Stop-Process -Id $process.Id -Force
Write-Log -Level INFO -Message "Prozess $($process.Name) (ID: $($process.Id)) beendet." -logfile $Logfile
} catch {
Write-Log -Level ERROR -Message "Fehler beim Beenden des Prozesses $($process.Name) (ID: $($process.Id)): $_" -logfile $Logfile
}
}
return $true
} else {
Write-Log -Level INFO -Message "Prozess $name läuft nicht." -logfile $Logfile
return $false
}
}
# Überprüfen und beenden des Prozesses bis zur maximalen Anzahl der Neustarts
while ($currentRestarts -lt $maxRestarts) {
if (Stop-ProcessByName -name $processName) {
Start-Sleep -Seconds $waitTimeInSeconds # Wartezeit, bevor überprüft wird, ob der Prozess neu gestartet wurde
$currentRestarts++
} else {
break
}
}
# Überprüfen, ob der Prozess noch läuft
if (Get-Process -Name $processName -ErrorAction SilentlyContinue) {
Write-Log -Level ERROR -Message "Prozess $processName wurde $maxRestarts Mal neu gestartet und läuft immer noch." -logfile $Logfile
exit
} else {
Write-Log -Level INFO -Message "Prozess $processName wurde erfolgreich beendet." -logfile $Logfile
}
}
function Stop-ServiceWithRetries {
param (
[string]$serviceName,
[int]$maxRestarts = 10,
[int]$waitTimeInSeconds = 5
)
$currentRestarts = 0
# Funktion zum Beenden des Dienstes
function Stop-ServiceByName {
param (
[string]$name
)
$service = Get-Service -Name $name -ErrorAction SilentlyContinue
if ($service -and $service.Status -eq 'Running') {
Stop-Service -Name $name -Force
Write-Log -Level INFO -Message "Dienst $name beendet." -logfile $Logfile
return $true
} else {
Write-Log -Level INFO -Message "Dienst $name läuft nicht." -logfile $Logfile
return $false
}
}
# Überprüfen und beenden des Dienstes bis zur maximalen Anzahl der Neustarts
while ($currentRestarts -lt $maxRestarts) {
if (Stop-ServiceByName -name $serviceName) {
Start-Sleep -Seconds $waitTimeInSeconds # Wartezeit, bevor überprüft wird, ob der Dienst neu gestartet wurde
$currentRestarts++
} else {
break
}
}
# Überprüfen, ob der Dienst noch läuft
$service = Get-Service -Name $serviceName -ErrorAction SilentlyContinue
if ($service -and $service.Status -eq 'Running') {
Write-Log -Level ERROR -Message "Dienst $serviceName wurde $maxRestarts Mal neu gestartet und läuft immer noch." -logfile $Logfile
exit
} else {
Write-Log -Level INFO -Message "Dienst $serviceName wurde erfolgreich beendet." -logfile $Logfile
}
}
function Remove-RegistryKey {
param (
[string]$registryPath
)
try {
# Überprüfen, ob der Registrierungsschlüssel existiert
if (Test-Path -Path $registryPath) {
# Löschen des Registrierungsschlüssels
Remove-Item -Path $registryPath -Recurse -Force
Write-Log -Level INFO -Message "Registrierungsschlüssel '$registryPath' wurde erfolgreich gelöscht." -logfile $Logfile
} else {
Write-Log -Level INFO -Message "Registrierungsschlüssel '$registryPath' existiert nicht." -logfile $Logfile
}
} catch {
Write-Log -Level ERROR -Message "Fehler beim Löschen des Registrierungsschlüssels: $_" -logfile $Logfile
exit
}
}
function Remove-FolderRecursively {
param (
[string]$folderPath
)
try {
# Überprüfen, ob der Ordner existiert
if (Test-Path -Path $folderPath) {
# Löschen des Ordners rekursiv und mit Zwang
Remove-Item -Path $folderPath -Recurse -Force
Write-Log -Level INFO -Message "Ordner '$folderPath' wurde erfolgreich gelöscht." -logfile $Logfile
} else {
Write-Log -Level INFO -Message "Ordner '$folderPath' existiert nicht." -logfile $Logfile
}
} catch {
Write-Log -Level ERROR -Message "Fehler beim Löschen des Ordners: $_" -logfile $Logfile
exit
}
}
function Backup-Registry {
param (
[string]$backupPath
)
try {
Write-Log -Level INFO -Message "Registry-Backup wird angelegt..." -logfile $Logfile
# Stelle sicher, dass das Backup-Verzeichnis existiert
if (-not (Test-Path -Path $backupPath)) {
New-Item -ItemType Directory -Path $backupPath -Force | Out-Null
}
# Erstellen des Registry-Backups
$backupFile = Join-Path -Path $backupPath -ChildPath ("RegistryBackup_{0}.reg" -f (Get-Date -Format "yyyyMMdd_HHmmss"))
reg export HKLM $backupFile /y
Write-Log -Level INFO -Message "Registry-Backup wurde erstellt: $backupFile" -logfile $Logfile
# Benutzerbestätigung
$userInput = Read-Host "Bitte bestätigen Sie, dass Sie das Backup an einem sicheren Ort gespeichert haben. Geben Sie 'ja' ein, um fortzufahren"
if ($userInput -ne "ja") {
Write-Log -Level ERROR -Message "Sicherung der Registrierung nicht bestätigt. Skript wird abgebrochen." -logfile $Logfile
exit
}
Write-Log -Level INFO -Message "Sicherung der Registrierung wurde bestätigt." -logfile $Logfile
} catch {
Write-Log -Level ERROR -Message "Fehler beim Erstellen des Registry-Backups: $_" -logfile $Logfile
exit
}
}
# Funktion zum Erstellen oder Anpassen eines DWORD-Wertes in der Registry
function Set-RegistryDWORDValue {
param (
[string]$path,
[string]$name,
[int]$value
)
try {
# Überprüfen, ob der Registrierungspfad existiert, wenn nicht, erstelle ihn
if (-not (Test-Path -Path $path)) {
New-Item -Path $path -Force | Out-Null
}
# Überprüfen, ob der DWORD-Wert existiert
$existingValue = Get-ItemProperty -Path $path -Name $name -ErrorAction SilentlyContinue
if ($existingValue -ne $null) {
# Wenn der DWORD-Wert existiert, passe ihn an
Set-ItemProperty -Path $path -Name $name -Value $value
Write-Log -Level INFO -Message "DWORD-Wert '$name' im Pfad '$path' wurde auf den Wert '$value' angepasst." -logfile $Logfile
} else {
# Wenn der DWORD-Wert nicht existiert, erstelle ihn
New-ItemProperty -Path $path -Name $name -Value $value -PropertyType DWORD -Force | Out-Null
Write-Log -Level INFO -Message "DWORD-Wert '$name' wurde erfolgreich im Pfad '$path' mit dem Wert '$value' erstellt." -logfile $Logfile
}
} catch {
Write-Log -Level ERROR -Message "Fehler beim Erstellen oder Anpassen des DWORD-Wertes: $_" -logfile $Logfile
exit
}
}
function Ask-Restart {
$response = Read-Host "Möchten Sie den PC neu starten? (ja/nein)"
if ($response -eq "ja") {
Write-Log -Level INFO -Message "Der PC wird neu gestartet." -logfile $Logfile
Restart-Computer -Force
} elseif ($response -eq "nein") {
Write-Log -Level INFO -Message "Der PC wird nicht neu gestartet." -logfile $Logfile
} else {
Write-Log -Level INFO -Message "Ungültige Eingabe. Bitte 'ja' oder 'nein' eingeben." -logfile $Logfile
Ask-Restart
}
}
# Stelle sicher, dass das Skript als Administrator ausgeführt wird
if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Write-Log -Level FATAL -Message "Das Skript muss als Administrator ausgeführt werden." -logfile $Logfile
exit
}
Write-Log -Level INFO -Message "Script Root: $PSScriptRoot" -logfile $Logfile
# Registry Backup anfertigen
Backup-Registry -backupPath "$ScriptData"
# Dienste stoppen (Task 1)
Stop-ServiceWithRetries -serviceName "TmCCSF"
Stop-ServiceWithRetries -serviceName "tmlisten"
Stop-ServiceWithRetries -serviceName "ntrtscan"
Stop-ServiceWithRetries -serviceName "TMBMServer"
# Prozesse stoppen (Task 2)
Stop-ProcessWithRetries -processName "Ntrtscan"
Stop-ProcessWithRetries -processName "PccNT"
Stop-ProcessWithRetries -processName "PccNTMon"
Stop-ProcessWithRetries -processName "Pccntupd"
Stop-ProcessWithRetries -processName "TMBMSRV"
Stop-ProcessWithRetries -processName "TmCCSF"
Stop-ProcessWithRetries -processName "TmListen"
Stop-ProcessWithRetries -processName "Tmpfw"
Stop-ProcessWithRetries -processName "xpupg"
# Task 3
# 64-Bit
regsvr32 /u /s "C:\program files (x86)\trend micro\Security Agent\tmdshell_64x.dll"
# 32-Bit
regsvr32 /u /s "C:\program files\trend micro\Security Agent\tmdshell.dll"
taskkill /F /IM explorer.exe
start explorer.exe
# Task 4.1
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\Ntrtscan"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\Tmactmon"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\TMBMServer"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\TmCCSF"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\Tmcomm"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\Tmeevw"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\tmevtmgr"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\TmFilter"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\Tmlisten"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\Tmlwf"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\TmPfw"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\TMPreFilter"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\tmpreflt"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\tmumh"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\Tmusa"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\tmwfp"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\tmwscsvc"
Remove-RegistryKey -registryPath "HKLM:\SYSTEM\CurrentControlSet\Services\VSApiNt"
# Task 4.2
# 32-Bit
Remove-RegistryKey -registryPath "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\OfficeScanNT Monitor"
# 64-Bit
Remove-RegistryKey -registryPath "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run\OfficeScanNT Monitor"
# Task 4.3
Remove-RegistryKey -registryPath "HKLM:\Software\Microsoft\windows\currentversion\uninstall\Wofie"
# 32-Bit
Remove-RegistryKey -registryPath "HKLM:\Software\Microsoft\windows\currentversion\uninstall\{33BEF4B8-AFD3-4AF0-BD20-42F70A417266}"
# 64-Bit
Remove-RegistryKey -registryPath "HKLM:\Software\Microsoft\windows\currentversion\uninstall\{1FF9FE5E-27A3-45F1-979B-85903EB3CFF1}"
# Task 4.4
# 32-Bit
Remove-RegistryKey -registryPath "HKLM:\SOFTWARE\TrendMicro"
# 64-Bit
Remove-RegistryKey -registryPath "HKLM:\SOFTWARE\Wow6432Node\TrendMicro"
# Task 4.5
# 32-Bit
Remove-RegistryKey -registryPath "HKCR:\Installer\Features\8B4FEB333DFA0FA4DB02247FA0142766"
Remove-RegistryKey -registryPath "HKCR:\Installer\Products\8B4FEB333DFA0FA4DB02247FA0142766"
# 64-Bit
Remove-RegistryKey -registryPath "HKCR:\Installer\Features\E5EF9FF13A721F5479B95809E33BFC1F"
Remove-RegistryKey -registryPath "HKCR:\Installer\Products\E5EF9FF13A721F5479B95809E33BFC1F"
# Task 5
Remove-FolderRecursively -folderPath "C:\Program Files (x86)\Trend Micro"
# Task 6
Remove-FolderRecursively -folderPath "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Trend Micro Worry-Free Business Security Agent"
# Task 7 (Defender in Registry reaktivieren)
Set-RegistryDWORDValue -path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -name "DisableAntiSpyware" -value 0
Ask-Restart
Das Script ist so konzipiert, dass es Prozesse und Dienste von TrendMicro mehrfach versucht zu stoppen, da diese gerne ein paar mal neu starten, bis diese aus bleiben.
Auf der nächsten Seite wird gezeigt, wie das Script vorgeht und wie der Defender im Anschluss zu starten ist.
Nach dem Herunterladen des Scripts wird dieses an einem beliebigen Ort abgelegt, z.B.:
C:/tmp/
Nun kann das Script als Administrator gestartet werden.
Dazu wird eine PowerShell Instanz als Administrator ausgeführt und folgende Befehle eingegeben:
cd C:/tmp/
.\Remove_TrendMicro.ps1
Als Erstes legt das Script in einem neuen Ordner ein Backup der Registry an, dies kann mehrere Minuten dauern.
Das Backup sollte auf einem externen Medium oder einer Netzwerkfreigabe gesichert werden.
Sobald dies geschehen ist, bestätigen wir dem Script, dass das Backup erfolgt ist und die Deinstallation wird fortgesetzt.
Nun werden die Schritte durchgeführt, welche von TrendMicro beschrieben wurden.
Falls es beim Beenden von den Diensten zu einer Fehlermeldung kommen sollte, ist dies nicht schlimm, da einfach noch mal versucht wird diesen zu stoppen.
Zu guter Letzt wird der Eintrag in der Registry gesetzt, der ein Starten des Defenders ermöglicht, was TrendMicro in ihrer Anleitung vergessen hatte zu erwähnen.
Die Ausgabe sollte z.B. so aussehen:
Im Anschluss fragt das Script, ob der PC neu gestartet werden soll, was zu empfehlen ist.
Nachdem der PC neu gestartet ist, kann über die Windows Suche nach „Defender“ gesucht werden.
Mit einem Klick auf jetzt starten kann der Windows Defender reaktiviert werden:
Unter dem Reiter „Update“ kann mit einem Klick auf „Updatedefinition“ der Defender upgedatet werden:
TrendMicro ist nun erfolgreich vom System entfernt und der Windows Defender reaktiviert.
Immer wieder ein Genuss diesen Block zu lesen… Immer weiter so Darian