SMJobBless是苹果官方提供的用于“MacOS app获取root权限”的demo。

具体思路

使用Security.framework和ServiceManagement.framework两个库,把需要root权限的操作封装成一个进程,作为项目的子Target,把该子进程注册LaunchdDaemon。

成为LaunchdDaemon后:

  • 子进程会被放在/Library/PrivilegedHelperTools
  • 相应的配置文件.plist被放在/Library/LaunchDaemons,Launchd加载该子进程会需要读取该配置文件

更多介绍请见"参考资料1"

编译SMJobBless

从官网下载SMJobBless源码(下面"参考资料3"也有链接),具体操作Demo里的ReadMe.txt也讲述得比较清楚,只是由于新版本Xcode的编译产物不再放在项目目录里,所以ReadMe.txt里有一些步骤的路径要做一些调整

  1. 在xcode先编译项目

  2. 用终端进入项目根目录,运行下面命令

shell ./SMJobBlessUtil.py setreq <path-to-SMJobBlessApp.app> SMJobBlessApp/SMJobBlessApp-Info.plist SMJobBlessHelper/SMJobBlessHelper-Info.plist
其中<path-to-SMJobBlessApp.app>可以在xcode左边的Navigator的product下的编译产物APP"右击-Show in Finder"的到编译产物的路径。

脚本运行成功后会输出
SMJobBlessApp/SMJobBlessApp-Info.plist: updated SMJobBlessHelper/SMJobBlessHelper-Info.plist: updated

  1. 在Xcode对项目Clean,然后再Build

  2. 终端在项目根目录下执行

shell ./SMJobBlessUtil.py check <path-to-SMJobBlessApp.app>
没有输出任何东西即说明check通过。

  1. Run编译产物APP,会弹出输入账号密码的认证窗口,提示要"Install Helper";输入密码后,若Xcode打印出"Job is available!"的log,已经App的UI上有"The Helper Tool is available!",即说明Demo成功运行。

参考资料

  1. 通过ServiceManagement注册LaunchdDaemon

  2. Apple官方论坛关于如何编译SMJobBless的解析

  3. Apple官方Demo: SMJobBless

  4. Apple官方Demo: EvenBetterAuthorizationSample

这个是SMJobBless进一步的Demo,结合Sand-box的特性。

  1. StackOverflow: AuthorizationExecuteWithPrivileges is deprecated

  2. StackOverflow: Writing a privileged helper tool with SMJobBless()

  3. Apple官方文档: Authorization Services Programming Guide

Jacob Pan ( jacobpan3g.github.io/cn )

SMJobBless官方Demo笔记的更多相关文章

  1. ILRuntime官方Demo笔记

    调用/执行 热更中的方法 调用热更代码中方法,写在AppDomain中,记录一下主要几个方法: AppDomain.LoadAssembly 加载热更dll 执行热更代码的方法,有两种方式: appd ...

  2. Dubbo系列(3)_官方Demo说明

    一.本文目的     通过Dubbo的官方Demo介绍,学会搭建一个简单的Dubbo程序,包括服务端.客户端.接口等. Demo地址:https://github.com/alibaba/dubbo/ ...

  3. 订餐系统之微信支付,踩了官方demo的坑

        最近一个项目要增加微信支付的功能,想来这个东西出来这么久了,按微信提供的应该可以很快搞定的,结果提供的demo( JS API网页支付)中各种坑,咨询他们的客服,态度倒是非常好,就是解决不了问 ...

  4. React Native官方DEMO

    官方给我们提供了UIExplorer项目,这里边包含React Native的基本所有组件的使用介绍和方法. 运行官方DEMO步骤如下 安装react native环境 React Native项目源 ...

  5. Unity 官方 Demo: 2DPlatformer 的 SLua 版本。

    9月份时,趁着国庆阅兵的假期,将 Unity 官方 Demo: 2DPlatformer 移植了一个 SLua 版本,并放在了我的 GitHub 账号下:https://github.com/yauk ...

  6. curl批处理从官方demo封装

    官方demo // 创建一对cURL资源 $ch1 = curl_init(); $ch2 = curl_init(); // 设置URL和相应的选项 curl_setopt($ch1, CURLOP ...

  7. Qt5官方demo分析集11——Qt Quick Particles Examples - Affectors

    在这个系列中的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集10--Qt ...

  8. Qt5官方demo分析集29——Extending QML - Property Value Source Example

    此系列的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集28--Extend ...

  9. 微信小程序入门——怎么建多个项目?(导入官方Demo程序进行学习)

    昨天1月9日微信小程序发布,顿时被朋友圈刷爆,今天看了一下官方文档,自己开始一步一步搭建环境体验小程序开发. 常见问题: 1.微信小程序开发是否需要重新创建开发者账号? 需要,即使之前申请了微信服务号 ...

随机推荐

  1. keepalived深度结合lvs_dr模式

    keepalived与dr模式结合 keepalived介绍 keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能), 这样可以简单 ...

  2. JavaSE基础篇—MySQL三大范式—数据库设计规范

    1.概   念     范式是一种符合设计要求的总结,要想设计一个结构合理的关系型数据库,必须满足一定的范式.各个范式是以此嵌套包含的,范式越高,设计等级越高,在现实设计中也越难实现,一般数据库只要打 ...

  3. 网页窗口logo图标设置

    网站上的logo实际上是一个“**.ico”图片,比如说favicon.ico.实现步骤:第一步:制作favicon.ico,大小一般为16*16毫米(ico图片制作网址http://www.ico. ...

  4. C++ concurrency in action 读随记1

    翻了翻,感觉标准库支持的并发应该是kernel level 的(书里也没有明确写,不过他写了诸如"操作系统来安排""需要知道硬件支持多少线程"等等话语,所以猜测 ...

  5. Codeforces C. Classroom Watch

    C. Classroom Watch time limit per test 1 second memory limit per test 512 megabytes input standard i ...

  6. 赋值号和printf

    1.赋值号会自动转换类型: int a= 2.1; printf(‘‘%d’’,a);         //输出结果是2 2.printf不会转换类型,而是直接将内存中表示的补码数拿出来,最明显的就是 ...

  7. 知识点干货—多线程同步【6】之synchronized

    "明日复明日,明日何其多. 我生待明日,万事成蹉跎. 世人若被明日累,春去秋来老将至. 朝看水东流,暮看日西坠. 百年明日能几何?请君听我明日歌. 明日复明日,明日何其多! 日日待明日,万世 ...

  8. 百度坐标(BD-09)、国测局坐标(火星坐标,GCJ-02)和WGS-84坐标互转

    // 坐标转换 var coordTransform = (function () { // 一些常量 var PI = 3.1415926535897932384626; var X_PI = 3. ...

  9. Effective Java 之-----for-each循环优于传统的for循环

    如下代码: enum Face {1,2,3,4,5,6}: ...... Collection<Face> faces = Array.asList(Face.values); for( ...

  10. python3操作redis

    redis也被称为缓存 1.redis是一个key-value存储系统,没有ForeignKey和ManyToMany的字段. 2.在redis中创建的数据彼此之间是没有关系的,所以也被称为是非关系型 ...