kairi 发表于 2025-11-8 19:57:19

无限免费试用 Cursor Pro:单账号避开设备限制

如何仅用一个账号无限免费试用 Cursor Pro,避免“此设备已使用过多免费试用账号”检测

kimmm 发表于 2025-11-8 20:26:05

nb,666666

shadownet 发表于 2025-11-8 20:31:45

蚌,我还以为是教程,结果是求助{tieba33}

菊部地区小雨 发表于 2025-11-8 21:10:11

这个需要重置cursor机器码的,分别是两个系统的。。。

Windows:# 设置输出编码为 UTF-8
$OutputEncoding = ::UTF8
::OutputEncoding = ::UTF8

# 颜色定义
$RED = "`e[31m"
$GREEN = "`e[32m"
$YELLOW = "`e[33m"
$BLUE = "`e[34m"
$NC = "`e[0m"

# 配置文件路径
$STORAGE_FILE = "$env:APPDATA\Cursor\User\globalStorage\storage.json"
$BACKUP_DIR = "$env:APPDATA\Cursor\User\globalStorage\backups"

# 检查管理员权限
function Test-Administrator {
    $user = ::GetCurrent()
    $principal = New-Object Security.Principal.WindowsPrincipal($user)
    return $principal.IsInRole(::Administrator)
}

if (-not (Test-Administrator)) {
    Write-Host "$RED[错误]$NC 请以管理员身份运行此脚本"
    Write-Host "请右键点击脚本,选择'以管理员身份运行'"
    Read-Host "按回车键退出"
    exit 1
}

# 显示 Logo
Clear-Host
Write-Host @"

    ██████╗██╗   ██╗██████╗ ███████╗ ██████╗ ██████╗
   ██╔════╝██║   ██║██╔══██╗██╔════╝██╔═══██╗██╔══██╗
   ██║   ██║   ██║██████╔╝███████╗██║   ██║██████╔╝
   ██║   ██║   ██║██╔══██╗╚════██║██║   ██║██╔══██╗
   ╚██████╗╚██████╔╝██║██║███████║╚██████╔╝██║██║
    ╚═════╝ ╚═════╝ ╚═╝╚═╝╚══════╝ ╚═════╝ ╚═╝╚═╝

"@
Write-Host "$BLUE================================$NC"
Write-Host "$BLUE================================$NC"
Write-Host ""

# 获取并显示 Cursor 版本
function Get-CursorVersion {
    try {
      # 主要检测路径
      $packagePath = "$env:LOCALAPPDATA\Programs\cursor\resources\app\package.json"
      
      if (Test-Path $packagePath) {
            $packageJson = Get-Content $packagePath -Raw | ConvertFrom-Json
            if ($packageJson.version) {
                Write-Host "$GREEN[信息]$NC 当前安装的 Cursor 版本: v$($packageJson.version)"
                return $packageJson.version
            }
      }

      # 备用路径检测
      $altPath = "$env:LOCALAPPDATA\cursor\resources\app\package.json"
      if (Test-Path $altPath) {
            $packageJson = Get-Content $altPath -Raw | ConvertFrom-Json
            if ($packageJson.version) {
                Write-Host "$GREEN[信息]$NC 当前安装的 Cursor 版本: v$($packageJson.version)"
                return $packageJson.version
            }
      }

      Write-Host "$YELLOW[警告]$NC 无法检测到 Cursor 版本"
      Write-Host "$YELLOW[提示]$NC 请确保 Cursor 已正确安装"
      return $null
    }
    catch {
      Write-Host "$RED[错误]$NC 获取 Cursor 版本失败: $_"
      return $null
    }
}

# 获取并显示版本信息
$cursorVersion = Get-CursorVersion
Write-Host ""

Write-Host "$YELLOW[重要提示]$NC 最新的 0.49.x (以支持)"
Write-Host ""

# 检查并关闭 Cursor 进程
Write-Host "$GREEN[信息]$NC 检查 Cursor 进程..."

