diff --git a/scripts/run/cursor_win_id_modifier.ps1 b/scripts/run/cursor_win_id_modifier.ps1 index 7fdcec6..7354d8e 100644 --- a/scripts/run/cursor_win_id_modifier.ps1 +++ b/scripts/run/cursor_win_id_modifier.ps1 @@ -113,18 +113,34 @@ if (Test-Path $STORAGE_FILE) { # 生成新的 ID Write-Host "$GREEN[信息]$NC 正在生成新的 ID..." -# 生成随机字节数组并转换为十六进制字符串的函数 +# 在颜色定义后添加此函数 function Get-RandomHex { param ( [int]$length ) - $bytes = New-Object byte[] $length + + $bytes = New-Object byte[] ($length) $rng = [System.Security.Cryptography.RNGCryptoServiceProvider]::new() $rng.GetBytes($bytes) + $hexString = [System.BitConverter]::ToString($bytes) -replace '-','' $rng.Dispose() - return -join ($bytes | ForEach-Object { '{0:x2}' -f $_ }) + return $hexString } +# 改进 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 +} + +# 在生成 ID 时使用新函数 +$MAC_MACHINE_ID = New-StandardMachineId $UUID = [System.Guid]::NewGuid().ToString() # 将 auth0|user_ 转换为字节数组的十六进制 $prefixBytes = [System.Text.Encoding]::UTF8.GetBytes("auth0|user_") @@ -132,9 +148,31 @@ $prefixHex = -join ($prefixBytes | ForEach-Object { '{0:x2}' -f $_ }) # 生成32字节(64个十六进制字符)的随机数作为 machineId 的随机部分 $randomPart = Get-RandomHex -length 32 $MACHINE_ID = "$prefixHex$randomPart" -$MAC_MACHINE_ID = Get-RandomHex -length 32 $SQM_ID = "{$([System.Guid]::NewGuid().ToString().ToUpper())}" +# 在生成新ID后直接执行注册表操作,移除询问 +function Update-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 "$GREEN[信息]$NC 已更新系统 MachineGuid: $newMachineGuid" + Write-Host "$GREEN[信息]$NC 原始值已备份至: $backupFile" + } + catch { + Write-Host "$RED[错误]$NC 更新系统 MachineGuid 失败: $_" + } +} + + + # 创建或更新配置文件 Write-Host "$GREEN[信息]$NC 正在更新配置..." @@ -187,63 +225,152 @@ try { } 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" - # 尝试设置文件权限 - try { - # 使用当前用户名和域名 - $currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent() - $userAccount = "$($env:USERDOMAIN)\$($env:USERNAME)" - - # 创建新的访问控制列表 - $acl = New-Object System.Security.AccessControl.FileSecurity - - # 添加当前用户的只读权限 - $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule( - $userAccount, # 使用域名\用户名格式 - [System.Security.AccessControl.FileSystemRights]::ReadAndExecute, # 改为只读权限 - [System.Security.AccessControl.InheritanceFlags]::None, - [System.Security.AccessControl.PropagationFlags]::None, - [System.Security.AccessControl.AccessControlType]::Allow - ) - - try { - $acl.AddAccessRule($accessRule) - Set-Acl -Path $STORAGE_FILE -AclObject $acl -ErrorAction Stop - Write-Host "$GREEN[信息]$NC 成功设置文件只读权限" - - # 设置文件为只读属性 - Set-ItemProperty -Path $STORAGE_FILE -Name IsReadOnly -Value $true - Write-Host "$GREEN[信息]$NC 成功设置文件只读属性" - } catch { - # 如果第一种方法失败,尝试使用 icacls - Write-Host "$YELLOW[警告]$NC 使用备选方法设置权限..." - $result = Start-Process "icacls.exe" -ArgumentList "`"$STORAGE_FILE`" /grant `"$($env:USERNAME):(R)`"" -Wait -NoNewWindow -PassThru - if ($result.ExitCode -eq 0) { - Write-Host "$GREEN[信息]$NC 成功使用 icacls 设置文件只读权限" - # 设置文件为只读属性 - Set-ItemProperty -Path $STORAGE_FILE -Name IsReadOnly -Value $true - Write-Host "$GREEN[信息]$NC 成功设置文件只读属性" - } else { - Write-Host "$YELLOW[警告]$NC 设置文件权限失败,但文件已写入成功" - } + # 显示文件树结构 + 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)" } - } catch { - Write-Host "$YELLOW[警告]$NC 设置文件权限失败: $_" - Write-Host "$YELLOW[警告]$NC 尝试使用 icacls 命令..." + } else { + Write-Host "│ └── (空)" + } + + # 显示公众号信息 + Write-Host "" + Write-Host "$GREEN================================$NC" + Write-Host "$YELLOW 关注公众号【煎饼果子卷AI】一起交流更多Cursor技巧和AI知识 $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 { - $result = Start-Process "icacls.exe" -ArgumentList "`"$STORAGE_FILE`" /grant `"$($env:USERNAME):(R)`"" -Wait -NoNewWindow -PassThru - if ($result.ExitCode -eq 0) { - Write-Host "$GREEN[信息]$NC 成功使用 icacls 设置文件只读权限" - # 设置文件为只读属性 - Set-ItemProperty -Path $STORAGE_FILE -Name IsReadOnly -Value $true - Write-Host "$GREEN[信息]$NC 成功设置文件只读属性" - } else { - Write-Host "$YELLOW[警告]$NC 所有权限设置方法都失败,但文件已写入成功" + # 删除现有目录 + if (Test-Path $updaterPath) { + 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 } - } catch { - Write-Host "$YELLOW[警告]$NC icacls 命令失败: $_" + + # 设置文件权限 + 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 保持默认设置,不进行更改" + } } catch { Write-Host "$RED[错误]$NC 主要操作失败: $_" @@ -266,151 +393,104 @@ try { } } -# 显示结果 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" +Read-Host "按回车键退出" +exit 0 -# 显示文件树结构 -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)" +# 在文件写入部分修改 +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") + + [System.IO.File]::WriteAllText( + [System.IO.Path]::GetFullPath($filePath), + $jsonContent, + $utf8NoBom + ) + + Write-Host "$GREEN[信息]$NC 成功写入配置文件(UTF8 无 BOM)" } -} else { - Write-Host "│ └── (空)" -} - -# 显示公众号信息 -Write-Host "" -Write-Host "$GREEN================================$NC" -Write-Host "$YELLOW 关注公众号【煎饼果子卷AI】一起交流更多Cursor技巧和AI知识 $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" + catch { + throw "写入配置文件失败: $_" } +} +function Get-CursorVersion { try { - # 删除现有目录 - if (Test-Path $updaterPath) { - 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 命令失败" + # 主要检测路径 + $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 版本: $($packageJson.version)" + return $packageJson.version } - - 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 + # 备用路径检测 + $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 版本: $($packageJson.version)" + return $packageJson.version } } - catch { - Write-Host "$RED[错误]$NC 验证设置失败" - Show-ManualGuide - return - } - Write-Host "$GREEN[信息]$NC 成功禁用自动更新" + Write-Host "$YELLOW[警告]$NC 无法检测到 Cursor 版本" + Write-Host "$YELLOW[提示]$NC 请确保 Cursor 已正确安装" + return $null } catch { - Write-Host "$RED[错误]$NC 发生未知错误: $_" - Show-ManualGuide + Write-Host "$RED[错误]$NC 获取 Cursor 版本失败: $_" + return $null } } -else { - Write-Host "$GREEN[信息]$NC 保持默认设置,不进行更改" + +function Compare-Version { + param ( + [string]$version1, + [string]$version2 + ) + + try { + $v1 = [version]($version1 -replace '[^\d\.].*$') + $v2 = [version]($version2 -replace '[^\d\.].*$') + return $v1.CompareTo($v2) + } + catch { + Write-Host "$RED[错误]$NC 版本比较失败: $_" + return 0 + } } -Write-Host "" -Read-Host "按回车键退出" -exit 0 \ No newline at end of file +# 在主流程开始时添加版本检查 +Write-Host "$GREEN[信息]$NC 正在检查 Cursor 版本..." +$cursorVersion = Get-CursorVersion + +if ($cursorVersion) { + $compareResult = Compare-Version $cursorVersion "0.45.0" + if ($compareResult -ge 0) { + Write-Host "$RED[错误]$NC 当前版本 ($cursorVersion) 暂不支持" + Write-Host "$YELLOW[建议]$NC 请使用 v0.44.11 及以下版本" + Write-Host "$YELLOW[建议]$NC 可以从以下地址下载支持的版本:" + Write-Host "Windows: https://download.todesktop.com/230313mzl4w4u92/Cursor%20Setup%200.44.11%20-%20Build%20250103fqxdt5u9z-x64.exe" + Write-Host "Mac ARM64: https://dl.todesktop.com/230313mzl4w4u92/versions/0.44.11/mac/zip/arm64" + Read-Host "按回车键退出" + exit 1 + } + else { + Write-Host "$GREEN[信息]$NC 当前版本 ($cursorVersion) 支持重置功能" + } +} +else { + Write-Host "$YELLOW[警告]$NC 无法检测版本,将继续执行..." +} \ No newline at end of file