import os import ctypes import subprocess from colorama import Fore, Style import sys import logging import codecs import traceback import time import random # 设置日志记录 try: sys.stdout = codecs.getwriter('utf-8')(sys.stdout.buffer, 'strict') sys.stderr = codecs.getwriter('utf-8')(sys.stderr.buffer, 'strict') except Exception as e: print(f"编码设置失败: {e}") # 确保日志目录存在 log_dir = 'logs' os.makedirs(log_dir, exist_ok=True) log_file = os.path.join(log_dir, 'full_reset_debug.log') logging.basicConfig( level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler(log_file, encoding='utf-8', mode='w'), logging.StreamHandler(sys.stdout) ] ) def pause_exit(status=0): """暂停并等待用户输入后退出""" print("\n" + "="*50) print("按回车键退出...") input() sys.exit(status) def is_admin(): try: logging.debug("检查管理员权限") result = ctypes.windll.shell32.IsUserAnAdmin() logging.debug(f"管理员权限检查结果: {result}") return result except Exception as e: logging.error(f"检查管理员权限时出错: {str(e)}") logging.error(traceback.format_exc()) return False def run_powershell_reset(): """运行 PowerShell 重置脚本""" try: logging.debug("开始准备 PowerShell 重置") # 获取并记录路径信息 storage_path = os.path.expandvars(r"%APPDATA%\Cursor\User\globalStorage\storage.json") backup_path = os.path.expandvars(r"%APPDATA%\Cursor\User\globalStorage\backups") logging.info(f"存储文件路径: {storage_path}") logging.info(f"备份目录路径: {backup_path}") # 检查文件和目录是否存在 if os.path.exists(storage_path): logging.info("存储文件存在") if not os.access(storage_path, os.W_OK): logging.error("存储文件没有写入权限") print(f"{Fore.RED}错误: 没有文件写入权限{Style.RESET_ALL}") return False else: logging.error("存储文件不存在") print(f"{Fore.RED}错误: 存储文件不存在{Style.RESET_ALL}") return False if not os.path.exists(backup_path): try: os.makedirs(backup_path) logging.info("已创建备份目录") except Exception as e: logging.error(f"创建备份目录失败: {e}") print(f"{Fore.RED}错误: 无法创建备份目录{Style.RESET_ALL}") return False # 准备 PowerShell 命令 cmd = f''' # 设置输出编码为 UTF-8 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 $OutputEncoding = [System.Text.Encoding]::UTF8 chcp 65001 | Out-Null # 配置文件路径 $STORAGE_FILE = "{storage_path}" $BACKUP_DIR = "{backup_path}" Write-Host "`e[32m[信息]`e[0m 检查 Cursor 进程..." # 检查管理员权限 function Test-Administrator {{ $user = [Security.Principal.WindowsIdentity]::GetCurrent() $principal = New-Object Security.Principal.WindowsPrincipal($user) return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) }} if (-not (Test-Administrator)) {{ Write-Host "`e[31m[错误]`e[0m 请以管理员身份运行此脚本" exit 1 }} # 创建备份目录 if (-not (Test-Path $BACKUP_DIR)) {{ New-Item -ItemType Directory -Path $BACKUP_DIR | Out-Null }} # 备份现有配置 if (Test-Path $STORAGE_FILE) {{ Write-Host "`e[32m[信息]`e[0m 正在备份配置文件..." $backupName = "storage.json.backup_$(Get-Date -Format 'yyyyMMdd_HHmmss')" Copy-Item $STORAGE_FILE "$BACKUP_DIR\\$backupName" }} # 生成新的 ID Write-Host "`e[32m[信息]`e[0m 正在生成新的 ID..." function New-StandardMachineId {{ $template = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx" $result = $template -replace '[xy]', {{ param($match) $r = [Random]::new().Next(16) $v = if ($match.Value -eq "x") {{ $r }} else {{ ($r -band 0x3) -bor 0x8 }} return $v.ToString("x") }} return $result }} $MAC_MACHINE_ID = New-StandardMachineId $UUID = [System.Guid]::NewGuid().ToString() $prefixBytes = [System.Text.Encoding]::UTF8.GetBytes("auth0|user_") $prefixHex = -join ($prefixBytes | ForEach-Object {{ [System.Convert]::ToString($_, 16).PadLeft(2, '0') }}) $randomPart = -join (1..32 | ForEach-Object {{ [Convert]::ToString((Get-Random -Minimum 0 -Maximum 256), 16).PadLeft(2, '0') }}) $MACHINE_ID = "$prefixHex$randomPart" $SQM_ID = "{{$([System.Guid]::NewGuid().ToString().ToUpper())}}" # 更新配置文件 Write-Host "`e[32m[信息]`e[0m 正在更新配置..." try {{ if (-not (Test-Path $STORAGE_FILE)) {{ Write-Host "`e[31m[错误]`e[0m 未找到配置文件: $STORAGE_FILE" exit 1 }} $originalContent = Get-Content $STORAGE_FILE -Raw -Encoding UTF8 $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 [System.IO.File]::WriteAllText( [System.IO.Path]::GetFullPath($STORAGE_FILE), $updatedJson, [System.Text.Encoding]::UTF8 ) Write-Host "`e[32m[信息]`e[0m 成功更新配置文件" # 更新系统 MachineGuid try {{ $newMachineGuid = [System.Guid]::NewGuid().ToString() $registryPath = "HKLM:\\SOFTWARE\\Microsoft\\Cryptography" # 备份原始值 $originalGuid = (Get-ItemProperty -Path $registryPath -Name "MachineGuid").MachineGuid $backupFile = "$BACKUP_DIR\\MachineGuid.backup_$(Get-Date -Format 'yyyyMMdd_HHmmss')" $originalGuid | Out-File $backupFile -Encoding UTF8 # 更新注册表 Set-ItemProperty -Path $registryPath -Name "MachineGuid" -Value $newMachineGuid Write-Host "`e[32m[信息]`e[0m 已更新系统 MachineGuid: $newMachineGuid" Write-Host "`e[32m[信息]`e[0m 原始值已备份至: $backupFile" }} catch {{ Write-Host "`e[31m[错误]`e[0m 更新系统 MachineGuid 失败: $_" }} # 显示结果 Write-Host "" Write-Host "`e[32m[信息]`e[0m 已更新配置:" Write-Host "`e[34m[调试]`e[0m machineId: $MACHINE_ID" Write-Host "`e[34m[调试]`e[0m macMachineId: $MAC_MACHINE_ID" Write-Host "`e[34m[调试]`e[0m devDeviceId: $UUID" Write-Host "`e[34m[调试]`e[0m sqmId: $SQM_ID" }} catch {{ Write-Host "`e[31m[错误]`e[0m 主要操作失败: $_" Write-Host "`e[33m[尝试]`e[0m 使用备选方法..." try {{ $tempFile = [System.IO.Path]::GetTempFileName() $config | ConvertTo-Json | Set-Content -Path $tempFile -Encoding UTF8 Copy-Item -Path $tempFile -Destination $STORAGE_FILE -Force Remove-Item -Path $tempFile Write-Host "`e[32m[信息]`e[0m 使用备选方法成功写入配置" }} catch {{ Write-Host "`e[31m[错误]`e[0m 所有尝试都失败了" Write-Host "错误详情: $_" Write-Host "目标文件: $STORAGE_FILE" Write-Host "请确保您有足够的权限访问该文件" exit 1 }} }} exit 0 ''' logging.info("准备执行 PowerShell 命令") # 执行命令并捕获输出 process = subprocess.run( ["powershell", "-NoProfile", "-NonInteractive", "-Command", cmd], capture_output=True, text=True, encoding='utf-8' ) # 记录命令输出 if process.stdout: logging.info("PowerShell 输出:") for line in process.stdout.splitlines(): logging.info(f"PS> {line}") if process.stderr: logging.error("PowerShell 错误:") for line in process.stderr.splitlines(): logging.error(f"PS Error> {line}") if process.returncode != 0: logging.error(f"PowerShell 命令执行失败,返回码: {process.returncode}") return False logging.info("PowerShell 命令执行成功") return True except subprocess.CalledProcessError as e: logging.error(f"PowerShell 脚本执行失败: {e}") logging.error(f"返回码: {e.returncode}") if hasattr(e, 'stdout') and e.stdout: logging.error(f"标准输出: {e.stdout}") if hasattr(e, 'stderr') and e.stderr: logging.error(f"标准错误: {e.stderr}") logging.error(traceback.format_exc()) return False except Exception as e: logging.error(f"执行过程中出错: {str(e)}") logging.error(traceback.format_exc()) return False def full_system_reset(): """执行完整的系统重置""" try: # 检查管理员权限 if not is_admin(): logging.error("需要管理员权限") return False # 运行重置 logging.info("开始执行完整重置...") if run_powershell_reset(): logging.info("重置完成") return True else: logging.error("重置失败") return False except Exception as e: logging.error(f"系统重置出错: {str(e)}") logging.error(traceback.format_exc()) return False if __name__ == "__main__": try: # 检查管理员权限 if not is_admin(): print(f"{Fore.RED}[错误] 请以管理员身份运行此程序{Style.RESET_ALL}") print(f"{Fore.YELLOW}[提示] 请右键点击程序,选择'以管理员身份运行'{Style.RESET_ALL}") pause_exit(1) # 运行重置 print(f"{Fore.CYAN}[信息] 开始执行完整重置...{Style.RESET_ALL}") if full_system_reset(): print(f"{Fore.GREEN}[成功] 重置完成!{Style.RESET_ALL}") print(f"{Fore.YELLOW}[提示] 请重启 Cursor 以应用新的配置{Style.RESET_ALL}") else: print(f"{Fore.RED}[错误] 重置失败{Style.RESET_ALL}") except Exception as e: logging.error(f"程序执行出错: {str(e)}") logging.error(traceback.format_exc()) print(f"{Fore.RED}[错误] 程序执行出现异常: {str(e)}{Style.RESET_ALL}") finally: pause_exit()