Loading

Windows Codex 桌面版与 VSCode Codex 双账号隔离教程

Windows Codex 桌面版与 VSCode Codex 双账号隔离教程

一、最终目标(如题)

当前有两个 ChatGPT / Codex 账号:

A 账号

  1. Windows Codex 桌面应用
  2. 独立配置目录:
  3. C:\Users\lung\.codex-desktop
  4. 最终认证文件:
  5. C:\Users\lung\.codex-desktop\auth.json

B 账号

B 已经通过 Device Code 登录完成。

  1. VSCode Codex 插件
  2. 继续使用 Codex 默认目录:
  3. C:\Users\lung\.codex
  4. 认证文件:
  5. C:\Users\lung\.codex\auth.json

整个操作过程中不退出 B、不删除 B 的认证、不修改 VSCode 的 Codex 配置。

最终结构:

  1. Windows
  2. ├─ VSCode Codex
  3. ├─ 账号:B
  4. └─ CODEX_HOME
  5. C:\Users\lung\.codex
  6. └─ Codex Windows 桌面版
  7. ├─ 账号:A
  8. └─ CODEX_HOME
  9. C:\Users\lung\.codex-desktop

两个账号互相独立。


二、为什么需要这样做

Codex 默认会使用:

  1. C:\Users\lung\.codex

如果什么都不处理,下列程序都有可能读取同一个默认 Codex Home:

  1. VSCode Codex
  2. Codex CLI
  3. Codex Windows 桌面应用

这样就容易出现:

  1. VSCode 登录 B
  2. C:\Users\lung\.codex\auth.json
  3. 桌面 Codex 也读取这个目录
  4. 桌面版自动变成 B

因此需要单独给桌面 Codex 一个:

  1. C:\Users\lung\.codex-desktop

三、这台电脑还存在一个额外问题:10013

因此最终方案完全放弃桌面版自身的网页登录流程

改成:

  1. Codex CLI[自定义codex HOME目录]
  2. Device Code
  3. 登录 A
  4. 直接生成
  5. C:\Users\lung\.codex-desktop\auth.json
  6. 桌面 Codex 直接读取已经存在的 A 认证

这样桌面应用根本不需要启动登录服务器。


四、核心原则

整个方案遵守以下规则:

  1. VSCode 的 B 账号不动。
  2. 不删除:
  1. C:\Users\lung\.codex
  1. 不修改:
  1. C:\Users\lung\.codex\auth.json
  1. 不设置永久的用户级 CODEX_HOME
  2. 不设置永久的系统级 CODEX_HOME
  3. 桌面版的 CODEX_HOME 只由启动脚本临时设置。
  4. 以后桌面 A 只通过:Codex(独立账号).lnk 启动,不以管理员身份运行这个独立快捷方式。

五、第 1 步:确认没有永久 CODEX_HOME

打开:

  1. 普通 PowerShell

不是管理员 PowerShell。

执行:

  1. [Environment]::GetEnvironmentVariable("CODEX_HOME", "User")
  2. [Environment]::GetEnvironmentVariable("CODEX_HOME", "Machine")

正常情况下两条都应该为空。

也可以执行:

  1. Write-Host "用户级 CODEX_HOME:"
  2. [Environment]::GetEnvironmentVariable("CODEX_HOME", "User")
  3. Write-Host ""
  4. Write-Host "系统级 CODEX_HOME:"
  5. [Environment]::GetEnvironmentVariable("CODEX_HOME", "Machine")

不要执行这种命令:

  1. setx CODEX_HOME "C:\Users\lung\.codex-desktop"

因为这样会永久改变环境变量,可能导致:

  1. VSCode Codex

也继承 .codex-desktop

我们的目标不是:

  1. 整台电脑的 Codex A

而是:

  1. 只有桌面 Codex A
  2. VSCode Codex B

六、第 2 步:建立桌面版独立目录

创建:

  1. C:\Users\lung\.codex-desktop

