Загрузка данных
#requires -RunAsAdministrator
$ErrorActionPreference = 'SilentlyContinue'
$patterns = @(
'Radmin VPN',
'RadminVPN',
'RVPN',
'Radmin'
)
$found = $false
$log = New-Object System.Collections.Generic.List[string]
function Test-MatchAny {
param(
[string]$Text
)
if ([string]::IsNullOrWhiteSpace($Text)) { return $false }
foreach ($p in $script:patterns) {
if ($Text -match [regex]::Escape($p)) { return $true }
}
return $false
}
function Mark-Found([string]$msg) {
$script:found = $true
[void]$script:log.Add($msg)
}
function Remove-SafeItem {
param(
[Parameter(Mandatory=$true)][string]$Path
)
if (Test-Path -LiteralPath $Path) {
Remove-Item -LiteralPath $Path -Recurse -Force
Mark-Found "Удалено: $Path"
}
}
Write-Host "=== Старт очистки Radmin VPN ==="
# 1) Убиваем процессы
Get-Process | ForEach-Object {
$name = $_.Name
$path = $_.Path
if ((Test-MatchAny $name) -or (Test-MatchAny $path)) {
try {
Stop-Process -Id $_.Id -Force
Mark-Found "Процесс завершён: $name ($($_.Id))"
} catch {}
}
}
# 2) Пытаемся удалить через uninstall-записи
$uninstallRoots = @(
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',
'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall',
'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
)
foreach ($root in $uninstallRoots) {
if (Test-Path $root) {
Get-ChildItem $root | ForEach-Object {
$p = Get-ItemProperty $_.PsPath
$displayName = $p.DisplayName
if (Test-MatchAny $displayName) {
Mark-Found "Найдена запись удаления: $displayName"
$uninstall = $p.UninstallString
if ($uninstall) {
try {
if ($uninstall -match 'msiexec') {
$guid = ([regex]::Match($uninstall, '\{[0-9A-Fa-f-]+\}')).Value
if ($guid) {
Start-Process msiexec.exe -ArgumentList "/x $guid /qn /norestart" -Wait
} else {
Start-Process cmd.exe -ArgumentList "/c $uninstall /qn /norestart" -Wait
}
} else {
Start-Process cmd.exe -ArgumentList "/c $uninstall /quiet /norestart" -Wait
}
} catch {}
}
try {
Remove-Item $_.PsPath -Recurse -Force
} catch {}
}
}
}
}
# 3) Удаляем службы
Get-CimInstance Win32_Service | ForEach-Object {
if ((Test-MatchAny $_.Name) -or (Test-MatchAny $_.DisplayName)) {
try {
if ($_.State -ne 'Stopped') {
Stop-Service -Name $_.Name -Force
}
} catch {}
try {
sc.exe delete $_.Name | Out-Null
Mark-Found "Служба удалена: $($_.Name)"
} catch {}
}
}
# 4) Удаляем задачи планировщика
try {
Get-ScheduledTask | ForEach-Object {
if ((Test-MatchAny $_.TaskName) -or (Test-MatchAny $_.TaskPath)) {
try {
Unregister-ScheduledTask -TaskName $_.TaskName -TaskPath $_.TaskPath -Confirm:$false
Mark-Found "Задача удалена: $($_.TaskPath)$($_.TaskName)"
} catch {}
}
}
} catch {}
# 5) Удаляем типовые папки
$knownPaths = @(
"$env:ProgramFiles\Radmin VPN",
"${env:ProgramFiles(x86)}\Radmin VPN",
"$env:ProgramData\Radmin VPN",
"$env:LOCALAPPDATA\Radmin VPN",
"$env:APPDATA\Radmin VPN"
)
foreach ($p in $knownPaths) {
Remove-SafeItem -Path $p
}
# 6) Ищем и удаляем остатки папок по имени на всех дисках
Get-PSDrive -PSProvider FileSystem | ForEach-Object {
$root = $_.Root
try {
Get-ChildItem -LiteralPath $root -Directory -Recurse -Force | ForEach-Object {
$full = $_.FullName
$name = $_.Name
if ((Test-MatchAny $full) -or (Test-MatchAny $name)) {
try {
Remove-Item -LiteralPath $full -Recurse -Force
Mark-Found "Остаток папки удалён: $full"
} catch {}
}
}
} catch {}
}
# 7) Чистим реестр: ключи и значения, где есть Radmin/RVPN
$regRoots = @(
'HKLM:\SOFTWARE',
'HKCU:\SOFTWARE',
'HKLM:\SOFTWARE\WOW6432Node'
)
foreach ($root in $regRoots) {
if (Test-Path $root) {
# Сначала удаляем ключи по имени
Get-ChildItem $root -Recurse | ForEach-Object {
$keyName = $_.Name
if (Test-MatchAny $keyName) {
try {
Remove-Item $_.PsPath -Recurse -Force
Mark-Found "Ключ реестра удалён: $keyName"
} catch {}
}
}
# Потом удаляем ключи, где значения содержат строку
Get-ChildItem $root -Recurse | ForEach-Object {
try {
$props = Get-ItemProperty $_.PsPath
$hit = $false
foreach ($prop in $props.PSObject.Properties) {
if ($prop.Name -like 'PS*') { continue }
$val = $prop.Value
if ($null -eq $val) { continue }
if ($val -is [string] -and (Test-MatchAny $val)) { $hit = $true; break }
if ($val -is [string[]] -and (Test-MatchAny ($val -join ' '))) { $hit = $true; break }
}
if ($hit) {
Remove-Item $_.PsPath -Recurse -Force
Mark-Found "Ключ реестра по значению удалён: $($_.Name)"
}
} catch {}
}
}
}
# 8) Чистим Run-запуски
$runKeys = @(
'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run',
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run',
'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run'
)
foreach ($rk in $runKeys) {
if (Test-Path $rk) {
try {
$items = Get-ItemProperty $rk
foreach ($prop in $items.PSObject.Properties) {
if ($prop.Name -like 'PS*') { continue }
$val = [string]$prop.Value
if (Test-MatchAny $prop.Name -or Test-MatchAny $val) {
Remove-ItemProperty -Path $rk -Name $prop.Name
Mark-Found "Автозапуск удалён: $rk -> $($prop.Name)"
}
}
} catch {}
}
}
# 9) Итог
if ($found) {
Write-Host "не кипишуй брат я всё пачистил, всо удалил, радуйся жизни бро"
} else {
Write-Host "не, нихуя нету брат.."
}
if ($log.Count -gt 0) {
Write-Host "`n--- Что было найдено/удалено ---"
$log | ForEach-Object { Write-Host $_ }
}