diff --git a/管理员权限说明.md b/管理员权限说明_v2.md similarity index 57% rename from 管理员权限说明.md rename to 管理员权限说明_v2.md index 0b365c1..2b2292a 100644 --- a/管理员权限说明.md +++ b/管理员权限说明_v2.md @@ -4,7 +4,7 @@ **版本要求**: 当前版本(v1.4.0+) -**权限要求**: 程序运行时需要管理员权限 +**权限请求方式**: 通过代码动态请求,而非PyInstaller配置 ## 为什么需要管理员权限? @@ -64,6 +64,24 @@ **点击"是"** 继续启动程序。 +### 权限请求机制 + +程序使用以下代码动态请求管理员权限: + +```python +# 请求管理员权限(Windows) +if sys.platform == 'win32' and not ctypes.windll.shell32.IsUserAnAdmin(): + params = ' '.join([f'"{arg}"' for arg in sys.argv]) + ctypes.windll.shell32.ShellExecuteW(None, 'runas', sys.executable, params, None, 1) + sys.exit(0) +``` + +**工作原理**: +1. 程序启动时检查当前是否以管理员身份运行 +2. 如果不是管理员,使用 Windows API 重新以管理员身份启动 +3. 当前进程退出,新的管理员权限进程启动 +4. 用户会看到 UAC 提示框 + ### 权限不足的后果 如果程序没有获得管理员权限,可能会出现: @@ -88,33 +106,54 @@ ## 技术实现 -程序通过 PyInstaller 的 `uac_admin=True` 配置请求管理员权限: +### 代码级权限请求 + +程序在 `gui.py` 中实现了权限请求: ```python -exe = EXE( - # ... 其他配置 - uac_admin=True, # 请求管理员权限 -) +import ctypes + +# 请求管理员权限(Windows) +if sys.platform == 'win32' and not ctypes.windll.shell32.IsUserAnAdmin(): + params = ' '.join([f'"{arg}"' for arg in sys.argv]) + ctypes.windll.shell32.ShellExecuteW(None, 'runas', sys.executable, params, None, 1) + sys.exit(0) ``` -这会在程序的可执行文件中嵌入 UAC 清单,Windows 会自动识别并请求权限。 +### 优势 + +1. **更安全可靠** + - 不依赖 PyInstaller 的 UAC 配置 + - 避免启动时的兼容性问题 + - 更灵活的权限管理 + +2. **更好的用户体验** + - 只在 Windows 平台请求权限 + - 检查当前权限状态,避免重复提示 + - 保持命令行参数传递 + +3. **跨平台兼容** + - 在非 Windows 系统上自动跳过权限检查 + - 不影响 Linux 和 macOS 用户 ## 安全说明 ### 为什么是安全的? -1. **数字签名**(如果已签名) - - 程序发布者信息可见 - - 可以验证文件完整性 - -2. **开源透明** +1. **开源透明** - 代码在 GitHub 上公开 - 可以审计安全性 + - 权限请求代码可见 -3. **本地运行** +2. **本地运行** - 所有处理都在本地进行 - 不需要网络连接(更新功能除外) +3. **最小权限原则** + - 只在需要时请求权限 + - 不滥用管理员权限 + - 明确告知用户权限用途 + ### 最佳实践 1. **始终从官方来源下载** @@ -132,7 +171,7 @@ exe = EXE( ## 常见问题 **Q: 为什么每次启动都要请求权限?** -A: 这是 Windows 安全机制,确保用户知道程序需要提升权限。 +A: 这是 Windows 安全机制,确保用户知道程序需要提升权限。程序会先检查是否已有管理员权限,避免重复提示。 **Q: 可以禁用这个提示吗?** A: 不建议禁用。可以通过调整 UAC 设置来减少提示,但这会降低系统安全性。 @@ -143,6 +182,38 @@ A: 不会。程序是开源的,所有功能都公开透明。你可以查看 **Q: 不给管理员权限能用吗?** A: 某些功能可能无法正常使用。强烈建议授予管理员权限。 +**Q: 为什么不使用 PyInstaller 的 uac_admin?** +A: PyInstaller 的 uac_admin 配置可能导致程序启动问题。使用代码级权限请求更安全可靠。 + +**Q: 在其他操作系统上会怎样?** +A: 程序会自动检测操作系统,只在 Windows 平台上请求管理员权限。 + +## 故障排除 + +### 程序闪退 + +**问题**: 程序启动后立即关闭 +**解决**: +1. 检查是否有 UAC 提示,点击"是" +2. 查看是否有错误日志 +3. 确保系统支持管理员权限请求 + +### 权限请求失败 + +**问题**: UAC 提示不出现 +**解决**: +1. 检查 Windows UAC 设置是否被禁用 +2. 确认系统没有禁用 UAC +3. 尝试右键"以管理员身份运行" + +### 配置文件丢失 + +**问题**: 程序无法保存配置 +**解决**: +1. 确保程序以管理员权限运行 +2. 检查配置目录权限 +3. 尝试重新安装程序 + ## 联系支持 如果遇到权限相关问题: @@ -155,3 +226,4 @@ A: 某些功能可能无法正常使用。强烈建议授予管理员权限。 **最后更新**: 2026-04-10 **版本**: v1.4.0+ +**实现方式**: 代码级权限请求(ctypes.windll.shell32.ShellExecuteW)