PowerShell:

  1. New-Item `
  2. -ItemType Directory `
  3. -Force `
  4. -Path "C:\Users\lung\.codex-desktop"

七、第 3 步:建立最小 config.toml

创建:

  1. C:\Users\lung\.codex-desktop\config.toml

最开始只需要:

  1. cli_auth_credentials_store = "file"

这一项非常重要。

它的作用是明确要求 Codex:

  1. 认证信息
  2. 使用文件保存
  3. 当前 CODEX_HOME\auth.json

对于 A 来说就是:

  1. C:\Users\lung\.codex-desktop\auth.json

而不是把 A 的认证混入其他公共凭据存储。


八、第 4 步:创建独立桌面启动器

创建目录:

  1. C:\Users\lung\AppData\Local\OpenAI\Codex-Independent

然后创建:

  1. C:\Users\lung\AppData\Local\OpenAI\Codex-Independent\Start-Codex-Independent.ps1

完整代码:

  1. $ErrorActionPreference = 'Stop'
  2. Add-Type -AssemblyName System.Windows.Forms
  3. try {
  4. # 查找当前安装的 Codex Windows 桌面应用
  5. $package = Get-AppxPackage -Name 'OpenAI.Codex' |
  6. Sort-Object -Property Version -Descending |
  7. Select-Object -First 1
  8. if ($null -eq $package) {
  9. throw 'Codex desktop app was not found. Install it from Microsoft Store first.'
  10. }
  11. # 动态获取当前版本 Codex.exe
  12. $desktopExe = Join-Path $package.InstallLocation 'app\Codex.exe'
  13. if (-not (Test-Path -LiteralPath $desktopExe -PathType Leaf)) {
  14. throw "Codex.exe was not found: $desktopExe"
  15. }
  16. # 防止复用已经运行的桌面 Codex 进程
  17. $runningDesktopApp = Get-CimInstance Win32_Process -Filter "Name = 'Codex.exe'" |
  18. Where-Object { $_.ExecutablePath -eq $desktopExe } |
  19. Select-Object -First 1
  20. if ($null -ne $runningDesktopApp) {
  21. [System.Windows.Forms.MessageBox]::Show(
  22. 'Codex desktop app is already running. Exit the desktop app, then use the independent-account shortcut. VSCode Codex can stay open.',
  23. 'Codex - Independent Account',
  24. [System.Windows.Forms.MessageBoxButtons]::OK,
  25. [System.Windows.Forms.MessageBoxIcon]::Information
  26. ) | Out-Null
  27. exit 2
  28. }
  29. # 独立 Codex Home
  30. $isolatedCodexHome = Join-Path $env:USERPROFILE '.codex-desktop'
  31. New-Item `
  32. -ItemType Directory `
  33. -Force `
  34. -Path $isolatedCodexHome |
  35. Out-Null
  36. # 仅当前启动链路使用独立 CODEX_HOME
  37. $env:CODEX_HOME = $isolatedCodexHome
  38. # 启动 Codex Windows 桌面应用
  39. Start-Process `
  40. -FilePath $desktopExe `
  41. -WorkingDirectory (Split-Path -Parent $desktopExe)
  42. } catch {
  43. [System.Windows.Forms.MessageBox]::Show(
  44. $_.Exception.Message,
  45. 'Codex Independent Account - Startup Failed',
  46. [System.Windows.Forms.MessageBoxButtons]::OK,
  47. [System.Windows.Forms.MessageBoxIcon]::Error
  48. ) | Out-Null
  49. exit 1
  50. }

这个脚本最重要的是:

  1. $env:CODEX_HOME = $isolatedCodexHome

注意这里使用的是:

  1. $env:

它只影响当前 PowerShell 进程以及由它启动的子进程。

不会永久修改 Windows。

因此:

  1. 这个 PowerShell
  2. Codex 桌面版
  3. CODEX_HOME=.codex-desktop

但是已经运行的 VSCode:

  1. VSCode
  2. 没有受到影响
  3. 继续使用 .codex

九、为什么脚本要动态寻找 Codex.exe

Windows Store 安装的 Codex 路径可能随着升级改变。

所以不要写死:

  1. C:\Program Files\WindowsApps\某个固定版本\app\Codex.exe

脚本使用:

  1. Get-AppxPackage -Name 'OpenAI.Codex'

动态取得当前 Codex 包。

然后:

  1. $desktopExe = Join-Path $package.InstallLocation 'app\Codex.exe'

这样以后 Codex 更新版本,一般不需要重新修改启动脚本。


十、为什么脚本要检查 Codex.exe 是否已经运行

Windows 桌面程序已经运行时,再启动一次,有可能直接复用已有进程。

例如:

  1. 普通 Codex 已经运行
  2. 使用默认 .codex
  3. B
  4. 此时再点击独立快捷方式
  5. Windows 复用已有 Codex 进程
  6. 仍然可能是 B

所以脚本会检查:

  1. Get-CimInstance Win32_Process -Filter "Name = 'Codex.exe'"

发现桌面 Codex 已经运行,就提示:

  1. 先退出桌面 Codex,再通过独立快捷方式启动。

它不会强行杀进程。

而:

  1. VSCode Codex

可以继续保持运行。


