cocoa中获得root权限的几种方法
目前我所知道的,在cocoa中获得root权限的方法有3种:
1. 通过AuthorizationCopyRights函数
2. 在UI上添加一个锁的样子的控件,然后通过开关这个锁来获取root权限
3. 直接调用Applescript来以root权限执行脚本
其中方法1和2一般用来执行一个shell脚本或者一个可执行文件,方法3则直接执行一个applescript脚本。
当然方法1和2也可以执行一个保存的applescript脚本,方法3也可以用applescript脚本来执行shell或可执行文件。
通过AuthorizationCopyRights
这种方法的缺陷是每次需要root权限都要执行一次,或者必须在程序开启的时候获取root权限。
请看下面的代码:
OSStatus status;
AuthorizationRef authRef;
status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef); AuthorizationRights authRights;
AuthorizationItem authItems[]; authItems[].name = kAuthorizationRightExecute; authRights.count = sizeof(authItems) / sizeof(authItems[]);
authRights.items = authItems; AuthorizationFlags authFlags = kAuthorizationFlagDefaults | kAuthorizationFlagExtendRights | kAuthorizationFlagInteractionAllowed; status = AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags, NULL);
if(status != errAuthorizationSuccess)
{
NSLog(@"Copy rights unsuccessful: %d",status);
}
.......... //中间省略
status = AuthorizationExecuteWithPrivileges(authRef, 可执行文件的路径, kAuthorizationFlagDefaults, 可执行文件需要的参数, nil);
if (status != errAuthorizationSuccess)
{
NSLog(@"Error: %d", status);
}
在UI上加一个锁
这个方法比较灵活,打开锁之后任何需要root权限的地方都可以直接用了,是我最推荐的一个方法
1. 首先给自己的项目添加两个framework。Build phrase -> Link Binary With Libraries 添加Security.framework 和 SecurityInterface.framework.
2. 在UI上拖拽进去一个Custom view控件,然后把它的Custom class设为SFAuthorizationView
3. 在AppDelegate.h中添加代码如下:
...........
#import <SecurityInterface/SFAuthorizationView.h>
#import <SystemConfiguration/SystemConfiguration.h> @interface AppDelegate : NSObject <NSApplicationDelegate>
{
............
IBOutlet SFAuthorizationView *authView;
............
}
-(BOOL)isUnlocked;
添加两个头文件,并把custom view跟一个SFAuthorizationView 变量关联起来。
4. 在AppDelegate.m中添加如下代码:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
AuthorizationItem items = {kAuthorizationRightExecute,,NULL,};
AuthorizationRights rights = {,&items};
[authView setAuthorizationRights:&rights];
authView.delegate =self;
[authView updateStatus:nil];
} -(BOOL)isUnlocked
{
return [authView authorizationState] == SFAuthorizationViewUnlockedState;
} -(void)authorizationViewDidAuthorize:(SFAuthorizationView *)view
{ } -(void)authorizationViewDidDeauthorize:(SFAuthorizationView *)view
{
} -(void)doSomething
{
.............
OSErr processErr = AuthorizationExecuteWithPrivileges([[authView authorization] authorizationRef], [binaryPath UTF8String], kAuthorizationFlagDefaults, (char* const*)args, nil);
if (processErr != errAuthorizationSuccess)
{
NSLog(@"Error: %d", processErr);
}
.............
}
applicationDidFinishLaunching 首先在程序启动的时候初始化authView
isUnlocked 判断那个锁是否锁住
authorizationViewDidAuthorize 和 authorizationViewDidDeauthorize 分别在锁被打开和被锁住的时候触发,你可以做你自己想做的事情,比如把按钮变灰之类的
doSomething 就可以利用authView authorization 来授权AuthorizationExecuteWithPrivileges进行root权限的操作了
可参考http://bdunagan.com/2009/12/13/system-preferences-pane-lock/
利用applescript来执行root操作
NSDictionary *errorInfo = [NSDictionary new];
NSString *script = [NSString stringWithFormat:@"do shell script \"%@\" with administrator privileges", fullScript]; NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script];
NSAppleEventDescriptor * eventResult = [appleScript executeAndReturnError:&errorInfo]; // Check errorInfo
if (! eventResult)
{
// do something you want
}
cocoa中获得root权限的几种方法的更多相关文章
- Mac 在命令行中获得Root权限
Mac 在命令行中获得Root权限 作者 firedragonpzy 13 九月, 2012 2条评论 本文为firedragonpzy原创,转载务必在明显处注明:转载自[Softeware MyZo ...
- android中获取root权限的方法以及原理(转)
一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. 二. Root 的介绍 1. Root 的目的 可以让我们拥有 ...
- 几种破解MySQL root密码的几种方法:
几种破解MySQL root密码的几种方法: 方法一 使用phpmyadmin,这是最简单的了,修改mysql库的user表,不过别忘了使用PASSWord函数. 方法二 使用mysqladmin,这 ...
- CentOS下添加Root权限用户(超级用户)方法
1.添加普通用户[root@server ~]# useradd chenjiafa //添加一个名为chenjiafa的用户[root@server ~]# passwd chenjiafa ...
- 【译】在React中实现条件渲染的7种方法
原文地址:https://scotch.io/tutorials/7-ways-to-implement-conditional-rendering-in-react-applications 借助R ...
- Win7,Vista UAC下应用程序标注为“需要管理员权限”的四种方法(可以修改注册表)
[转]Vista UAC下应用程序标注为“需要管理员权限”的四种方法 在Microsoft 的UACBlog里对此有过叙述.总结如下: 首先,如果一个程序被识别为管理员程序时,Vista会在它的图标上 ...
- .net中创建xml文件的两种方法
.net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...
- Java中获取键盘输入值的三种方法
Java中获取键盘输入值的三种方法 Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...
- Web Service 中返回DataSet结果的几种方法
Web Service 中返回DataSet结果的几种方法: 1)直接返回DataSet对象 特点:通常组件化的处理机制,不加任何修饰及处理: 优点:代码精减.易于处理,小数据量处理较快: ...
随机推荐
- linq依据传入数据集合查询相应子级数据
工作中经经常使用到的linq依据传入数据集合查询相应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点相应ID数据集合,再依据ID数据集合查询所有子级数据. //获取缓存 ...
- thrift框架总结,可伸缩的跨语言服务开发框架
thrift框架总结,可伸缩的跨语言服务开发框架 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等.其 ...
- python中的json和pickle
author:headsen chen date::2018-04-10 09:56:54 json模块和pickle模块: 这是用于序列化的两个模块: 概念介绍:json和pickle模块是将数据 ...
- 《从零开始学Swift》学习笔记(Day 57)——Swift编码规范之注释规范:文件注释、文档注释、代码注释、使用地标注释
原创文章,欢迎转载.转载请注明:关东升的博客 前面说到Swift注释的语法有两种:单行注释(//)和多行注释(/*...*/).这里来介绍一下他们的使用规范. 1.文件注释 文件注释就在每一个文件开头 ...
- 修改sudoers权限之后无法sudo的最简单解决方法
网上百度一下进入recovery模式或是单用户模式仍然修改不了sudoers的权限, 后来终于在网上找到了一种最简单的方法,那就是 pkexec chmod 0440 /etc/sudoers
- mysql5.7 安装版安装
参考 http://dev.mysql.com/doc/refman/5.7/en/installing.html 下载mysq5.7的安装包 http://dev.mysql.com/downloa ...
- Android 界面滑动卡顿分析与解决方案(入门)
Android 界面滑动卡顿分析与解决方案(入门) 导致Android界面滑动卡顿主要有两个原因: 1.UI线程(main)有耗时操作 2.视图渲染时间过长,导致卡顿 目前只讲第1点,第二点相对比较复 ...
- LeetCode 学习
1.整数反转 题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 思路:把最后的一位提取出来,放到新的容器前面,反复进行上面的操作,同时也要判断是否会导致溢出 class ...
- 手动拼写出来的sp_who结果集
SELECT SPID = er.session_id ,STATUS = ses.STATUS ,[Login] = ses.login_name ,Host = ses.host_name ...
- tagName()方法详解
1.该方法可以通过元素的标签名称来查找元素.这个方法搜索到的元素通常不止一个,所以一般建议结合使用findElements方法来使用: driver.findElement(By.xpath(&quo ...