[Bug] 非管理员启动时提权重启失败:crash_dump 用了 CWD 相对路径,子进程静默退出

Aperta Adatta ai principianti
#430 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
1/5
Tempo stimato
Meno di un'ora
Idoneità per principianti
85/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python
Ambito
desktop

Direzione di ricerca

Il traceback punta a new_gui.py riga 1930 nel blocco __main__, dove crash_dump.txt viene aperto con un percorso relativo alla CWD mentre PATHS["logs"] contiene già un percorso assoluto derivato da __file__; il figlio elevato eredita la directory di lavoro di cmd.exe dalla chiamata a ShellExecuteW vicino alla riga 1873. Inizia leggendo quei due punti, poi riproduci con un uv run new_gui.py non amministratore. Fatto significa che il dump viene scritto sotto PATHS["logs"] indipendentemente dalla CWD e la finestra GUI appare dopo il prompt UAC; passare PATHS["root"] come directory di lavoro nella chiamata a ShellExecuteW è la seconda metà opzionale.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Bug Fix / Bug 修复

问题描述

非管理员权限启动 uv run new_gui.py 时,程序打印完路径检测和「848 个记忆图像切片载入完成」后静默退出,GUI 窗口不出现。

原因是启动链上两处叠加:

  1. 入口用 CWD 相对路径写崩溃转储:open("logs/crash_dump.txt", "w");
  2. 非管理员启动会走提权重启(ShellExecuteW(..., "runas", ...)),提权后的子进程工作目录不含 logs/。

子进程在 main() 之前就抛 FileNotFoundError 退出,所以看不到任何窗口或报错框。

复现步骤

  1. 在仓库根目录用非管理员终端执行 uv run new_gui.py;

  2. 控制台输出(父进程):

    路径存在, 检测通过: <仓库根>\logs
    路径存在, 检测通过: <仓库根>\user\backup
    INFO - 发现 848 个记忆图像切片,正在载入缓冲区...
    INFO - 图像记忆切片载入完成: 848/848 成功
    
  3. 父进程提权重启后 sys.exit(0);提权子进程再次导入、打印同样的载入日志后立刻崩溃;

  4. 程序整体退出,无窗口。

用管理员终端启动则一切正常(is_admin() 为真,不走提权分支)。

预期行为

弹出 UAC,提权后正常显示 GUI 主窗口。

截图或录屏

本次无截图/录屏(问题表现为控制台输出后无窗口,已在「复现步骤」中给出控制台文本)。

相关日志

logs/critical_log.log / logs/log_2026-11-15-21-59.txt 中的关键片段:

INFO [2026-11-15 21:59:17,299] [image_tool.py:83] 发现 848 个记忆图像切片,正在载入缓冲区...
INFO [2026-11-15 21:59:28,329] [image_tool.py:131] 图像记忆切片载入完成: 848/848 成功
INFO [2026-11-15 21:59:30,545] [image_tool.py:83] 发现 848 个记忆图像切片,正在载入缓冲区...
INFO [2026-11-15 21:59:30,854] [image_tool.py:131] 图像记忆切片载入完成: 848/848 成功
CRITICAL [2026-11-15 21:59:30,857] [log.py:271] 未捕获的严重异常发生!
Traceback (most recent call last):
  File "new_gui.py", line 1930, in <module>
    fault_log_file = open("logs/crash_dump.txt", "w", encoding="utf-8")
FileNotFoundError: [Errno 2] No such file or directory: 'logs/crash_dump.txt'

注意:logs/crash_dump.txt 是由父进程成功创建的(0 字节),崩溃的是提权后的子进程,说明父进程 CWD 正确、子进程 CWD 不对。

完整日志(文件上传)

未上传文件,直接粘贴当天运行日志 logs/log_2026-11-15-21-59.txt 全文:

INFO [2026-11-15 21:59:17,299] [image_tool.py:83] 发现 848 个记忆图像切片,正在载入缓冲区...
INFO [2026-11-15 21:59:28,329] [image_tool.py:131] 图像记忆切片载入完成: 848/848 成功
INFO [2026-11-15 21:59:30,545] [image_tool.py:83] 发现 848 个记忆图像切片,正在载入缓冲区...
INFO [2026-11-15 21:59:30,854] [image_tool.py:131] 图像记忆切片载入完成: 848/848 成功
CRITICAL [2026-11-15 21:59:30,857] [log.py:271] 未捕获的严重异常发生!
Traceback (most recent call last):
  File "new_gui.py", line 1930, in <module>
    fault_log_file = open("logs/crash_dump.txt", "w", encoding="utf-8")
FileNotFoundError: [Errno 2] No such file or directory: 'logs/crash_dump.txt'
INFO [2026-11-15 21:59:53,657] [image_tool.py:83] 发现 848 个记忆图像切片,正在载入缓冲区...
INFO [2026-11-15 21:59:53,950] [image_tool.py:131] 图像记忆切片载入完成: 848/848 成功
INFO [2026-11-15 21:59:56,176] [image_tool.py:83] 发现 848 个记忆图像切片,正在载入缓冲区...
INFO [2026-11-15 21:59:56,497] [image_tool.py:131] 图像记忆切片载入完成: 848/848 成功
CRITICAL [2026-11-15 21:59:56,500] [log.py:271] 未捕获的严重异常发生!
Traceback (most recent call last):
  File "new_gui.py", line 1930, in <module>
    fault_log_file = open("logs/crash_dump.txt", "w", encoding="utf-8")
FileNotFoundError: [Errno 2] No such file or directory: 'logs/crash_dump.txt'

操作系统

Windows 11 家庭版 中文版(10.0.26300,x64)

Python 版本

3.12.10(uv 0.13.6,项目 .venv)

项目版本 / Commit

master @ 488d822


附:根因定位(供参考,不需要照搬)

层 位置 说明
隐患 new_gui.py:1930(__main__ 里) open("logs/crash_dump.txt", ...) 用 CWD 相对路径;而 PATHS["logs"] 本身是按 __file__ 算的绝对路径。全仓库没有 os.chdir,CWD 完全取决于启动方式
触发 new_gui.py:1873 ShellExecuteW(None, "runas", host, arguments, None, show) 03dea1411a「fix(gui): 提权改用签名宿主避免 UAC 弹框等十秒」(PR #417)把提权宿主从 sys.executable 换成了 cmd.exe。提权后的 cmd.exe 默认起在 C:\Windows\System32,子进程继承该 CWD,相对路径随之失效

建议修法(各一行):

# 1) 入口用绝对路径(治本,任何 CWD 都能跑)
fault_log_file = open(os.path.join(PATHS["logs"], "crash_dump.txt"), "w", encoding="utf-8")

# 2) 提权时显式传工作目录
result = ctypes.windll.shell32.ShellExecuteW(None, "runas", host, arguments, PATHS["root"], show)

改 1 即可解决本 issue;改 2 可以顺带避免其它依赖 CWD 的代码在提权后出问题。

Lingua principale
Python
Stelle
568
Fork
10
Merge medio
10h 7m
PR unite (30g)
108

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di syfoud/Simulated_Scepter

Tutte le issue di syfoud/Simulated_Scepter

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.