Перейти к основному содержимому

Чистка компьютера от следов Anthropic

Если ты раньше пользовался Claude на этом компьютере — через обычный браузер, официальное приложение Claude Desktop или консольную утилиту Claude Code, — в системе остались глубокие следы.

При блокировке или фиксации подозрительной активности Anthropic цепляется не только за IP. Клиентские приложения хранят machineId1, OAuth-токены, идентификаторы виртуалки и кэши. Откроешь антидетект рядом с работающим Claude Desktop или старым конфигом — и новая учётка уже связана с историей старой.

Так что перед настройкой окружения систему надо привести в порядок. Ниже — где именно лежит мусор.


1. Где живут следы​

На обычном рабочем компьютере Anthropic и его компоненты могут оставлять десятки гигабайт файлов в скрытых системных папках:

  1. Claude Desktop и среда Cowork VM:
    • C:\Users\<юзер>\AppData\Local\Claude-Data — основной массив десктопного клиента, кэши сессий и образы виртуальной машины (размер может легко превышать 10–12 ГБ).
    • C:\Users\<юзер>\AppData\Local\Packages\Claude_* — изолированный MSIX-контейнер приложения со встроенными кэшами.
    • C:\Users\<юзер>\AppData\Local\Claude и C:\ProgramData\Claude — журналы событий и логи фоновой службы (cowork-service.log).
    • Фоновая служба CoworkVMService (cowork-svc.exe) — часто остается висеть в автозагрузке Windows даже при закрытом окне программы.
  2. Claude Code (CLI-утилита):
    • C:\Users\<юзер>\.claude — полная история всех проектов, сессий, введенных команд, а главное — файл .credentials.json (OAuth-токены) и .claude.json с зашитым аппаратным machineId.
    • C:\Users\<юзер>\.local\bin\claude.exe — сам бинарник утилиты.
  3. Обычные браузеры:
    • Хранилища LocalStorage, IndexedDB, Service Workers и куки на доменах claude.ai и anthropic.com.

2. Автоматическая очистка: скрипт cleanup_anthropic.ps1​

Вычищать вручную десятки папок, отлавливать фоновые процессы, деинсталлировать приложение через winget, сносить службу CoworkVMService, подчищать реестр и переменные окружения нет смысла: руками легко пропустить скрытый идентификатор или заблокированный файл.

Поэтому я собрал полную процедуру зачистки в один готовый PowerShell-скрипт cleanup_anthropic.ps1. Он сам завершает процессы, удаляет клиент, стирает системные каталоги со следами сессий, вычищает ветки реестра, правила фаервола и переменные среды.

Скачать скрипт

👉 Скачать cleanup_anthropic.ps1

Либо скачай его напрямую через PowerShell в папку «Загрузки»:

Invoke-WebRequest -Uri "https://guide.notcvnt.com/cleanup_anthropic.ps1" -OutFile "$HOME\Downloads\cleanup_anthropic.ps1"
cd "$HOME\Downloads"

Инструкция по запуску​

  1. Открой PowerShell от имени администратора и перейди в папку со скачанным файлом:
cd "$HOME\Downloads"

(Если Windows блокирует запуск неподписанных скриптов, разреши выполнение для текущего окна: Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass).

  1. По умолчанию скрипт работает в безопасном режиме (Dry Run) — он только анализирует систему и показывает список найденных хвостов без удаления:
# Безопасный осмотр: только отчет
.\cleanup_anthropic.ps1
  1. Если отчет подтверждает наличие старых хвостов и ты готов к полной зачистке:
# Полная зачистка с удалением файлов и остановкой служб
.\cleanup_anthropic.ps1 -Execute -DeleteHistory

Параметр -DeleteHistory очищает каталог ~/.claude/projects с перепиской и .claude.json. Если прошлые диалоги тебе еще нужны, запускай команду без этого флага: .\cleanup_anthropic.ps1 -Execute.

Посмотреть исходный код скрипта целиком
#Requires -Version 5.1
<#
.SYNOPSIS
Удаляет системные следы Anthropic / Claude с компьютера.
.DESCRIPTION
По умолчанию -- DRY RUN: только печатает, что будет удалено.
Реальное удаление: -Execute

Что НЕ трогается (по умолчанию):
- любые проекты: их каталоги .claude, CLAUDE.md, worktrees, git-репозитории
- Obsidian: E:\AI\Obsidian\main\.claude-sync, CLAUDE.md и задача "Синк памяти"
- файлы в корзине