function Get-ProcessDetails {
    param($processName)
    Write-Host "$BLUE[调试]$NC 正在获取 $processName 进程详细信息:"
    Get-WmiObject Win32_Process -Filter "name='$processName'" |
      Select-Object ProcessId, ExecutablePath, CommandLine |
      Format-List
}

# 定义最大重试次数和等待时间
$MAX_RETRIES = 5
$WAIT_TIME = 1

# 处理进程关闭
function Close-CursorProcess {
    param($processName)
   
    $process = Get-Process -Name $processName -ErrorAction SilentlyContinue
    if ($process) {
      Write-Host "$YELLOW[警告]$NC 发现 $processName 正在运行"
      Get-ProcessDetails $processName
      
      Write-Host "$YELLOW[警告]$NC 尝试关闭 $processName..."
      Stop-Process -Name $processName -Force
      
      $retryCount = 0
      while ($retryCount -lt $MAX_RETRIES) {
            $process = Get-Process -Name $processName -ErrorAction SilentlyContinue
            if (-not $process) { break }
            
            $retryCount++
            if ($retryCount -ge $MAX_RETRIES) {
                Write-Host "$RED[错误]$NC 在 $MAX_RETRIES 次尝试后仍无法关闭 $processName"
                Get-ProcessDetails $processName
                Write-Host "$RED[错误]$NC 请手动关闭进程后重试"
                Read-Host "按回车键退出"
                exit 1
            }
            Write-Host "$YELLOW[警告]$NC 等待进程关闭,尝试 $retryCount/$MAX_RETRIES..."
            Start-Sleep -Seconds $WAIT_TIME
      }
      Write-Host "$GREEN[信息]$NC $processName 已成功关闭"
    }
}

# 关闭所有 Cursor 进程
Close-CursorProcess "Cursor"
Close-CursorProcess "cursor"

# 创建备份目录
if (-not (Test-Path $BACKUP_DIR)) {
    New-Item -ItemType Directory -Path $BACKUP_DIR | Out-Null
}

# 备份现有配置
if (Test-Path $STORAGE_FILE) {
    Write-Host "$GREEN[信息]$NC 正在备份配置文件..."
    $backupName = "storage.json.backup_$(Get-Date -Format 'yyyyMMdd_HHmmss')"
    Copy-Item $STORAGE_FILE "$BACKUP_DIR\$backupName"
}

# 生成新的 ID
Write-Host "$GREEN[信息]$NC 正在生成新的 ID..."

# 在颜色定义后添加此函数
function Get-RandomHex {
    param (
      $length
    )
   
    $bytes = New-Object byte[] ($length)
    $rng = ::new()
    $rng.GetBytes($bytes)
    $hexString = ::ToString($bytes) -replace '-',''
    $rng.Dispose()
    return $hexString
}

# 改进 ID 生成函数
function New-StandardMachineId {
    $template = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
    $result = $template -replace '', {
      param($match)
      $r = ::new().Next(16)
      $v = if ($match.Value -eq "x") { $r } else { ($r -band 0x3) -bor 0x8 }
      return $v.ToString("x")
    }
    return $result
}

# 在生成 ID 时使用新函数
$MAC_MACHINE_ID = New-StandardMachineId
$UUID = ::NewGuid().ToString()
# 将 auth0|user_ 转换为字节数组的十六进制
$prefixBytes = ::UTF8.GetBytes("auth0|user_")
$prefixHex = -join ($prefixBytes | ForEach-Object { '{0:x2}' -f $_ })
# 生成32字节(64个十六进制字符)的随机数作为 machineId 的随机部分
$randomPart = Get-RandomHex -length 32
$MACHINE_ID = "$prefixHex$randomPart"
$SQM_ID = "{$(::NewGuid().ToString().ToUpper())}"

# 在Update-MachineGuid函数前添加权限检查
if (-NOT (::GetCurrent()).IsInRole( "Administrator")) {
    Write-Host "$RED[错误]$NC 请使用管理员权限运行此脚本"
    Start-Process powershell "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
    exit
}

