Electron应用申请管理员权限

前言

Electron是一款使用 JavaScript, HTMLCSSWeb 技术创建原生程序的框架,它内部集成了ChromiumNode.js.

前端工程师通过Electron相关技术,可以开发基于WindowsLinux以及Mac系统的客户端应用,这些能力拓展了前端所能触摸的边界,释放了更大的想象空间.

如果客户端应用仅仅局限于页面内容的展现和操作,通过web相关技术就可以实现.但由于Electron集成了Node.js,这便使开发的应用具备调用操作系统级别服务的能力.

Electron调用某些操作系统的服务时,往往会受到系统权限的限制.比如在Linux系统下开发的程序,调用shell脚本命令时就需要在执行命令前面加上sudo,运行后再输入管理员密码,密码验证通过后脚本才能如期执行.

win10操作系统以及mac系统对权限同样有着严格的把控.本文接下来将研究一下Electron应用如何在程序运行期间申请提权以及背后的实现原理.

实践

Electron应用运行期间想申请更高的执行权限,通过引用githup上的一个jssudo-prompt就能轻松实现.

sudo-prompt没有外部的依赖以及原生模块的绑定,是一段完全使用nodejs编写的脚本.

sudo-promptwindowsLinux以及Mac系统不同平台下对权限申请方式做了处理和封装,使Electron应用能支持多平台下的提权操作.接下来将演示一下sudo-prompt的使用方式,详情可点击访问 仓库地址.

  • 项目根目录下执行 npm install sudo-prompt --save 安装依赖.

  • 调用方式如下代码(当前最新版本9.2.1,如果版本不同请访问仓库地址查阅).

创建一个对象options,属性名name(应用名称)可以自定义.但name只能为字母、数字和空格,最多不能超过70个字符.

最后使用 sudo.exec('命令',...) 执行命令.sudo.exec一执行就会弹出申请权限的窗口,用户输完密码进入回调函数,stdout为执行命令后的输出结果.

const sudo = require('sudo-prompt');
const options = {
  name: 'Electron'
};
sudo.exec('echo hello', options,
  function(error, stdout, stderr) {
    if (error) throw error;
    console.log('stdout: ' + stdout);
  }
);

Linux图形界面的执行效果图如下:

在这里插入图片描述

原理分析

sudo-prompt在不同平台下对权限做了不同的处理,接下来以LinuxWindows为例,探索一下它背后的实现原理.

Linux

当前Linux系统有四大图形桌面环境,分别是KDEGnomeXfceLXDE.其中KDEGnome都包含了一系列标准的桌面工具和很多功能强大的应用软件,使用体验逐渐逼近Windows.XfceLXDE属于轻量级桌面环境.

这些桌面环境安装好后,一般默认会内置一些提升程序权限的指令,比如KDE图形界面默认内置/usr/bin/kdesudo,该路径下的kdesudo指令运行起来就能提示输入管理员密码,允许授权用户以其他身份执行程序.

同样其他桌面环境也如此,利用这些内置的指令程序就能顺利申请管理员权限运行.

具体做法可以先定义两个路径 const paths = ['/usr/bin/kdesudo', '/usr/bin/pkexec'],先在系统中去寻找这两个程序,看系统中包含哪一个就调用谁.

如果找到了pkexec,拼接字符串格式如下:

 '"/usr/bin/pkexec" --disable-internal-agent "/bin/bash" -c "echo SUDOPROMPT; echo hello"'

如果是kdesudo,拼接字符串格式如下:

 '"/usr/bin/pkexec" --comment "Electron wants to make changes.Enter your password to allow this." -d -- /bin/bash -c "echo SUDOPROMPT; echo hello"'

字符串拼接好后,我们就可以利用Node.js的子进程Process.child.exec来执行上面的字符串命令.

如果执行后发现报错,错误信息为No polkit authentication agent foun. 那可能是因为Linux系统内polkit相关的服务没有安装或没启动起来.比如安装的轻量级桌面xfce4(Ubuntu系统)可能会缺少这个模块,可以采用以下两步来解决.

  • 安装polkit sudo apt-get install policykit-1-gnome
  • 启动服务 /usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1 &

如果一切顺利,命令执行完后界面就会弹出输入密码框,只有当密码验证正确后才会执行上面拼接字符串的最后面的指令echo hello,这就是我们自定义希望获取系统权限后要执行的指令.

Windows

Windows系统下使用传统的CMD窗口去申请管理员的权限十分繁琐,但所幸有PowerShell的存在让一切都变的非常简单.

Windows PowerShell是一种和CMD类似的命令行外壳程序,它可以使命令行用户和脚本编写者利用.NET Framework的强大功能完成想要的操作.从Windows 7开始系统就已经内置了PowerShell.

有了PowerShell的加持,我们可以先把想要系统去执行的命令封装成一个command.bat文件(代码如下).

@echo off
chcp 65001>nul
cd /d '/Users/kay/Desktop/demo/project'
echo hello
  • @echo off关闭回显,不显示正在执行的批处理命令及执行的结果等.
  • chcp 65001将命令行窗口活动代码页设置为utf-8格式
  • cd切换到项目目录下
  • echo hello是最终希望系统执行的命令

以上字符可通过字符串的拼接的方式组合而成,再通过Node.jsfs.writeFile将字符串写入到command.bat文件中储存起来.

脚本文件准备好后,接下来拼接命令字符串如下:

powershell.exe Start-Process -FilePath '/Users/kay/Desktop/demo/project/command.bat' -WindowStyle hidden -Verb runAs

powershell通过添加参数-Verb runAs就能为应用程序提权,从而执行command.bat里面的脚本代码.

字符串拼接好后,Node.js的子进程Process.child.exec执行字符串命令从而达到最终的目的.

总结

综上所述,不管是Windows还是Linux系统,它们都会内置一些提权的程序.只要找到这些程序的调用方式以及相关参数的含义,就能顺利为Electron应用申请到管理员权限从而完目标操作.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值