跨网络互联技术(UAC-NSSM)
Flutter App (普通用户权限,无需UAC)
↓ HTTP POST
Windows Service (SYSTEM权限,已注册,无需UAC)
↓ 执行管理员操作
sing-box.exe / 路由配置 / 系统代理
- **安装时**:弹 1 次 UAC 注册服务
- **运行时**:完全不弹 UAC ✅
- **实现方式**:使用 NSSM 将 sing-box.exe 包装为 Windows 服务
**NSSM** = **Non-Sucking Service Manager**("不会让人抓狂的服务管理器")
它是一个轻量级的工具,用来将**普通的可执行文件**包装成 **Windows 系统服务**。
**问题**:
- 每次启动 sing-box.exe 都会**弹出 UAC**(因为需要管理员权限创建 TUN 网卡)
- 用户每次都要点"是",体验很差
## 💡 NSSM 的作用
NSSM 将进程转换为 Windows 服务:
现在(直接启动):
Flutter App → 启动 sing-box.exe → [弹UAC] → ✅ 运行
用 NSSM 包装后:
Flutter App → 调用 Windows 服务 API → sing-box 服务 → ✅ 运行(无UAC)
#### 1. 下载 NSSM
**下载地址**:NSSM - the Non-Sucking Service Manager
你的项目目录/
└─ xray/
├─ nssm.exe ← 应该在这里
├─ sing-box.exe
├─ xray.exe
└─ ...其他文件
💡 工作原理
安装前(每次弹 UAC)
用户点击连接 → Flutter 启动 sing-box.exe
→ [UAC 弹窗] ← 每次都弹!
→ 用户点击"是" → VPN 连接
安装后(不弹 UAC)
用户点击连接 → Flutter 启动 Windows 服务
→ 服务以 SYSTEM 权限运行 sing-box
→ VPN 连接 ← 不弹 UAC!✅
使用 PowerShell 获取当前用户 SID
读取服务当前的 SDDL
在 DACL 部分添加新的 ACE,授予当前用户启动/停止权限
应用修改后的 SDDL
这样做的好处:
✅ 只需要安装时运行一次(需要管理员权限)
✅ 之后普通用户就可以 sc start/stop 了
✅ 不需要修改应用程序的 manifest
✅ 更安全,只授权特定操作,不是完全的管理员权限
