现象
在 Windows 上以管理员身份运行 ZCode(右键 → "以管理员身份运行",或快捷方式勾选"以管理员身份运行此程序"),完成 OAuth 授权流程时:
- 浏览器弹出 Z.AI 授权页,用户点击"同意"后浏览器侧显示完成
- 但 ZCode App 永远卡在"等待同意 / Waiting for authorization"界面
- App 侧
OAuthService.handleCallback 始终不会被触发
- 没有可见报错;只能手动关闭浏览器/App
切换回普通用户模式启动同一 ZCode 安装,OAuth 流程正常完成,可以登录。
复现稳定性
100% 复现(每次管理员模式启动都会卡住)。
复现步骤
- 确保 ZCode 已退出登录(或清空
~/.zcode/v2/credentials.json 中 oauth:bigmodel:* / oauth:active_provider 条目)
- 右键
D:\ZCode\ZCode.exe → 以管理员身份运行(UAC 弹窗确认)
- 在登录界面点击"Sign in with Z.AI"
- 系统默认浏览器打开
https://zcode.z.ai/... 授权页
- 点击"同意 / Authorize"
- 浏览器跳转到
zcode://callback?code=...(或类似 custom-scheme 回调),浏览器侧显示"已授权,可关闭此页面"
- App 侧 UI 永远停留在"等待同意"页面,不会进入工作区
对照组:同样步骤,第 2 步改为普通双击启动,第 7 步能正常进入工作区。
环境信息
| 项 |
值 |
| ZCode 版本 |
3.3.6.3198 (D:\ZCode\ZCode.exe) |
| OS |
Windows 11 24H2 (Build 26200.8894) x64 |
| 当前用户 |
Elucidate (SID: S-1-5-21-2776964738-1764272819-2565151984-1001) |
| ZCode 安装路径 |
D:\ZCode\ |
| 默认浏览器 |
系统 Edge / Chrome(普通用户上下文) |
| 是否测试过禁用所有扩展的浏览器 |
是(无扩展的 Edge 也复现) |
根因假设(供团队参考,非结论)
Windows 上 ZCode 通过 custom URL scheme zcode:// 接收 OAuth 回调。该 scheme 在安装/首次启动时被注册到注册表,但只注册到 HKCU\Software\Classes\zcode,未注册到 HKLM\Software\Classes\zcode:
HKEY_CURRENT_USER\Software\Classes\zcode\shell\open\command
(默认) = "D:\ZCode\ZCode.exe" "%1"
HKEY_LOCAL_MACHINE\Software\Classes\zcode ← 不存在
当 ZCode 以普通用户启动时:
HKCU 指向当前用户,浏览器(同用户)调起 ZCode → 单实例 IPC → 已运行实例收到 callback ✅
当 ZCode 以管理员启动时(UAC elevation 后):
- 已运行的 ZCode 实例 integrity level = High,进程身份可能是 Administrator 或 elevated
Elucidate
- 浏览器仍在普通用户(medium integrity)下运行
- 浏览器把
zcode://callback?code=... 交给系统 → ShellExecute 从 HKCU\Software\Classes\zcode 查到路径,启动一个新的非 elevated 的 ZCode.exe 进程
- 新进程尝试触发单实例锁 → 试图唤起已运行的 elevated 实例
- 跨 integrity level / 跨 session 的 IPC(无论用 named pipe、window message、socket)通常被 UIPI/会话隔离阻断,导致 callback 永远到不了 elevated 实例
- 结果:UI 永远卡在"等待同意"
相关日志佐证(在普通用户模式启动的 ~/.zcode/v2/logs/<date>.log 中,OAuth 成功路径会打印):
[deep-link] OAuth 回调路由成功 {"state":"...","windowId":1,"provider":"bigmodel"}
[bigmodelOAuth] zcode token request {...}
[zcode-host] [rpc:call] oauth.handleCallback OK (xxx ms)
管理员模式启动时,这三行一条都不会出现(即便浏览器侧已经同意)。
建议的修复方向(任选其一)
- 改用 loopback HTTP 回调:OAuth redirect_uri 用
http://127.0.0.1:<port>/callback,embedded HTTP server 在 elevated 进程内监听,绕开 custom scheme 跨 integrity 的 IPC 问题(参考 VS Code、Cursor 的做法)
- 跨 integrity IPC:elevated 实例监听 named pipe,non-elevated 回调转发器用
CreateNamedPipe + 适当 ACL;或用 ChangeWindowMessageFilter 放开 WM_COPYDATA 让 elevated 窗口能收到普通进程的消息
- 官方推荐不要以管理员模式运行 ZCode:在 manifest 或启动时检测 elevated 状态,弹窗提示"管理员模式不支持 OAuth 登录,请用普通模式启动",避免用户无意义等待
- 在管理员启动时主动把 scheme 注册到
HKLM\Software\Classes\zcode(需要管理员权限,刚好管理员启动时可以做),并保证 ShellExecute 启动子进程时启用 runas 让子进程也 elevated
临时 Workaround
- 不要用管理员模式启动 ZCode。如果某些场景(如写入受保护目录、安装某些 MCP 工具)确实需要管理员权限,建议改为:先普通模式启动登录成功,再退出 ZCode,用管理员模式启动(已有 token 会从
~/.zcode/v2/credentials.json 读取,无需再次 OAuth)
- 或切换到 API Key 模式(在设置里改
modelProviderFamilyModes.bigmodel = "apiKey" 并填 API key),完全绕开 OAuth
相关 issue(不是重复,但可能共享根因)
附件
如有需要我可以提供:
- 管理员模式启动 + OAuth 卡住时的完整日志(
~/.zcode/v2/logs/<date>.log)
- 普通模式启动成功 OAuth 的对照日志
- Process Monitor (procmon) 抓取的 elevated/非 elevated 实例的文件/注册表/网络访问对比
现象
在 Windows 上以管理员身份运行 ZCode(右键 → "以管理员身份运行",或快捷方式勾选"以管理员身份运行此程序"),完成 OAuth 授权流程时:
OAuthService.handleCallback始终不会被触发切换回普通用户模式启动同一 ZCode 安装,OAuth 流程正常完成,可以登录。
复现稳定性
100% 复现(每次管理员模式启动都会卡住)。
复现步骤
~/.zcode/v2/credentials.json中oauth:bigmodel:*/oauth:active_provider条目)D:\ZCode\ZCode.exe→ 以管理员身份运行(UAC 弹窗确认)https://zcode.z.ai/...授权页zcode://callback?code=...(或类似 custom-scheme 回调),浏览器侧显示"已授权,可关闭此页面"对照组:同样步骤,第 2 步改为普通双击启动,第 7 步能正常进入工作区。
环境信息
D:\ZCode\ZCode.exe)Elucidate(SID:S-1-5-21-2776964738-1764272819-2565151984-1001)D:\ZCode\根因假设(供团队参考,非结论)
Windows 上 ZCode 通过 custom URL scheme
zcode://接收 OAuth 回调。该 scheme 在安装/首次启动时被注册到注册表,但只注册到HKCU\Software\Classes\zcode,未注册到HKLM\Software\Classes\zcode:当 ZCode 以普通用户启动时:
HKCU指向当前用户,浏览器(同用户)调起 ZCode → 单实例 IPC → 已运行实例收到 callback ✅当 ZCode 以管理员启动时(UAC elevation 后):
Elucidatezcode://callback?code=...交给系统 → ShellExecute 从HKCU\Software\Classes\zcode查到路径,启动一个新的非 elevated 的 ZCode.exe 进程相关日志佐证(在普通用户模式启动的
~/.zcode/v2/logs/<date>.log中,OAuth 成功路径会打印):管理员模式启动时,这三行一条都不会出现(即便浏览器侧已经同意)。
建议的修复方向(任选其一)
http://127.0.0.1:<port>/callback,embedded HTTP server 在 elevated 进程内监听,绕开 custom scheme 跨 integrity 的 IPC 问题(参考 VS Code、Cursor 的做法)CreateNamedPipe+ 适当 ACL;或用ChangeWindowMessageFilter放开WM_COPYDATA让 elevated 窗口能收到普通进程的消息HKLM\Software\Classes\zcode(需要管理员权限,刚好管理员启动时可以做),并保证ShellExecute启动子进程时启用runas让子进程也 elevated临时 Workaround
~/.zcode/v2/credentials.json读取,无需再次 OAuth)modelProviderFamilyModes.bigmodel = "apiKey"并填 API key),完全绕开 OAuth相关 issue(不是重复,但可能共享根因)
zai_oauth_required(不同 OS,但同属 OAuth callback 处理)附件
如有需要我可以提供:
~/.zcode/v2/logs/<date>.log)