MacOS App代码申请管理员权限
原文: https://jacobpan3g.github.io/cn/2018/02/07/gain-root-permission-for-mac-app/,有问题欢迎在原文评论区一起讨论交流,我会及时回复。
在MacOS App开发中,有一些操作需要管理员权限,需要弹出认证对话框让用户输入账号和密码,这个过程就是MacOS App提权的过程,主要有下面几种方式:
1. AuthorizationExecuteWithPrivileges()
使用这个接口最有代表的库是STPrivilegedTask,这是一个封装得很好得App提权库,接口与NSTask十分像,使用起来十分方便。
可惜得是AuthorizationExecuteWithPrivileges()接口在MacOS 10.7开始deprecated,据说在10.12的版本该接口就关闭了。
因此,若要兼容10.12以后的MacOS版本,就不得不放弃使用STPrivilegedTask库了。
2. 使用ServiceManagement.framework注册LaunchdDaemon
这是Apple官方目前推荐的提权方式,官方有一个SMJobBless的Demo,是用来有点复杂,具体请见另一篇文档"SMJobBless官方Demo笔记"
该方法有一个几个小缺点:
- 弹出认证对话框的提示内容是"需要Install Helper",而且每次打开都是这样的提示,对于小白用户来说,会不会误导用户App老是在安装什么东西?
- LaunchdDaemon及其配置文件是需要安装到
/Library下的,当用户把App卸载后会不会存在"残留问题"?
3. 使用AppleScript
do shell script "..." with administrator privileges
省略号部分填入shell脚本,任何可执行文件都需要写全路径,如/bin/ls。
以上是AppleScript脚本,通过这种方式提权有以下有点:
- 比上述"注册LaunchdDaemon"方法实现起来简单很多
- 同时也不用担心卸载残留的问题,因为全部东西都在.app里
AppleScript脚本在objective-c中有两种执行方式:
- 通过NSTask执行"/usr/bin/osascript -e "do shell ...""
- 通过NSAppleScript执行
方法1有两个缺点:
do shell script会在所有shell执行完成后再把所有stdout返回,因此当启动的是Daemon进程,就算使用NSTask的fileHandle Notification,也无法把stdout分次读取出来。- 这种方法的认证窗口提示信息是"osascript wants to make changes.",对于小白用户来说会不会有一种这样的感觉"我明明安装的是XXX.app,怎么来了一个osascript让我输入账号密码?会不会是恶意程序?"
而使用NSAppleScript方法时,认证窗口的提示信息是"APP_NAME wants to make changes.",感觉这样的提示更加友好。但也有一些缺点:
- NSAppleScript执行Daemon进程的话会直到Daemon退出才退出,即会一直占用线程。
解法:建议在子线程使用NSAppleScript,以免UI无法响应 - 也存在stdout只能等待Daemon退出才全部打印的问题
Jacob Pan ( jacobpan3g.github.io/cn )
MacOS App代码申请管理员权限的更多相关文章
- vs下给生成的程序(exe)加入默认的申请管理员权限
在vs下编程时,经常会用到一些特殊的权限,尤其是管理员权限,下面是在win7下笔者亲测通过的. 下面要分两种情况: 第一种情况就是在vs2003或者以下的编译器中运行 1.准备一个manifest文件 ...
- WIN8,开机启动 需要管理员权限的程序
1. 用WPF开发,需要管理员权限并开机启动,以写注册表的方式实现.仅写注册表只能启动一般权限的程序. 2. 考虑这样实现: 程序以一般权限启动,启动以后申请管理员权限. 实现: App类中重写OnS ...
- Objective-C MacOS以管理员权限执行程序
在MacOS下非常多操作是须要管理员权限的, 比方我们执行chmod.在命令行下能够使用sudo chmod来申请以管理员权限执行.可是使用XCode写的程序是不能使用sudo的. 须要自己写代码来申 ...
- vs2005 ,2008,2010中引入app.manifest(即c#程序在win7下以管理员权限运行方法)
打开VS2005.VS2008.VS2010工程,查看工程文件夹中的Properties文件夹下是否有app.manifest这个文件:如没有,按如下方式创建:鼠标右击工程在菜单中选择“属性”,点击工 ...
- 在MacOSX下用管理员权限打开App应用程序
最近但疼的事情比较多,特别是升级了10.9以后. 难怪10.9会免费,它喵的当我们所有人都是测试开发者,那我们做实验,到处都是BUG...虽然是这么吐槽了,但是实际上也没有特别大的,能够影响到我的生活 ...
- C#项目中引入app.manifest管理员权限运行
原文地址:https://blog.csdn.net/qq395537505/article/details/51010962 参考UAC:User Account Control 参考IE保护模式: ...
- bat代码中判断 bat是否是以管理员权限运行,以及自动以管理员权限运行CMD BAT
· bat 代码中判断bat是否是以管理员权限运行,以及自动以管理员权限运行CMD BAT 一.判断bat是否是以管理员权限运行 @echo off net.exe session >NUL & ...
- 【程序打包工具 Inno Setup】CreateProcess 失败:代码 740(Inno Setup打包的程序提升为管理员权限)
原文参考 https://www.cnblogs.com/SnailProgramer/p/4243666.html http://blog.csdn.net/x356982611/article/d ...
- Inno Setup CreateProcess 失败:代码 740(Inno Setup打包的程序提升为管理员权限)
原文参考 https://www.cnblogs.com/SnailProgramer/p/4243666.html http://blog.csdn.net/x356982611/article/d ...
随机推荐
- java面向对象基础(一)
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- ELK安装
一.概念 1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引 ...
- chrome disable-web-security 关闭安全策略 解决跨域
Chrome 跨域访问线上接口 时间:2016-04-21 作者:zhongxia 前后端分离之后,联调的时候就会出现问题,那就是Ajax跨域问题. 跨域问题的解决方案有很多种比如常规的 后端使用CR ...
- HashMap原理总结
来总结一下HashMap的原理 1.HashMap当中有一个内部类,它叫Node,然后这个Node呢,它其实是实现了Map.Entry接口,这个接口当中有几个抽象的方法和几个具体的方法.其中Map.E ...
- 高通HAL层之bmp18x.cpp
继续上一个链接内容所讲:http://www.cnblogs.com/linhaostudy/p/8430583.html 下面bmp18x sensor为例进行分析. BMP18x Sensor: ...
- Go笔记-map
[概念] 1- map 是引用类型的 2- 声明方式 var map1 map[keytype]valuetype 例如:var map1 ma ...
- 51NOD 1584 加权约数和 [莫比乌斯反演 转化 Trick]
1584 加权约数和 题意:求\(\sum_{i=1}^{N} \sum_{j=1}^{N} {\max(i,j)\cdot \sigma(i\cdot j)}\) 多组数据\(n \le 10^6, ...
- Linux压缩解压命令汇总
01-.tar格式 解包:[*******]$ tar xvf FileName.tar 打包:[*******]$ tar cvf FileName.tar DirName (注:tar是打包,不是 ...
- 一个巨low的“2048”
代码就是这样,做的不是4*4而是一个2*2 #include<stdio.h>#include<stdlib.h>#include<time.h>int main( ...
- CentOS 7 搭建基于携程Apollo(阿波罗)配置中心单机模式
Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性.服务端基于Spring Boot ...