Windows Codex 桌面版与 VSCode Codex 双账号隔离教程
Windows Codex 桌面版与 VSCode Codex 双账号隔离教程
一、最终目标(如题)
当前有两个 ChatGPT / Codex 账号:
A 账号
Windows Codex 桌面应用独立配置目录:C:\Users\lung\.codex-desktop最终认证文件:C:\Users\lung\.codex-desktop\auth.json
B 账号
B 已经通过 Device Code 登录完成。
VSCode Codex 插件继续使用 Codex 默认目录:C:\Users\lung\.codex认证文件:C:\Users\lung\.codex\auth.json
整个操作过程中不退出 B、不删除 B 的认证、不修改 VSCode 的 Codex 配置。
最终结构:
Windows├─ VSCode Codex│ ├─ 账号:B│ └─ CODEX_HOME:│ C:\Users\lung\.codex│└─ Codex Windows 桌面版├─ 账号:A└─ CODEX_HOME:C:\Users\lung\.codex-desktop
两个账号互相独立。
二、为什么需要这样做
Codex 默认会使用:
C:\Users\lung\.codex
如果什么都不处理,下列程序都有可能读取同一个默认 Codex Home:
VSCode CodexCodex CLICodex Windows 桌面应用
这样就容易出现:
VSCode 登录 B↓C:\Users\lung\.codex\auth.json↓桌面 Codex 也读取这个目录↓桌面版自动变成 B
因此需要单独给桌面 Codex 一个:
C:\Users\lung\.codex-desktop
三、这台电脑还存在一个额外问题:10013