Флаги:
-DeleteHistory УДАЛИТЬ историю диалогов (~/.claude/projects) и ~/.claude.json.
По умолчанию они СОХРАНЯЮТСЯ (это ваша переписка).
-NoUninstall не удалять само приложение через winget (сделаю вручную)
-IncludeRecycleBin дополнительно вычистить из корзины объекты с 'claude' в имени
.EXAMPLE
.\cleanup_anthropic.ps1 # показать план
.\cleanup_anthropic.ps1 -Execute # выполнить
#>
param(
[switch]$Execute,
[switch]$DeleteHistory,
[switch]$NoUninstall,
[switch]$IncludeRecycleBin
)

try { [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 } catch {}
$ErrorActionPreference = 'Continue'
$ProgressPreference = 'SilentlyContinue'
$User = $env:USERPROFILE
$Local = $env:LOCALAPPDATA
$Roam = $env:APPDATA

$script:Failed = New-Object System.Collections.Generic.List[string]
$script:Killed = New-Object System.Collections.Generic.List[int]
$script:Done = New-Object System.Collections.Generic.List[string]

function Say($msg) { Write-Host $msg }
function Step($msg) { Write-Host ""; Write-Host "=== $msg ===" -ForegroundColor Cyan }
function Plan($msg) { Write-Host " [plan] $msg" -ForegroundColor Yellow }
function Ok($msg) { Write-Host " [ ok ] $msg" -ForegroundColor Green; $script:Done.Add($msg) }
function Fail($msg) { Write-Host " [fail] $msg" -ForegroundColor Red; $script:Failed.Add($msg) }

function Remove-Target([string]$Path, [string]$Label) {
if (-not (Test-Path -LiteralPath $Path)) { Say " [skip] $Label -> отсутствует"; return }
$item = Get-Item -LiteralPath $Path -Force
$size = if ($item.PSIsContainer) {
(Get-ChildItem -LiteralPath $Path -Recurse -Force -File -ErrorAction SilentlyContinue |
Measure-Object -Sum Length).Sum
} else { $item.Length }
$mb = [math]::Round($size / 1MB, 1)
if (-not $Execute) { Plan "$Label ($mb MB)"; return }
try {
Remove-Item -LiteralPath $Path -Recurse -Force -ErrorAction Stop
Ok "$Label ($mb MB)"
} catch {
Fail "$Label ($mb MB) :: $($_.Exception.Message)"
}
}

function Remove-RegKey([string]$Key, [string]$Label) {
if (-not (Test-Path -LiteralPath $Key)) { Say " [skip] $Label -> отсутствует"; return }
if (-not $Execute) { Plan "$Label"; return }
try {
Remove-Item -LiteralPath $Key -Recurse -Force -ErrorAction Stop
Ok "$Label"
} catch {
Fail "$Label :: $($_.Exception.Message)"
}
}

Say "Режим: $(if ($Execute) { 'УДАЛЕНИЕ' } else { 'DRY RUN (ничего не меняется)' })"
Say "Проекты, CLAUDE.md и Obsidian не затрагиваются."

# ---------------------------------------------------------------- 1. процессы
Step "1/6 Остановка процессов и службы"
$procNames = @('claude', 'cowork-svc')
foreach ($n in $procNames) {
$procs = Get-Process -Name $n -ErrorAction SilentlyContinue
if (-not $procs) { Say " [skip] процесс $n не найден"; continue }
foreach ($p in $procs) {
if ($script:Killed -contains $p.Id) { continue }
if (-not $Execute) { Plan "kill $($p.Name) PID=$($p.Id)"; $script:Killed += $p.Id; continue }
try { Stop-Process -Id $p.Id -Force -ErrorAction Stop; Ok "kill $($p.Name) PID=$($p.Id)" }
catch { Fail "kill $($p.Name) PID=$($p.Id) :: $($_.Exception.Message)" }
$script:Killed += $p.Id
}
}
$svc = Get-Service -Name CoworkVMService -ErrorAction SilentlyContinue
if ($svc) {
if (-not $Execute) { Plan "Stop-Service CoworkVMService" }
else {
try { Stop-Service CoworkVMService -Force -ErrorAction Stop; Ok "Stop-Service CoworkVMService" }
catch { Fail "Stop-Service CoworkVMService :: $($_.Exception.Message)" }
}
} else { Say " [skip] служба CoworkVMService отсутствует" }

# ---------------------------------------------------------------- 2. приложение
Step "2/6 Удаление приложения (MSIX / winget)"
if ($NoUninstall) {
Say " [skip] -NoUninstall"
} elseif (-not $Execute) {
Plan "winget uninstall --id Anthropic.Claude --exact"
} else {
& winget uninstall --id Anthropic.Claude --exact --silent --disable-interactivity
if ($LASTEXITCODE -eq 0) { Ok "winget uninstall Anthropic.Claude" }
else { Fail "winget uninstall Anthropic.Claude (exit=$LASTEXITCODE)" }
}

# ---------------------------------------------------------------- 3. файлы
Step "3/6 Системные каталоги Anthropic / Claude"

# Desktop / CLI данные в профиле пользователя
Remove-Target "$Local\Claude-Data" "Claude Desktop data + Cowork VM"
Remove-Target "$Local\Packages\Claude_pzs8sxrjxfjjc" "MSIX container"
Remove-Target "$Local\Claude" "Desktop logs"
Remove-Target "$Local\claude-cli-nodejs" "MCP logs (CLI)"
Remove-Target "$Local\Temp\claude" "Temp session files"
Remove-Target "$env:ProgramData\Claude" "ProgramData logs"

# CLI home
if (-not $DeleteHistory) {
Say " [keep] история диалогов ~/.claude/projects и ~/.claude.json СОХРАНЯЮТСЯ"
Say " (удалить: -DeleteHistory)"
Remove-Target "$User\.claude\file-history" "file-history"
Remove-Target "$User\.claude\shell-snapshots" "shell-snapshots"
Remove-Target "$User\.claude\session-env" "session-env"
Remove-Target "$User\.claude\sessions" "sessions"
Remove-Target "$User\.claude\plugins" "plugins"
Remove-Target "$User\.claude\cache" "cache"
Remove-Target "$User\.claude\mcp" "mcp"
Remove-Target "$User\.claude\mcp-disabled" "mcp-disabled"
Remove-Target "$User\.claude\ide" "ide locks"
Remove-Target "$User\.claude\daemon" "daemon keys"
Remove-Target "$User\.claude\daemon.lock" "daemon.lock"
Remove-Target "$User\.claude\daemon.status.json" "daemon.status.json"
Remove-Target "$User\.claude\history.jsonl" "history.jsonl"
Remove-Target "$User\.claude\.credentials.json" "OAuth credentials"
Remove-Target "$User\.claude\.credentials.lock" ".credentials.lock"
Remove-Target "$User\.claude\.last-cleanup" ".last-cleanup"
Remove-Target "$User\.claude\.last-update-result.json" ".last-update-result.json"
Remove-Target "$User\.claude\mcp-disabled.json" "mcp-disabled.json"
} else {
Remove-Target "$User\.claude" "Claude Code home (history, sessions, creds)"
}
foreach ($f in @(
"$User\.claude.json.backup",
"$User\.claude.json.bak-rea-env",
"$User\.claude.json.bak-rea-ida",
"$User\.claude.json.rea.backup",
"$User\.claude.json.tmp.33336.1600f14d74ab",
"$User\.claude.json.tmp.33544.b6fee3a39a10")) {
Remove-Target $f (Split-Path $f -Leaf)
}
if ($DeleteHistory) {
Remove-Target "$User\.claude.json" "~/.claude.json"
} else {
Say " [keep] ~/.claude.json сохранён"
}
Remove-Target "$User\.local\bin\claude.exe" "native CLI binary"
Remove-Target "$User\.local\share\claude" "native CLI versions"

# ---------------------------------------------------------------- 4. реестр
Step "4/6 Реестр"
Remove-RegKey 'HKCU:\Software\Classes\claude' 'HKCU\Software\Classes\claude'
Remove-RegKey 'HKCU:\Software\Classes\Claude' 'HKCU\Software\Classes\Claude (MSIX)'
Remove-RegKey 'HKCU:\Software\Classes\claude-cli' 'HKCU\Software\Classes\claude-cli'
foreach ($ap in @('claude-make-data-folder.exe','claude-ssh-askpass.exe','claude-ssh-proxy.exe')) {
Remove-RegKey "HKCU:\Software\Microsoft\Windows\CurrentVersion\App Paths\$ap" "App Paths\$ap"
}

# остаточная служба
$svc2 = Get-CimInstance Win32_Service -Filter "Name='CoworkVMService'" -ErrorAction SilentlyContinue
if ($svc2) {
if (-not $Execute) { Plan "sc.exe delete CoworkVMService" }
else {
& sc.exe delete CoworkVMService | Out-Null
if ($LASTEXITCODE -eq 0) { Ok "sc.exe delete CoworkVMService" } else { Fail "sc.exe delete CoworkVMService (exit=$LASTEXITCODE)" }
}
} else { Say " [skip] служба CoworkVMService уже удалена" }

# firewall
Get-NetFirewallRule -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -eq 'Claude' } | ForEach-Object {
$rule = $_
if (-not $Execute) { Plan "firewall rule 'Claude' ($($rule.Direction) $($rule.Action))" }
else {
try { Remove-NetFirewallRule -Name $rule.Name -ErrorAction Stop; Ok "firewall rule '$($rule.Name)'" }
catch { Fail "firewall rule '$($rule.Name)' :: $($_.Exception.Message)" }
}
}

