











当前有两个 ChatGPT / Codex 账号:
Windows Codex 桌面应用独立配置目录:C:\Users\lung\.codex-desktop最终认证文件:C:\Users\lung\.codex-desktop\auth.json
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

因此最终方案完全放弃桌面版自身的网页登录流程。
改成:
Codex CLI[自定义codex HOME目录]↓Device Code↓登录 A↓直接生成C:\Users\lung\.codex-desktop\auth.json↓桌面 Codex 直接读取已经存在的 A 认证
这样桌面应用根本不需要启动登录服务器。
整个方案遵守以下规则:
C:\Users\lung\.codex
C:\Users\lung\.codex\auth.json
CODEX_HOME。CODEX_HOME。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
创建:
C:\Users\lung\.codex-desktop
PowerShell:
New-Item `-ItemType Directory `-Force `-Path "C:\Users\lung\.codex-desktop"
创建:
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 的认证混入其他公共凭据存储。
创建目录:
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
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 更新版本,一般不需要重新修改启动脚本。
Windows 桌面程序已经运行时,再启动一次,有可能直接复用已有进程。
例如:
普通 Codex 已经运行↓使用默认 .codex↓B此时再点击独立快捷方式↓Windows 复用已有 Codex 进程↓仍然可能是 B
所以脚本会检查:
Get-CimInstance Win32_Process -Filter "Name = 'Codex.exe'"
发现桌面 Codex 已经运行,就提示:
先退出桌面 Codex,再通过独立快捷方式启动。
它不会强行杀进程。
而:
VSCode Codex
可以继续保持运行。
快捷方式名称:
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,点击:
使用 ChatGPT 登录
在本机可能又出现:
failed to start login serveros error 10013
所以:
不要使用桌面应用自己的登录。
下一步改用 CLI。
在进行 A 的 Device Code 登录前:
Codex Windows 桌面应用:完全退出
但是:
VSCode:可以继续开着VSCode Codex B:继续登录
不要退出 B。
.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"
存在。
.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
本次实际成功使用的 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
属于一次性敏感验证码。
不要截图公开。
不要发给别人。
执行:
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 内容显示出来。
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
现在:
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
正常使用 Codex 插件。
什么都不用设置。
它继续使用:
C:\Users\lung\.codex
不要直接使用:
开始菜单→ 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 要求重新登录,或者认证失效:
不要使用桌面版自己的网页登录。
关闭桌面 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(独立账号)
即可。
当前测试成功的 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
确认实际程序路径。
立即关闭桌面 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
说明又进入了桌面版自身的登录流程。
不要继续处理端口。
直接关闭桌面版。
使用:
$env:CODEX_HOME = "C:\Users\lung\.codex-desktop"
然后:
codex login --device-auth
或者使用已经确认的 Codex CLI 完整路径。
这是正常保护机制。
关闭:
Codex Windows 桌面应用
不要关闭 VSCode。
然后重新双击:
Codex(独立账号)
检查两个文件:
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启动。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。