MacOS提权流程

最近在做MacOS App打开虚拟端口的需求时,遇到”Operation not permitted“的报错信息,查阅资料后发现mac上虽然权限比iOS告,但需要一些操作,需要提权。

网上常见的提权方式有三种:AuthorizationExecuteWithPrivileges、LaunchdDaemon、AppleScript。经过调研我们需求比较符合使用LaunchdDaemon,所以这次主要记录下这种方式的实现过程,其他方法及具体介绍可以看这位博主的文章

网上有很多LaunchdDaemon的实现步骤,但是时间久远,很多按照步骤都无法运行,经过踩坑以后,这次记录下我的实现过程,并已经成功运行。这边文章综合参考了TunelBlick,EvenBetterAuthorizationSample,SMJobBless中的相关代码。

第一步

1、由于新版的xcode建立Mac工程后默认没显示Info.plist文件,所以新建工程后,在主工程Tartget--Info里面随便添加一个key,让Info.plist显示在工程目录中。

1637805038783.jpg

2、避免后续步骤比较麻烦,在XCode--Preferences--Locations--locations--Advanced,改成Legacy。这一步会将生成.app放到工程目录内。


1637807484810.jpg

*以下步骤参考SMJobBless的Demo

3、关闭AppSanbox。


4、拷贝 Demo 中的 SMJobBlessUtil.py 到项目根目录。
5、创建一个新 Target,选择 Command Line Tool,命名为 MyAppHelper。

*以下内容参考EvenBetterAuthorizationSample的Demo
6、创建 MyAppHelper-Info.plist 文件并配置必要参数。
7、创建 MyAppHelper-Launchd.plist 文件并配置必要参数。
8、在 MyAppHelper Target 中配置 Product Module Name 和 Product Name 为MyAppHelperTarget的BundleID。
9、选择 MyApp Target 配置 Copy Files,路径 Contents/Library/LaunchServices。
10、生成签名参数(参考SMJobBless中的ReadMe文件)。
成功后会输出:
SMJobBlessApp/SMJobBlessApp-Info.plist: updated
SMJobBlessHelper/SMJobBlessHelper-Info.plist: updated
然后用./SMJobBlessUtil.py check <SMJobBlessApp.app:path>检查
没有任何输出代表成功。
11、最后可以写入授权代码及测试代码,这一步具体代码参考EvenBetterAuthorizationSample中AppDelegate中代码和common及HelperTool。

12、HelperTool中需要把kHelperToolMachServiceName改为自己的,AppDelegate中的InstallAction也需要改为自己的。

中间每一个步骤一定要按照配置和ReadMe中的步骤去弄,不然会出错。

最后,相当于是先运行install方法,启动helper,然后仿照EvenBetterAuthorizationSample中的实现方式就可以通过helper进程实现提权的操作了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容