十一、第 5 步:创建桌面快捷方式

快捷方式名称:

  1. Codex(独立账号)

目标程序:

  1. C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

参数:

  1. -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\Users\lung\AppData\Local\OpenAI\Codex-Independent\Start-Codex-Independent.ps1"

最终等价于:

  1. C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\Users\lung\AppData\Local\OpenAI\Codex-Independent\Start-Codex-Independent.ps1"

十二、非常重要:快捷方式不要使用管理员权限

本机已经实际验证:

  1. 管理员权限运行独立快捷方式
  2. 出现账号异常
  3. 桌面版自动进入 VSCode 使用的 B

因此最终成功方案明确规定:

  1. Codex(独立账号).lnk

使用:

  1. 普通权限运行

不要:

  1. 右键
  2. 以管理员身份运行

也不要在:

  1. 属性
  2. 高级

里面勾选:

  1. 用管理员身份运行

我们后面根本不需要管理员权限,因为已经绕过了桌面版的登录端口。


十三、此时不要急着在桌面 Codex 登录 A

如果这时候直接打开桌面 Codex,点击:

  1. 使用 ChatGPT 登录

在本机可能又出现:

  1. failed to start login server
  2. os error 10013

所以:

不要使用桌面应用自己的登录。

下一步改用 CLI。


十四、第 6 步:关闭桌面 Codex

在进行 A 的 Device Code 登录前:

  1. Codex Windows 桌面应用:完全退出

但是:

  1. VSCode:可以继续开着
  2. VSCode Codex B:继续登录

不要退出 B。


十五、第 7 步:检查 .codex-desktop

普通 PowerShell 执行:

  1. Write-Host "=== .codex-desktop 当前状态 ==="
  2. $desktopHome = "C:\Users\lung\.codex-desktop"
  3. Write-Host ""
  4. Write-Host "目录是否存在:"
  5. Test-Path $desktopHome
  6. Write-Host ""
  7. Write-Host "目录内容:"
  8. if (Test-Path $desktopHome) {
  9. Get-ChildItem $desktopHome -Force |
  10. Select-Object Name, Length, LastWriteTime
  11. }
  12. Write-Host ""
  13. Write-Host "config.toml:"
  14. $config = Join-Path $desktopHome "config.toml"
  15. if (Test-Path $config) {
  16. Get-Content $config
  17. } else {
  18. Write-Host "不存在 config.toml"
  19. }
  20. Write-Host ""
  21. Write-Host "auth.json 是否存在:"
  22. $auth = Join-Path $desktopHome "auth.json"
  23. Test-Path $auth

在 A 尚未登录之前:

  1. auth.json

应该不存在:

  1. False

同时确认:

  1. cli_auth_credentials_store = "file"

存在。


十六、第 8 步:临时让 CLI 使用 .codex-desktop

这是整个方案最关键的一步。

打开:

  1. 普通 PowerShell

执行:

  1. $env:CODEX_HOME = "C:\Users\lung\.codex-desktop"

检查:

  1. Write-Host "当前 CODEX_HOME = $env:CODEX_HOME"

应该显示:

  1. 当前 CODEX_HOME = C:\Users\lung\.codex-desktop

注意:

这个:

  1. $env:CODEX_HOME

只影响当前 PowerShell。

关闭这个 PowerShell 后,这个临时环境变量就没了。

不会影响:

  1. VSCode
  2. B
  3. C:\Users\lung\.codex

十七、第 9 步:使用 CLI Device Code 登录 A

本次实际成功使用的 CLI 是:

  1. C:\Users\lung\AppData\Local\OpenAI\Codex\bin\aec6b7c6fcdfb66a\codex.exe

执行:

  1. & "C:\Users\lung\AppData\Local\OpenAI\Codex\bin\aec6b7c6fcdfb66a\codex.exe" login --device-auth

出现:

  1. Welcome to Codex
  2. Follow these steps to sign in with ChatGPT using device code authorization
  3. 1\. Open this link in your browser
  4. 2\. Enter this one-time code

打开:

  1. https://auth.openai.com/codex/device

这里一定要确认浏览器当前登录的是:

  1. A 账号

不要误用 B。

因为当前环境变量已经是:

  1. CODEX_HOME=C:\Users\lung\.codex-desktop

所以此次设备码授权成功后:

  1. A 的认证
  2. 直接写入
  3. C:\Users\lung\.codex-desktop\auth.json

不是复制 B。

不是修改默认 .codex

而是 CLI 直接给桌面独立目录完成 A 的认证


十八、登录成功后的结果

CLI 显示:

  1. Successfully logged in

