Golang申请Windows及MacOS的管理员执行权限

7次阅读
没有评论

共计 1060 个字符,预计需要花费 3 分钟才能阅读完成。

前言

最近基于  Fyne  这个 Golang 的 Gui 库开发了一款  Github Hosts  同步工具,有兴趣可以到  https://github.com/Licoy/fetch-github-hosts  查看源码(允许的话还可以点一个小小的 star)。

这款程序的主要功能由于是修改系统的 hosts,所以需要的权限就特别高。在 Windows 下需要以管理员身份执行,MacOS/Liunx 下需要使用  sudo  执行,但是  Fyne  框架并没有提供权限申请的 API,所以就开始了捣鼓之旅。

Golang 申请 Windows 及 MacOS 的管理员执行权限

寻找方案

在初次想到解决这个问题方案的时候,脑海里浮现的就是在程序内使用  exec command  来运行申请权限的语句,然后再来执行本程序。但是奈何才疏学浅,根本就不知道什么命令可以完成这个操作。

然后就开始在  Fyne  的 issue 里找有没有人和我有同样的问题,果然不出所料,在  #1265  中,有人遇到了和我一样的问题,不过此 issue 现在还是打开状态,但 … 有人在下面给出了临时解决方案,使用一个第三方库:https://github.com/getlantern/elevate

解决

在  getlantern/elevate  中,作者实现了  Windows  及 MacOS 下的提权逻辑,只有  Linux  还没实现,不过对于我来说也够了。

看了给出的  Demo,开始我还以为是需要提供一个需要管理员执行的命令才可以启动,后来才发现我绕偏了。

两个参数:一个是name,代表需要启动的程序完整路径;第二个是args,代表程序的启动参数;这里的程序指代的是自己需要进行提权的程序。

于是,在程序启动的时候传入这两个参数即可,例如在  fetch-github-hosts  中的实现为:

// 解析参数 args := ParseBootArgs() // 如果没有禁止提权申请及非提权申请状态以及非 Linux 系统时,则进行提权操作 if !args.DontEscalate && !args.Escalate && runtime.GOOS != Linux {    // 传入进入提权状态参数    cmd := elevate.Command(os.Args[0], "--escalate")    // 开始运行    cmd.Run()    // 结束    os.Exit(0)}// 下面为启动后的业务代码 // other code...

后记

经过这一番折腾,在寻找解决方案的过程中,对  Fyne  这个 GUI 库和系统底层权限又多了一些认识。

总之问题是时常遇见的,多几分耐心,如果不是前沿技术,大概率这个问题都会有人遇到过及有对应的解决方案。

正文完
 0
litao2024
版权声明:本站原创文章,由 litao2024 于2024-06-06发表,共计1060字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码