function Update-MachineGuid {
    try {
      # 检查注册表路径是否存在,不存在则创建
      $registryPath = "HKLM:\SOFTWARE\Microsoft\Cryptography"
      if (-not (Test-Path $registryPath)) {
            Write-Host "$YELLOW[警告]$NC 注册表路径不存在: $registryPath,正在创建..."
            New-Item -Path $registryPath -Force | Out-Null
            Write-Host "$GREEN[信息]$NC 注册表路径创建成功"
      }

      # 获取当前的 MachineGuid,如果不存在则使用空字符串作为默认值
      $originalGuid = ""
      try {
            $currentGuid = Get-ItemProperty -Path $registryPath -Name MachineGuid -ErrorAction SilentlyContinue
            if ($currentGuid) {
                $originalGuid = $currentGuid.MachineGuid
                Write-Host "$GREEN[信息]$NC 当前注册表值:"
                Write-Host "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography"
                Write-Host "    MachineGuid    REG_SZ    $originalGuid"
            } else {
                Write-Host "$YELLOW[警告]$NC MachineGuid 值不存在,将创建新值"
            }
      } catch {
            Write-Host "$YELLOW[警告]$NC 获取 MachineGuid 失败: $($_.Exception.Message)"
      }

      # 创建备份目录(如果不存在)
      if (-not (Test-Path $BACKUP_DIR)) {
            New-Item -ItemType Directory -Path $BACKUP_DIR -Force | Out-Null
      }

      # 创建备份文件(仅当原始值存在时)
      if ($originalGuid) {
            $backupFile = "$BACKUP_DIR\MachineGuid_$(Get-Date -Format 'yyyyMMdd_HHmmss').reg"
            $backupResult = Start-Process "reg.exe" -ArgumentList "export", "`"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography`"", "`"$backupFile`"" -NoNewWindow -Wait -PassThru
            
            if ($backupResult.ExitCode -eq 0) {
                Write-Host "$GREEN[信息]$NC 注册表项已备份到:$backupFile"
            } else {
                Write-Host "$YELLOW[警告]$NC 备份创建失败,继续执行..."
            }
      }

      # 生成新GUID
      $newGuid = ::NewGuid().ToString()

      # 更新或创建注册表值
      Set-ItemProperty -Path $registryPath -Name MachineGuid -Value $newGuid -Force -ErrorAction Stop
      
      # 验证更新
      $verifyGuid = (Get-ItemProperty -Path $registryPath -Name MachineGuid -ErrorAction Stop).MachineGuid
      if ($verifyGuid -ne $newGuid) {
            throw "注册表验证失败:更新后的值 ($verifyGuid) 与预期值 ($newGuid) 不匹配"
      }

      Write-Host "$GREEN[信息]$NC 注册表更新成功:"
      Write-Host "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography"
      Write-Host "    MachineGuid    REG_SZ    $newGuid"
      return $true
    }
    catch {
      Write-Host "$RED[错误]$NC 注册表操作失败:$($_.Exception.Message)"
      
      # 尝试恢复备份(如果存在)
      if (($backupFile -ne $null) -and (Test-Path $backupFile)) {
            Write-Host "$YELLOW[恢复]$NC 正在从备份恢复..."
            $restoreResult = Start-Process "reg.exe" -ArgumentList "import", "`"$backupFile`"" -NoNewWindow -Wait -PassThru
            
            if ($restoreResult.ExitCode -eq 0) {
                Write-Host "$GREEN[恢复成功]$NC 已还原原始注册表值"
            } else {
                Write-Host "$RED[错误]$NC 恢复失败,请手动导入备份文件:$backupFile"
            }
      } else {
            Write-Host "$YELLOW[警告]$NC 未找到备份文件或备份创建失败,无法自动恢复"
      }
      return $false
    }
}

# 创建或更新配置文件
Write-Host "$GREEN[信息]$NC 正在更新配置..."

try {
    # 检查配置文件是否存在
    if (-not (Test-Path $STORAGE_FILE)) {
      Write-Host "$RED[错误]$NC 未找到配置文件: $STORAGE_FILE"
      Write-Host "$YELLOW[提示]$NC 请先安装并运行一次 Cursor 后再使用此脚本"
      Read-Host "按回车键退出"
      exit 1
    }

    # 读取现有配置文件
    try {
      $originalContent = Get-Content $STORAGE_FILE -Raw -Encoding UTF8
      
      # 将 JSON 字符串转换为 PowerShell 对象
      $config = $originalContent | ConvertFrom-Json

      # 备份当前值
      $oldValues = @{
            'machineId' = $config.'telemetry.machineId'
            'macMachineId' = $config.'telemetry.macMachineId'
            'devDeviceId' = $config.'telemetry.devDeviceId'
            'sqmId' = $config.'telemetry.sqmId'
      }

      # 更新特定的值
      $config.'telemetry.machineId' = $MACHINE_ID
      $config.'telemetry.macMachineId' = $MAC_MACHINE_ID
      $config.'telemetry.devDeviceId' = $UUID
      $config.'telemetry.sqmId' = $SQM_ID

      # 将更新后的对象转换回 JSON 并保存
      $updatedJson = $config | ConvertTo-Json -Depth 10
      ::WriteAllText(
            ::GetFullPath($STORAGE_FILE),
            $updatedJson,
            ::UTF8
      )
      Write-Host "$GREEN[信息]$NC 成功更新配置文件"
    } catch {
      # 如果出错,尝试恢复原始内容
      if ($originalContent) {
            ::WriteAllText(
                ::GetFullPath($STORAGE_FILE),
                $originalContent,
                ::UTF8
            )
      }
      throw "处理 JSON 失败: $_"
    }
    # 直接执行更新 MachineGuid,不再询问
    Update-MachineGuid
    # 显示结果
    Write-Host ""
    Write-Host "$GREEN[信息]$NC 已更新配置:"
    Write-Host "$BLUE[调试]$NC machineId: $MACHINE_ID"
    Write-Host "$BLUE[调试]$NC macMachineId: $MAC_MACHINE_ID"
    Write-Host "$BLUE[调试]$NC devDeviceId: $UUID"
    Write-Host "$BLUE[调试]$NC sqmId: $SQM_ID"

    # 显示文件树结构
    Write-Host ""
    Write-Host "$GREEN[信息]$NC 文件结构:"
    Write-Host "$BLUE$env:APPDATA\Cursor\User$NC"
    Write-Host "├── globalStorage"
    Write-Host "│   ├── storage.json (已修改)"
    Write-Host "│   └── backups"

    # 列出备份文件
    $backupFiles = Get-ChildItem "$BACKUP_DIR\*" -ErrorAction SilentlyContinue
    if ($backupFiles) {
      foreach ($file in $backupFiles) {
            Write-Host "│       └── $($file.Name)"
      }
    } else {
      Write-Host "│       └── (空)"
    }

    # 显示公众号信息
    Write-Host ""
    Write-Host "$GREEN================================$NC"
    Write-Host "$GREEN================================$NC"
    Write-Host ""
    Write-Host "$GREEN[信息]$NC 请重启 Cursor 以应用新的配置"
    Write-Host ""

    # 询问是否要禁用自动更新
    Write-Host ""
    Write-Host "$YELLOW[询问]$NC 是否要禁用 Cursor 自动更新功能?"
    Write-Host "0) 否 - 保持默认设置 (按回车键)"
    Write-Host "1) 是 - 禁用自动更新"
    $choice = Read-Host "请输入选项 (0)"

    if ($choice -eq "1") {
      Write-Host ""
      Write-Host "$GREEN[信息]$NC 正在处理自动更新..."
      $updaterPath = "$env:LOCALAPPDATA\cursor-updater"

      # 定义手动设置教程
      function Show-ManualGuide {
            Write-Host ""
            Write-Host "$YELLOW[警告]$NC 自动设置失败,请尝试手动操作:"
            Write-Host "$YELLOW手动禁用更新步骤:$NC"
            Write-Host "1. 以管理员身份打开 PowerShell"
            Write-Host "2. 复制粘贴以下命令:"
            Write-Host "$BLUE命令1 - 删除现有目录(如果存在):$NC"
            Write-Host "Remove-Item -Path `"$updaterPath`" -Force -Recurse -ErrorAction SilentlyContinue"
            Write-Host ""
            Write-Host "$BLUE命令2 - 创建阻止文件:$NC"
            Write-Host "New-Item -Path `"$updaterPath`" -ItemType File -Force | Out-Null"
            Write-Host ""
            Write-Host "$BLUE命令3 - 设置只读属性:$NC"
            Write-Host "Set-ItemProperty -Path `"$updaterPath`" -Name IsReadOnly -Value `$true"
            Write-Host ""
            Write-Host "$BLUE命令4 - 设置权限(可选):$NC"
            Write-Host "icacls `"$updaterPath`" /inheritance:r /grant:r `"`$($env:USERNAME):(R)`""
            Write-Host ""
            Write-Host "$YELLOW验证方法:$NC"
            Write-Host "1. 运行命令:Get-ItemProperty `"$updaterPath`""
            Write-Host "2. 确认 IsReadOnly 属性为 True"
            Write-Host "3. 运行命令:icacls `"$updaterPath`""
            Write-Host "4. 确认只有读取权限"
            Write-Host ""
            Write-Host "$YELLOW[提示]$NC 完成后请重启 Cursor"
      }

      try {
            # 检查cursor-updater是否存在
            if (Test-Path $updaterPath) {
                # 如果是文件,说明已经创建了阻止更新
                if ((Get-Item $updaterPath) -is ) {
                  Write-Host "$GREEN[信息]$NC 已创建阻止更新文件,无需再次阻止"
                  return
                }
                # 如果是目录,尝试删除
                else {
                  try {
                        Remove-Item -Path $updaterPath -Force -Recurse -ErrorAction Stop
                        Write-Host "$GREEN[信息]$NC 成功删除 cursor-updater 目录"
                  }
                  catch {
                        Write-Host "$RED[错误]$NC 删除 cursor-updater 目录失败"
                        Show-ManualGuide
                        return
                  }
                }
            }

            # 创建阻止文件
            try {
                New-Item -Path $updaterPath -ItemType File -Force -ErrorAction Stop | Out-Null
                Write-Host "$GREEN[信息]$NC 成功创建阻止文件"
            }
            catch {
                Write-Host "$RED[错误]$NC 创建阻止文件失败"
                Show-ManualGuide
                return
            }

            # 设置文件权限
            try {
                # 设置只读属性
                Set-ItemProperty -Path $updaterPath -Name IsReadOnly -Value $true -ErrorAction Stop
               
                # 使用 icacls 设置权限
                $result = Start-Process "icacls.exe" -ArgumentList "`"$updaterPath`" /inheritance:r /grant:r `"$($env:USERNAME):(R)`"" -Wait -NoNewWindow -PassThru
                if ($result.ExitCode -ne 0) {
                  throw "icacls 命令失败"
                }
               
                Write-Host "$GREEN[信息]$NC 成功设置文件权限"
            }
            catch {
                Write-Host "$RED[错误]$NC 设置文件权限失败"
                Show-ManualGuide
                return
            }

            # 验证设置
            try {
                $fileInfo = Get-ItemProperty $updaterPath
                if (-not $fileInfo.IsReadOnly) {
                  Write-Host "$RED[错误]$NC 验证失败:文件权限设置可能未生效"
                  Show-ManualGuide
                  return
                }
            }
            catch {
                Write-Host "$RED[错误]$NC 验证设置失败"
                Show-ManualGuide
                return
            }

            Write-Host "$GREEN[信息]$NC 成功禁用自动更新"
      }
      catch {
            Write-Host "$RED[错误]$NC 发生未知错误: $_"
            Show-ManualGuide
      }
    }
    else {
      Write-Host "$GREEN[信息]$NC 保持默认设置,不进行更改"
    }

    # 保留有效的注册表更新
    Update-MachineGuid

} catch {
    Write-Host "$RED[错误]$NC 主要操作失败: $_"
    Write-Host "$YELLOW[尝试]$NC 使用备选方法..."
   
    try {
      # 备选方法:使用 Add-Content
      $tempFile = ::GetTempFileName()
      $config | ConvertTo-Json | Set-Content -Path $tempFile -Encoding UTF8
      Copy-Item -Path $tempFile -Destination $STORAGE_FILE -Force
      Remove-Item -Path $tempFile
      Write-Host "$GREEN[信息]$NC 使用备选方法成功写入配置"
    } catch {
      Write-Host "$RED[错误]$NC 所有尝试都失败了"
      Write-Host "错误详情: $_"
      Write-Host "目标文件: $STORAGE_FILE"
      Write-Host "请确保您有足够的权限访问该文件"
      Read-Host "按回车键退出"
      exit 1
    }
}