这表示 A 授权完成。

注意:

  1. Device Code

属于一次性敏感验证码。

不要截图公开。

不要发给别人。


十九、第 10 步:验证 A 的 auth.json

执行:

  1. Test-Path "C:\Users\lung\.codex-desktop\auth.json"

应该得到:

  1. True

然后:

  1. Get-Item "C:\Users\lung\.codex-desktop\auth.json" |
  2. Select-Object FullName, Length, LastWriteTime

本次实际结果:

  1. FullName:
  2. C:\Users\lung\.codex-desktop\auth.json
  3. Length:
  4. 3870
  5. LastWriteTime:
  6. 2026/8/27 15:21:37

这时已经可以确认:

  1. A
  2. C:\Users\lung\.codex-desktop\auth.json

已经存在。

不要执行:

  1. Get-Content "C:\Users\lung\.codex-desktop\auth.json"

没有必要把 token 内容显示出来。


二十、第 11 步:确认 B 没被修改

B 原本的位置:

  1. C:\Users\lung\.codex\auth.json

可以检查:

  1. Get-Item "C:\Users\lung\.codex\auth.json" |
  2. Select-Object FullName, Length, LastWriteTime

这一步只看:

  1. 文件存在
  2. 大小
  3. 更新时间

不要输出文件内容。

最终应该同时存在:

  1. C:\Users\lung\.codex\auth.json

以及:

  1. C:\Users\lung\.codex-desktop\auth.json

也就是:

  1. B
  2. C:\Users\lung\.codex\auth.json
  3. A
  4. C:\Users\lung\.codex-desktop\auth.json

二十一、第 12 步:第一次正式启动 A 桌面版

现在:

  1. A auth.json 已经存在

因此不需要:

  1. 使用 ChatGPT 登录

也不需要:

  1. localhost 登录服务器

更不会主动走之前出错的:

  1. 10013

确保所有 Codex 桌面版都已经退出。

VSCode 不需要关闭。

然后:

普通双击:

  1. Codex(独立账号).lnk

执行链路:

  1. Codex(独立账号).lnk
  2. PowerShell
  3. Start-Codex-Independent.ps1
  4. 设置当前进程:
  5. CODEX_HOME=C:\Users\lung\.codex-desktop
  6. 启动 OpenAI.Codex
  7. 读取:
  8. C:\Users\lung\.codex-desktop\auth.json
  9. 直接进入 A

本次实际验证:

  1. 成功直接进入 A

没有再次登录。

没有再次出现:

  1. failed to start login server

也没有:

  1. os error 10013

二十二、最终成功结构

现在电脑实际变成:

  1. ┌────────────────────────────────────┐
  2. VSCode
  3. Codex 插件
  4. 账号:B
  5. C:\Users\lung\.codex
  6. auth.json
  7. └────────────────────────────────────┘
  8. 完全隔离
  9. ┌────────────────────────────────────┐
  10. Windows Codex 桌面应用
  11. 账号:A
  12. C:\Users\lung\.codex-desktop
  13. auth.json
  14. 启动入口:
  15. Codex(独立账号).lnk
  16. └────────────────────────────────────┘

二十三、以后每天怎么使用

使用 VSCode 的 B

正常打开:

  1. VSCode

正常使用 Codex 插件。

什么都不用设置。

它继续使用:

  1. C:\Users\lung\.codex

使用桌面版 A

不要直接使用:

  1. 开始菜单
  2. Codex

也不要直接:

  1. Codex.exe

固定使用:

  1. 桌面
  2. Codex(独立账号)

它会自动:

  1. CODEX_HOME
  2. =
  3. C:\Users\lung\.codex-desktop

然后进入 A。


二十四、绝对不要做的事情

不要执行:

  1. setx CODEX_HOME "C:\Users\lung\.codex-desktop"

不要创建系统级:

  1. CODEX_HOME

不要把:

  1. C:\Users\lung\.codex\auth.json

复制到:

  1. C:\Users\lung\.codex-desktop

因为 .codex 当前是 B。

不要直接以管理员身份启动:

  1. Codex.exe

不要以管理员身份运行:

  1. Codex(独立账号).lnk

不要为了修复 A 而退出:

  1. VSCode Codex B

不要删除:

  1. C:\Users\lung\.codex

二十五、为什么不是真的“复制授权”

口头上可以理解成:

  1. 通过 CLI A 的授权放进 .codex-desktop

但是技术上更准确的说法不是:

  1. 先产生 auth.json
  2. 然后复制过去

