《山月也》Electron程序:运行时动态请求权限,保存至管理员目录

155 阅读1分钟

项目场景:

提示:这里简述项目相关背景:

公司开发的某签章程序采用Electron技术,需要在用户完成签章后,把签章文件保存到指定的电脑本地目录.....


问题描述

提示:这里描述项目中遇到的问题:

为了便捷地唤起应用,我们在用户注册表中设置了自定义协议。这样,用户只需在浏览器地址栏输入特定的自定义协议(例如:自定义协议名://),即可启动程序。由于是通过协议唤起程序,传统的在启动时附加管理员权限的方法不再适用。因此,我们的解决方案是在程序运行期间,当需要保存文件到本地时,动态请求管理员权限。

因为上述唤起程序的方法,导致程序无法把文件保存到需要管理员权限的目录,如:

 fs.writeFile(saveFilePath, data, (err) => {
 	if (err){
 		// 保存异常
 		return;
 	}
 	// 保存成功
 }

解决方案:

提示:这里填写该问题的具体解决方案:

刷了一下CSDN、掘金,发现很多人推荐使用 @vscode/sudo-prompt保存文件 方法如下:

      // content: '123456'
      // filePath: C:/1.txt
      sudo.exec(
       `echo ${content} >${filePath}`,
      {
        name: 'Electron'
      },
     (error) => {
       if (error) {
       		// 保存失败
          return;
       }
     	// 保存成功
      }
    )

但是上述方法在保存pdf时会损坏文件,无论内容的数据格式是buffer、ArrarBuffer、base64.....

于是我想到一个折中的办法:先把文件使用fs.writeFile方法保存到系统临时目录,然后使用 @vscode/sudo-prompt再把文件从临时目录移动到指定的电脑本地目录 方法如下:

// filePath: 临时目录/1.pdf
// movePath: C:/
sudo.exec(
 `move ${filePath} ${movePath}`,
   {
     name: 'Electron'
   },
   (error) => {
     if (error) {
       // 保存失败
     }
     // 保存成功
   }
 )