Skip to content

[Bug] ZCode 卡在 OAuth 等待同意界面 when launched as administrator on Windows #165

Description

@Var144

现象

在 Windows 上以管理员身份运行 ZCode(右键 → "以管理员身份运行",或快捷方式勾选"以管理员身份运行此程序"),完成 OAuth 授权流程时:

  • 浏览器弹出 Z.AI 授权页,用户点击"同意"后浏览器侧显示完成
  • 但 ZCode App 永远卡在"等待同意 / Waiting for authorization"界面
  • App 侧 OAuthService.handleCallback 始终不会被触发
  • 没有可见报错;只能手动关闭浏览器/App

切换回普通用户模式启动同一 ZCode 安装,OAuth 流程正常完成,可以登录。

复现稳定性

100% 复现(每次管理员模式启动都会卡住)。

复现步骤

  1. 确保 ZCode 已退出登录(或清空 ~/.zcode/v2/credentials.jsonoauth:bigmodel:* / oauth:active_provider 条目)
  2. 右键 D:\ZCode\ZCode.exe以管理员身份运行(UAC 弹窗确认)
  3. 在登录界面点击"Sign in with Z.AI"
  4. 系统默认浏览器打开 https://zcode.z.ai/... 授权页
  5. 点击"同意 / Authorize"
  6. 浏览器跳转到 zcode://callback?code=...(或类似 custom-scheme 回调),浏览器侧显示"已授权,可关闭此页面"
  7. 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)

管理员模式启动时,这三行一条都不会出现(即便浏览器侧已经同意)。

建议的修复方向(任选其一)

  1. 改用 loopback HTTP 回调:OAuth redirect_uri 用 http://127.0.0.1:<port>/callback,embedded HTTP server 在 elevated 进程内监听,绕开 custom scheme 跨 integrity 的 IPC 问题(参考 VS Code、Cursor 的做法)
  2. 跨 integrity IPC:elevated 实例监听 named pipe,non-elevated 回调转发器用 CreateNamedPipe + 适当 ACL;或用 ChangeWindowMessageFilter 放开 WM_COPYDATA 让 elevated 窗口能收到普通进程的消息
  3. 官方推荐不要以管理员模式运行 ZCode:在 manifest 或启动时检测 elevated 状态,弹窗提示"管理员模式不支持 OAuth 登录,请用普通模式启动",避免用户无意义等待
  4. 在管理员启动时主动把 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 实例的文件/注册表/网络访问对比

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions