Electron 有一个 app.setLoginItemSettings
方法,可以设置应用开机自动启动,在 Windows 下非管理员权限时可以正常启动,但是如果打包时要求了管理员权限,则自启动会失败。
Windows 下很多正常的操作都需要管理员权限才能进行,这里就不深究这个行为的正确性了。总之,我这里的需求是开机自动启动,因为这样可以避免用户忘记启动,同时又要求管理员权限,可以接受弹出 UAC 确认,让用户继续。
通过观察 Electron 在 Windows 下的编译产物,可以发现 ./resources
目录中存在一个 elevate.exe
,看名字猜想这个是用来提升权限的,简单测试了一下确实如此。
那么方案就有了,只需先用普通用户权限开机自启动,然后在代码中判断当前是否为管理员权限,如果不是,则通过 resources/elevate.exe
提升权限,以管理员权限重新启动。
核心代码如下:
if (!isAdmin()) {
spawn(pathToElevate, [process.execPath, ...process.argv], {
detached: true,
});
app.quit();
}
那么如何判断当前是否为管理员权限呢?这里通过万能的 StackOverflow 找到了一个黑科技方案,似乎还比较通用,就是测试一下能否正常执行 net session
命令,如果不是管理员权限,则这个命令会因为无权限而失败。