Write-Host ""
Read-Host "按回车键退出"
exit 0

# 在文件写入部分修改
function Write-ConfigFile {
    param($config, $filePath)
   
    try {
      # 使用 UTF8 无 BOM 编码
      $utf8NoBom = New-Object System.Text.UTF8Encoding $false
      $jsonContent = $config | ConvertTo-Json -Depth 10
      
      # 统一使用 LF 换行符
      $jsonContent = $jsonContent.Replace("`r`n", "`n")
      
      ::WriteAllText(
            ::GetFullPath($filePath),
            $jsonContent,
            $utf8NoBom
      )
      
      Write-Host "$GREEN[信息]$NC 成功写入配置文件(UTF8 无 BOM)"
    }
    catch {
      throw "写入配置文件失败: $_"
    }
}

# 获取并显示版本信息
$cursorVersion = Get-CursorVersion
Write-Host ""
if ($cursorVersion) {
    Write-Host "$GREEN[信息]$NC 检测到 Cursor 版本: $cursorVersion,继续执行..."
} else {
    Write-Host "$YELLOW[警告]$NC 无法检测版本,将继续执行..."
}macOS:# --- Terminal Colors and Formatting ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
DIM='\033[2m'
NC='\033[0m' # No Color
TICK="${GREEN}✓${NC}"
CROSS="${RED}✗${NC}"
INFO="${BLUE}ℹ${NC}"
WARN="${YELLOW}⚠${NC}"