# переменные окружения
foreach ($scope in @('User', 'Machine')) {
$vars = [Environment]::GetEnvironmentVariables($scope)
foreach ($k in @($vars.Keys)) {
if ($k -match '^(CLAUDE|ANTHROPIC)') {
if (-not $Execute) { Plan "$scope env $k" }
else {
try { [Environment]::SetEnvironmentVariable($k, $null, $scope); Ok "$scope env $k" }
catch { Fail "$scope env $k :: $($_.Exception.Message)" }
}
}
}
}

# ---------------------------------------------------------------- 5. прочее
Step "5/6 Ярлыки и расширение Cursor"
Get-ChildItem "$Roam\Microsoft\Windows\Start Menu\Programs" -Recurse -Filter '*.lnk' -Force -ErrorAction SilentlyContinue |
Where-Object { $_.Name -match 'claude|anthropic' } | ForEach-Object { Remove-Target $_.FullName "shortcut $($_.Name)" }

Get-ChildItem "$User\.cursor\extensions" -Directory -Force -ErrorAction SilentlyContinue |
Where-Object { $_.Name -match '^anthropic\.|^claude' } | ForEach-Object { Remove-Target $_.FullName "cursor ext $($_.Name)" }

# ---------------------------------------------------------------- 6. корзина
Step "6/6 Корзина"
if (-not $IncludeRecycleBin) {
Say " [skip] корзина не трогается (нужен -IncludeRecycleBin)"
} else {
$rb = 'C:\' + '$Recycle.Bin'
$hits = @()
Get-ChildItem -LiteralPath $rb -Directory -Force -ErrorAction SilentlyContinue | ForEach-Object {
Get-ChildItem -LiteralPath $_.FullName -Force -Recurse -Depth 2 -ErrorAction SilentlyContinue |
Where-Object { $_.Name -match 'claude' } | ForEach-Object { $hits += $_ }
}
$top = @()
foreach ($h in $hits) {
if ($top | Where-Object { $h.FullName -like "$($_.FullName)\*" }) { continue }
$top += $h
}
if ($top.Count -eq 0) { Say " [skip] объектов с 'claude' в корзине нет" }
foreach ($h in $top) {
if (-not $Execute) { Plan "recycle: $($h.Name)" }
else {
try { Remove-Item -LiteralPath $h.FullName -Recurse -Force -ErrorAction Stop; Ok "recycle: $($h.Name)" }
catch { Fail "recycle: $($h.Name) :: $($_.Exception.Message)" }
}
}
}

# ---------------------------------------------------------------- итог
Step "Итог"
Say ("Успешно: {0} Ошибок: {1}" -f $script:Done.Count, $script:Failed.Count)
if ($script:Failed.Count) {
Say "Не удалось удалить (обычно занято процессом или нужен администратор):"
$script:Failed | ForEach-Object { Say " - $_" }
Say "Перезагрузитесь и запустите снова с -Execute."
}
if (-not $Execute) {
Say ""
Say "Это был DRY RUN. Для реального удаления:" -ForegroundColor Yellow
Say " .\cleanup_anthropic.ps1 -Execute"
}

Когда система очищена от старых идентификаторов и фоновых процессов, можно переходить к настройке чистого изолированного профиля в антидетекте.

Footnotes​

  1. machineId — локальный идентификатор установки, который приложение и CLI сохраняют при первом запуске. Переживает переустановку и смену аккаунта. ↩