Electron 在 Windows 下以管理员权限自启动

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 命令,如果不是管理员权限,则这个命令会因为无权限而失败。


© 2021