# --- Spinner Animation ---
spinner() {
    local pid=$1
    local delay=0.1
    local spinstr='|/-\'
    local msg="$2"
    printf "${DIM}%s" "$msg"
    while kill -0 $pid 2>/dev/null; do
      local temp=${spinstr#?}
      printf "\r${CYAN}[%c]${NC} %s" "$spinstr" "$msg"
      local spinstr=$temp${spinstr%"$temp"}
      sleep $delay
    done
    printf "\r${TICK} %s\n" "$msg"
}

# --- Progress Bar ---
progress_bar() {
    local duration=$1
    local msg="$2"
    local width=40
    local progress=0
    local fill
    local remain
   
    echo -ne "\n${msg}\n"
    while [ $progress -le 100 ]; do
      let fill=($width*$progress/100)
      let remain=$width-$fill
      printf "\r${CYAN}[${NC}"
      printf "%${fill}s" '' | tr ' ' '█'
      printf "%${remain}s" '' | tr ' ' '░'
      printf "${CYAN}]${NC} ${progress}%%"
      progress=$((progress + 2))
      sleep 0.06# Adjusted for macOS
    done
    echo -e "\n"
}

# --- Fancy Print Functions ---
print_header() {
    clear
    echo -e "\n${CYAN}════════════════════════════════════════════════════════════════════${NC}"
    echo -e "${BOLD}${BLUE}         Cursor Cleaner & Identity Reset Script for macOS${NC}"
    echo -e "${CYAN}════════════════════════════════════════════════════════════════════${NC}\n"
}

print_section() {
    echo -e "\n${MAGENTA}▓▒░ ${BOLD}$1${NC} ${MAGENTA}░▒▓${NC}"
    echo -e "${DIM}${MAGENTA}──────────────────────────────────────────${NC}\n"
}

print_warning() {
    echo -e "${WARN} ${YELLOW}$1${NC}"
}

print_info() {
    echo -e "${INFO} ${BLUE}$1${NC}"
}

print_success() {
    echo -e "${TICK} ${GREEN}$1${NC}"
}

print_error() {
    echo -e "${CROSS} ${RED}$1${NC}" >&2
}

# --- Function for running commands with sudo ---
run_sudo() {
    echo -e "${INFO} Running: ${CYAN}$@${NC}"
    if ! sudo "$@"; then
      print_error "Failed to execute sudo command: '$@'"
    fi
}

# --- Initial Checks and Confirmation ---
print_header

# Check if running on macOS
if [[ "$OSTYPE" != "darwin"* ]]; then
    print_error "This script is designed for macOS only!"
    exit 1
fi

# Display warnings
print_section "IMPORTANT WARNINGS"
print_warning "This script performs destructive operations that cannot be undone!"
print_warning "All Cursor settings and data will be permanently deleted."
print_warning "A system restart is recommended after completion."
echo

# Display actions
print_section "ACTIONS TO BE PERFORMED"
print_info "1. Stop running Cursor processes"
print_info "2. Remove Cursor.app from Applications"
print_info "3. Delete configuration and cache data"
print_info "4. Clean up system preferences"
print_info "5. Clear launch services database"
print_info "6. Remove quarantine attributes"
echo

# Get confirmation
echo -e "${YELLOW}${BOLD}Do you understand and accept the risks?${NC}"
read -p "Type 'YES' in uppercase to confirm: " CONFIRMATION
if [[ "$CONFIRMATION" != "YES" ]]; then
    print_error "Operation cancelled by user"
    exit 1
fi

# --- Main Operations ---
print_section "STARTING CLEANUP PROCESS"

# Stop Cursor Process
print_info "Stopping Cursor processes..."
(pkill -f "Cursor" 2>/dev/null || true) &
spinner $! "Terminating running instances"

# Wait a moment for processes to terminate
sleep 2

# Remove Application
print_info "Removing Cursor application..."
if [ -d "/Applications/Cursor.app" ]; then
    (sudo rm -rf "/Applications/Cursor.app") &
    spinner $! "Removing Cursor.app from Applications"
else
    print_info "Cursor.app not found in /Applications"
fi

# Check for app in user Applications folder
if [ -d "$HOME/Applications/Cursor.app" ]; then
    (rm -rf "$HOME/Applications/Cursor.app") &
    spinner $! "Removing Cursor.app from user Applications"
fi

# Remove User Config/Data with progress simulation
print_section "CLEANING USER DATA"

# macOS specific directories
CONFIG_DIRS=(
    "$HOME/Library/Application Support/Cursor"
    "$HOME/Library/Caches/Cursor"
    "$HOME/Library/Caches/com.todesktop.230313mzl4w4u92"
    "$HOME/Library/Preferences/com.todesktop.230313mzl4w4u92.plist"
    "$HOME/Library/Preferences/cursor.plist"
    "$HOME/Library/Saved Application State/com.todesktop.230313mzl4w4u92.savedState"
    "$HOME/Library/WebKit/Cursor"
    "$HOME/Library/HTTPStorages/com.todesktop.230313mzl4w4u92"
    "$HOME/.cursor"
    "$HOME/.cursor-server"
)

progress_bar 3 "Removing configuration directories..."
for item in "${CONFIG_DIRS[@]}"; do
    if [ -e "$item" ]; then
      rm -rf "$item"
      print_success "Removed: $(basename "$item")"
    else
      print_info "Skipped: $(basename "$item") (not found)"
    fi
done

# Clean up LaunchAgents
print_section "CLEANING LAUNCH AGENTS"
LAUNCH_AGENTS=(
    "$HOME/Library/LaunchAgents/com.todesktop.230313mzl4w4u92.plist"
    "$HOME/Library/LaunchAgents/cursor.plist"
)

for agent in "${LAUNCH_AGENTS[@]}"; do
    if [ -f "$agent" ]; then
      launchctl unload "$agent" 2>/dev/null
      rm -f "$agent"
      print_success "Removed launch agent: $(basename "$agent")"
    fi
done

# # Clear Quarantine Attributes
# print_section "CLEARING SYSTEM ATTRIBUTES"
# print_info "Removing quarantine attributes..."
# sudo xattr -r -d com.apple.quarantine /Applications/Cursor.app 2>/dev/null || true

# Reset Launch Services Database
print_info "Resetting Launch Services database..."
(
    /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister \
    -kill -r -domain local -domain system -domain user
) &
spinner $! "Rebuilding Launch Services"

# Clear DNS Cache (might help with online verification)
print_section "CLEARING SYSTEM CACHES"
print_info "Flushing DNS cache..."
sudo dscacheutil -flushcache 2>/dev/null &
spinner $! "Flushing DNS"

# Clear Spotlight Index for Cursor
# print_info "Clearing Spotlight index..."
# sudo mdutil -E / 2>/dev/null || true

# Clear Keychain entries
print_section "CLEANING KEYCHAIN"
print_info "Removing Cursor keychain entries..."
security delete-generic-password -s "Cursor" 2>/dev/null || true
security delete-generic-password -s "com.todesktop.230313mzl4w4u92" 2>/dev/null || true

# System Information
print_section "SYSTEM INFORMATION"
echo -e "${CYAN}Hardware UUID:${NC}"
system_profiler SPHardwareDataType | grep "Hardware UUID" | awk '{print $3}'
echo -e "\n${DIM}Note: Hardware UUID cannot be changed without significant system modifications${NC}"

# Final Cleanup
print_section "FINAL CLEANUP"
progress_bar 2 "Cleaning system caches..."

# Empty Trash (optional - commented out for safety)
# osascript -e 'tell application "Finder" to empty trash' 2>/dev/null || true

# Final Instructions
echo -e "\n${CYAN}════════════════════════════════════════════════════════════════════${NC}"
echo -e "${GREEN}${BOLD}               ✨ CLEANUP COMPLETE! ✨${NC}"
echo -e "${CYAN}════════════════════════════════════════════════════════════════════${NC}\n"

print_warning "A SYSTEM RESTART IS RECOMMENDED TO COMPLETE THE PROCESS"
print_info "Some changes may not take effect until after restart"
echo -e "\n${BOLD}Would you like to restart now? ${NC}(y/N): "
read -n 1 -r
echo
if [[ $REPLY =~ ^$ ]]; then
    echo -e "\n${YELLOW}System will restart in 10 seconds...${NC}"
    echo -e "${DIM}Press Ctrl+C to cancel${NC}"
    sleep 10
    sudo shutdown -r now
else
    print_info "Please remember to restart your system manually"
    print_info "You can restart using: ${CYAN}sudo shutdown -r now${NC}"
    print_info "Or via Apple Menu > Restart"
fi

exit 0

lkings 发表于 2025-11-9 10:38:41

还是求助啊?

XTian 发表于 2025-11-9 16:21:33

菊部地区小雨 发表于 2025-11-8 21:10
这个需要重置cursor机器码的,分别是两个系统的。。。

Windows:macOS:


强的

hualy13 发表于 2025-11-9 16:39:03

这必须得看!!

npcoci 发表于 2025-11-10 11:20:40

666666

梨子精 发表于 2025-11-10 13:23:14

菊部地区小雨 发表于 2025-11-8 21:10
这个需要重置cursor机器码的,分别是两个系统的。。。

Windows:macOS:


谢谢
页: [1]
查看完整版本: 无限免费试用 Cursor Pro:单账号避开设备限制