真正执行的是:

  1. PowerShell
  2. 临时 CODEX_HOME=.codex-desktop
  3. 启动 Codex CLI
  4. Device Code 登录 A
  5. Codex CLI 根据当前 CODEX_HOME
  6. 直接生成
  7. C:\Users\lung\.codex-desktop\auth.json

所以不存在中间复制账号文件的步骤。

这个方式更加安全,也不容易把 B 错复制过去。


二十六、以后 A 登录失效怎么办

如果以后桌面 A 要求重新登录,或者认证失效:

不要使用桌面版自己的网页登录。

关闭桌面 Codex。

打开普通 PowerShell。

重新执行:

  1. $env:CODEX_HOME = "C:\Users\lung\.codex-desktop"

然后:

  1. & "C:\Users\lung\AppData\Local\OpenAI\Codex\bin\aec6b7c6fcdfb66a\codex.exe" login --device-auth

在 A 浏览器中完成 Device Code 授权。

它会重新更新:

  1. C:\Users\lung\.codex-desktop\auth.json

然后重新双击:

  1. Codex(独立账号)

即可。


二十七、Codex 更新后 CLI 路径变化怎么办

当前测试成功的 CLI 路径是:

  1. C:\Users\lung\AppData\Local\OpenAI\Codex\bin\aec6b7c6fcdfb66a\codex.exe

其中:

  1. aec6b7c6fcdfb66a

属于当前安装版本对应目录。

Codex 更新后这个目录有可能变化。

但是:

  1. Start-Codex-Independent.ps1

本身不依赖这个固定版本目录。

它通过:

  1. Get-AppxPackage -Name 'OpenAI.Codex'

动态查找桌面 Codex,因此日常启动通常不受影响。

只有以后需要重新执行:

  1. login --device-auth

时,才需要确认当前 CLI 路径。

如果终端已经存在:

  1. codex

也可以先执行:

  1. Get-Command codex

确认实际程序路径。


二十八、故障排查

情况 1:双击独立快捷方式仍然进入 B

立即关闭桌面 Codex。

不要退出账号。

检查:

  1. Test-Path "C:\Users\lung\.codex-desktop\auth.json"

然后检查脚本:

  1. Select-String `
  2. -Path "C:\Users\lung\AppData\Local\OpenAI\Codex-Independent\Start-Codex-Independent.ps1" `
  3. -Pattern "CODEX_HOME"

应该存在:

  1. $env:CODEX_HOME = $isolatedCodexHome

情况 2:又出现 10013

说明又进入了桌面版自身的登录流程。

不要继续处理端口。

直接关闭桌面版。

使用:

  1. $env:CODEX_HOME = "C:\Users\lung\.codex-desktop"

然后:

  1. codex login --device-auth

或者使用已经确认的 Codex CLI 完整路径。


情况 3:点击独立快捷方式提示 Codex 已运行

这是正常保护机制。

关闭:

  1. Codex Windows 桌面应用

不要关闭 VSCode。

然后重新双击:

  1. Codex(独立账号)

情况 4:A 重新登录后担心 B 被覆盖

检查两个文件:

  1. Get-Item `
  2. "C:\Users\lung\.codex\auth.json",
  3. "C:\Users\lung\.codex-desktop\auth.json" |
  4. Select-Object FullName, Length, LastWriteTime

只查看元数据。

不要输出 auth.json 内容。


二十九、最终结论

最终成功方案不是:

  1. Codex 登录端口管理员权限

也不是:

  1. 管理员启动 Codex

而是:

  1. VSCode Codex
  2. B
  3. C:\Users\lung\.codex

和:

  1. Codex CLI
  2. 临时 CODEX_HOME=.codex-desktop
  3. Device Code 登录 A
  4. 生成 .codex-desktop\auth.json
  5. 独立快捷方式普通权限启动桌面 Codex
  6. 直接读取 A

最终成功绕过:

  1. failed to start login server
  2. os error 10013

同时实现:

  1. Windows Codex 桌面版 = A
  2. VSCode Codex 插件 = B

两边可以同时保持各自账号,不需要来回退出登录。


三十、一句话备忘

以后忘了整套原理,只需要记住:

  1. VSCode B
  2. C:\Users\lung\.codex
  3. 桌面 A
  4. C:\Users\lung\.codex-desktop
  5. A 需要重新登录:
  6. $env:CODEX_HOME="C:\Users\lung\.codex-desktop"
  7. codex login --device-auth
  8. 桌面 A 永远从:
  9. Codex(独立账号).lnk
  10. 启动。
posted @ 2026-08-27 21:50  LungGiyo  阅读(52)  评论(0)    收藏  举报