因此最终方案完全放弃桌面版自身的网页登录流程。
改成:
Codex CLI[自定义codex HOME目录]↓Device Code↓登录 A↓直接生成C:\Users\lung\.codex-desktop\auth.json↓桌面 Codex 直接读取已经存在的 A 认证
这样桌面应用根本不需要启动登录服务器。
四、核心原则
整个方案遵守以下规则:
- VSCode 的 B 账号不动。
- 不删除:
C:\Users\lung\.codex
- 不修改:
C:\Users\lung\.codex\auth.json
- 不设置永久的用户级
CODEX_HOME。 - 不设置永久的系统级
CODEX_HOME。 - 桌面版的
CODEX_HOME只由启动脚本临时设置。 - 以后桌面 A 只通过:Codex(独立账号).lnk 启动,不以管理员身份运行这个独立快捷方式。
五、第 1 步:确认没有永久 CODEX_HOME
打开:
普通 PowerShell
不是管理员 PowerShell。
执行:
[Environment]::GetEnvironmentVariable("CODEX_HOME", "User")[Environment]::GetEnvironmentVariable("CODEX_HOME", "Machine")
正常情况下两条都应该为空。
也可以执行:
Write-Host "用户级 CODEX_HOME:"[Environment]::GetEnvironmentVariable("CODEX_HOME", "User")Write-Host ""Write-Host "系统级 CODEX_HOME:"[Environment]::GetEnvironmentVariable("CODEX_HOME", "Machine")
不要执行这种命令:
setx CODEX_HOME "C:\Users\lung\.codex-desktop"
因为这样会永久改变环境变量,可能导致:
VSCode Codex
也继承 .codex-desktop。
我们的目标不是:
整台电脑的 Codex → A
而是:
只有桌面 Codex → AVSCode Codex → B
六、第 2 步:建立桌面版独立目录
创建:
C:\Users\lung\.codex-desktop
PowerShell:
New-Item `-ItemType Directory `-Force `-Path "C:\Users\lung\.codex-desktop"
七、第 3 步:建立最小 config.toml
创建:
C:\Users\lung\.codex-desktop\config.toml
最开始只需要:
cli_auth_credentials_store = "file"
这一项非常重要。
它的作用是明确要求 Codex:
认证信息↓使用文件保存↓当前 CODEX_HOME\auth.json
对于 A 来说就是:
C:\Users\lung\.codex-desktop\auth.json
而不是把 A 的认证混入其他公共凭据存储。
八、第 4 步:创建独立桌面启动器
创建目录:
C:\Users\lung\AppData\Local\OpenAI\Codex-Independent
然后创建:
C:\Users\lung\AppData\Local\OpenAI\Codex-Independent\Start-Codex-Independent.ps1
完整代码:
$ErrorActionPreference = 'Stop'Add-Type -AssemblyName System.Windows.Formstry {# 查找当前安装的 Codex Windows 桌面应用$package = Get-AppxPackage -Name 'OpenAI.Codex' |Sort-Object -Property Version -Descending |Select-Object -First 1if ($null -eq $package) {throw 'Codex desktop app was not found. Install it from Microsoft Store first.'}# 动态获取当前版本 Codex.exe$desktopExe = Join-Path $package.InstallLocation 'app\Codex.exe'if (-not (Test-Path -LiteralPath $desktopExe -PathType Leaf)) {throw "Codex.exe was not found: $desktopExe"}# 防止复用已经运行的桌面 Codex 进程$runningDesktopApp = Get-CimInstance Win32_Process -Filter "Name = 'Codex.exe'" |Where-Object { $_.ExecutablePath -eq $desktopExe } |Select-Object -First 1if ($null -ne $runningDesktopApp) {[System.Windows.Forms.MessageBox]::Show('Codex desktop app is already running. Exit the desktop app, then use the independent-account shortcut. VSCode Codex can stay open.','Codex - Independent Account',[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Information) | Out-Nullexit 2}# 独立 Codex Home$isolatedCodexHome = Join-Path $env:USERPROFILE '.codex-desktop'New-Item `-ItemType Directory `-Force `-Path $isolatedCodexHome |Out-Null# 仅当前启动链路使用独立 CODEX_HOME$env:CODEX_HOME = $isolatedCodexHome# 启动 Codex Windows 桌面应用Start-Process `-FilePath $desktopExe `-WorkingDirectory (Split-Path -Parent $desktopExe)} catch {[System.Windows.Forms.MessageBox]::Show($_.Exception.Message,'Codex Independent Account - Startup Failed',[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Error) | Out-Nullexit 1}
这个脚本最重要的是:
$env:CODEX_HOME = $isolatedCodexHome
注意这里使用的是:
$env:
它只影响当前 PowerShell 进程以及由它启动的子进程。
不会永久修改 Windows。
因此:
这个 PowerShell↓Codex 桌面版↓CODEX_HOME=.codex-desktop
但是已经运行的 VSCode:
VSCode↓没有受到影响↓继续使用 .codex
九、为什么脚本要动态寻找 Codex.exe
Windows Store 安装的 Codex 路径可能随着升级改变。
所以不要写死:
C:\Program Files\WindowsApps\某个固定版本\app\Codex.exe
脚本使用:
Get-AppxPackage -Name 'OpenAI.Codex'
动态取得当前 Codex 包。
然后:
$desktopExe = Join-Path $package.InstallLocation 'app\Codex.exe'
这样以后 Codex 更新版本,一般不需要重新修改启动脚本。
十、为什么脚本要检查 Codex.exe 是否已经运行
Windows 桌面程序已经运行时,再启动一次,有可能直接复用已有进程。
例如:
普通 Codex 已经运行↓使用默认 .codex↓B此时再点击独立快捷方式↓Windows 复用已有 Codex 进程↓仍然可能是 B
所以脚本会检查:
Get-CimInstance Win32_Process -Filter "Name = 'Codex.exe'"
发现桌面 Codex 已经运行,就提示:
先退出桌面 Codex,再通过独立快捷方式启动。
它不会强行杀进程。
而:
VSCode Codex
可以继续保持运行。
十一、第 5 步:创建桌面快捷方式
快捷方式名称:
Codex(独立账号)
目标程序:
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"
最终等价于:
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"
十二、非常重要:快捷方式不要使用管理员权限
本机已经实际验证:
管理员权限运行独立快捷方式↓出现账号异常↓桌面版自动进入 VSCode 使用的 B
因此最终成功方案明确规定:
Codex(独立账号).lnk
使用:
普通权限运行
不要:
右键→ 以管理员身份运行
也不要在:
属性→ 高级
里面勾选:
用管理员身份运行
我们后面根本不需要管理员权限,因为已经绕过了桌面版的登录端口。
十三、此时不要急着在桌面 Codex 登录 A
如果这时候直接打开桌面 Codex,点击:
使用 ChatGPT 登录
在本机可能又出现:
failed to start login serveros error 10013
所以:
不要使用桌面应用自己的登录。
下一步改用 CLI。
十四、第 6 步:关闭桌面 Codex
在进行 A 的 Device Code 登录前:
Codex Windows 桌面应用:完全退出
但是:
VSCode:可以继续开着VSCode Codex B:继续登录
不要退出 B。
十五、第 7 步:检查 .codex-desktop
普通 PowerShell 执行:
Write-Host "=== .codex-desktop 当前状态 ==="$desktopHome = "C:\Users\lung\.codex-desktop"Write-Host ""Write-Host "目录是否存在:"Test-Path $desktopHomeWrite-Host ""Write-Host "目录内容:"if (Test-Path $desktopHome) {Get-ChildItem $desktopHome -Force |Select-Object Name, Length, LastWriteTime}Write-Host ""Write-Host "config.toml:"$config = Join-Path $desktopHome "config.toml"if (Test-Path $config) {Get-Content $config} else {Write-Host "不存在 config.toml"}Write-Host ""Write-Host "auth.json 是否存在:"$auth = Join-Path $desktopHome "auth.json"Test-Path $auth
在 A 尚未登录之前:
auth.json
应该不存在:
False
同时确认:
cli_auth_credentials_store = "file"
存在。
十六、第 8 步:临时让 CLI 使用 .codex-desktop
这是整个方案最关键的一步。
打开:
普通 PowerShell
执行:
$env:CODEX_HOME = "C:\Users\lung\.codex-desktop"
检查:
Write-Host "当前 CODEX_HOME = $env:CODEX_HOME"
应该显示:
当前 CODEX_HOME = C:\Users\lung\.codex-desktop
注意:
这个:
$env:CODEX_HOME
只影响当前 PowerShell。
关闭这个 PowerShell 后,这个临时环境变量就没了。
不会影响:
VSCodeBC:\Users\lung\.codex
十七、第 9 步:使用 CLI Device Code 登录 A
本次实际成功使用的 CLI 是:
C:\Users\lung\AppData\Local\OpenAI\Codex\bin\aec6b7c6fcdfb66a\codex.exe
执行:
& "C:\Users\lung\AppData\Local\OpenAI\Codex\bin\aec6b7c6fcdfb66a\codex.exe" login --device-auth
出现:
Welcome to CodexFollow these steps to sign in with ChatGPT using device code authorization1\. Open this link in your browser2\. Enter this one-time code
打开:
https://auth.openai.com/codex/device
这里一定要确认浏览器当前登录的是:
A 账号
不要误用 B。
因为当前环境变量已经是:
CODEX_HOME=C:\Users\lung\.codex-desktop
所以此次设备码授权成功后:
A 的认证↓直接写入↓C:\Users\lung\.codex-desktop\auth.json
不是复制 B。
不是修改默认 .codex。
而是 CLI 直接给桌面独立目录完成 A 的认证。
十八、登录成功后的结果
CLI 显示:
Successfully logged in
这表示 A 授权完成。
注意:
Device Code
属于一次性敏感验证码。
不要截图公开。
不要发给别人。
十九、第 10 步:验证 A 的 auth.json
执行:
Test-Path "C:\Users\lung\.codex-desktop\auth.json"
应该得到:
True
然后:
Get-Item "C:\Users\lung\.codex-desktop\auth.json" |Select-Object FullName, Length, LastWriteTime
本次实际结果:
FullName:C:\Users\lung\.codex-desktop\auth.jsonLength:3870LastWriteTime:2026/8/27 15:21:37
这时已经可以确认:
A↓C:\Users\lung\.codex-desktop\auth.json
已经存在。
不要执行:
Get-Content "C:\Users\lung\.codex-desktop\auth.json"
没有必要把 token 内容显示出来。
二十、第 11 步:确认 B 没被修改
B 原本的位置:
C:\Users\lung\.codex\auth.json
可以检查:
Get-Item "C:\Users\lung\.codex\auth.json" |Select-Object FullName, Length, LastWriteTime
这一步只看:
文件存在大小更新时间
不要输出文件内容。
最终应该同时存在:
C:\Users\lung\.codex\auth.json
以及:
C:\Users\lung\.codex-desktop\auth.json
也就是:
B↓C:\Users\lung\.codex\auth.jsonA↓C:\Users\lung\.codex-desktop\auth.json
二十一、第 12 步:第一次正式启动 A 桌面版
现在:
A 的 auth.json 已经存在
因此不需要:
使用 ChatGPT 登录
也不需要:
localhost 登录服务器
更不会主动走之前出错的:
10013
确保所有 Codex 桌面版都已经退出。
VSCode 不需要关闭。
然后:
普通双击:
Codex(独立账号).lnk
执行链路:
Codex(独立账号).lnk↓PowerShell↓Start-Codex-Independent.ps1↓设置当前进程:CODEX_HOME=C:\Users\lung\.codex-desktop↓启动 OpenAI.Codex↓读取:C:\Users\lung\.codex-desktop\auth.json↓直接进入 A
本次实际验证:
成功直接进入 A。
没有再次登录。
没有再次出现:
failed to start login server
也没有:
os error 10013
二十二、最终成功结构
现在电脑实际变成:
┌────────────────────────────────────┐│ VSCode ││ ││ Codex 插件 ││ ││ 账号:B ││ ││ C:\Users\lung\.codex ││ ↓ ││ auth.json │└────────────────────────────────────┘完全隔离┌────────────────────────────────────┐│ Windows Codex 桌面应用 ││ ││ 账号:A ││ ││ C:\Users\lung\.codex-desktop ││ ↓ ││ auth.json ││ ││ 启动入口: ││ Codex(独立账号).lnk │└────────────────────────────────────┘
二十三、以后每天怎么使用
使用 VSCode 的 B
正常打开:
VSCode
正常使用 Codex 插件。
什么都不用设置。
它继续使用:
C:\Users\lung\.codex
使用桌面版 A
不要直接使用:
开始菜单→ Codex
也不要直接:
Codex.exe
固定使用:
桌面→ Codex(独立账号)
它会自动:
CODEX_HOME=C:\Users\lung\.codex-desktop
然后进入 A。
二十四、绝对不要做的事情
不要执行:
setx CODEX_HOME "C:\Users\lung\.codex-desktop"
不要创建系统级:
CODEX_HOME
不要把:
C:\Users\lung\.codex\auth.json
复制到:
C:\Users\lung\.codex-desktop
因为 .codex 当前是 B。
不要直接以管理员身份启动:
Codex.exe
不要以管理员身份运行:
Codex(独立账号).lnk
不要为了修复 A 而退出:
VSCode Codex 的 B
不要删除:
C:\Users\lung\.codex
二十五、为什么不是真的“复制授权”
口头上可以理解成:
通过 CLI 把 A 的授权放进 .codex-desktop
但是技术上更准确的说法不是:
先产生 auth.json然后复制过去
真正执行的是:
PowerShell↓临时 CODEX_HOME=.codex-desktop↓启动 Codex CLI↓Device Code 登录 A↓Codex CLI 根据当前 CODEX_HOME↓直接生成C:\Users\lung\.codex-desktop\auth.json
所以不存在中间复制账号文件的步骤。
这个方式更加安全,也不容易把 B 错复制过去。
二十六、以后 A 登录失效怎么办
如果以后桌面 A 要求重新登录,或者认证失效:
不要使用桌面版自己的网页登录。
关闭桌面 Codex。
打开普通 PowerShell。
重新执行:
$env:CODEX_HOME = "C:\Users\lung\.codex-desktop"
然后:
& "C:\Users\lung\AppData\Local\OpenAI\Codex\bin\aec6b7c6fcdfb66a\codex.exe" login --device-auth
在 A 浏览器中完成 Device Code 授权。
它会重新更新:
C:\Users\lung\.codex-desktop\auth.json
然后重新双击:
Codex(独立账号)
即可。
二十七、Codex 更新后 CLI 路径变化怎么办
当前测试成功的 CLI 路径是:
C:\Users\lung\AppData\Local\OpenAI\Codex\bin\aec6b7c6fcdfb66a\codex.exe
其中:
aec6b7c6fcdfb66a
属于当前安装版本对应目录。
Codex 更新后这个目录有可能变化。
但是:
Start-Codex-Independent.ps1
本身不依赖这个固定版本目录。
它通过:
Get-AppxPackage -Name 'OpenAI.Codex'
动态查找桌面 Codex,因此日常启动通常不受影响。
只有以后需要重新执行:
login --device-auth
时,才需要确认当前 CLI 路径。
如果终端已经存在:
codex
也可以先执行:
Get-Command codex
确认实际程序路径。
二十八、故障排查
情况 1:双击独立快捷方式仍然进入 B
立即关闭桌面 Codex。
不要退出账号。
检查:
Test-Path "C:\Users\lung\.codex-desktop\auth.json"
然后检查脚本:
Select-String `-Path "C:\Users\lung\AppData\Local\OpenAI\Codex-Independent\Start-Codex-Independent.ps1" `-Pattern "CODEX_HOME"
应该存在:
$env:CODEX_HOME = $isolatedCodexHome
情况 2:又出现 10013
说明又进入了桌面版自身的登录流程。
不要继续处理端口。
直接关闭桌面版。
使用:
$env:CODEX_HOME = "C:\Users\lung\.codex-desktop"
然后:
codex login --device-auth
或者使用已经确认的 Codex CLI 完整路径。
情况 3:点击独立快捷方式提示 Codex 已运行
这是正常保护机制。
关闭:
Codex Windows 桌面应用
不要关闭 VSCode。
然后重新双击:
Codex(独立账号)
情况 4:A 重新登录后担心 B 被覆盖
检查两个文件:
Get-Item `"C:\Users\lung\.codex\auth.json","C:\Users\lung\.codex-desktop\auth.json" |Select-Object FullName, Length, LastWriteTime
只查看元数据。
不要输出 auth.json 内容。
二十九、最终结论
最终成功方案不是:
给 Codex 登录端口管理员权限
也不是:
管理员启动 Codex
而是:
VSCode Codex↓B↓C:\Users\lung\.codex
和:
Codex CLI↓临时 CODEX_HOME=.codex-desktop↓Device Code 登录 A↓生成 .codex-desktop\auth.json↓独立快捷方式普通权限启动桌面 Codex↓直接读取 A
最终成功绕过:
failed to start login serveros error 10013
同时实现:
Windows Codex 桌面版 = AVSCode Codex 插件 = B
两边可以同时保持各自账号,不需要来回退出登录。
三十、一句话备忘
以后忘了整套原理,只需要记住:
VSCode B:C:\Users\lung\.codex桌面 A:C:\Users\lung\.codex-desktopA 需要重新登录:$env:CODEX_HOME="C:\Users\lung\.codex-desktop"codex login --device-auth桌面 A 永远从:Codex(独立账号).lnk启动。

浙公网安备 33010602011771号