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对象 特点:通常组件化的处理机制,不加任何修饰及处理: 优点:代码精减.易于处理,小数据量处理较快: ...
随机推荐
- django数据库设计
1 知识点 主要是分析设计数据库的数据表和数据表字段,然后使用Navicat Data Modeler创建模 将sqlite数据库修改成mysql数据库,同步数据 2 模型 2.1 数据表所有的数据列 ...
- java关于Timer schedule执行定时任务 !!!!!!!!!
1.在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类. private java.util.Time ...
- Poj1426
Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25721 Accepted: 106 ...
- 推荐10 个短小却超实用的 JavaScript 代码段
1. 判断日期是否有效 JavaScript中自带的日期函数还是太过简单,很难满足真实项目中对不同日期格式进行解析和判断的需要.jQuery也有一些第三方库来使日期相关的处理变得简单,但有时你可能只需 ...
- query_string查询支持全部的Apache Lucene查询语法 低频词划分依据 模糊查询 Disjunction Max
3.3 基本查询3.3.1词条查询 词条查询是未经分析的,要跟索引文档中的词条完全匹配注意:在输入数据中,title字段含有Crime and Punishment,但我们使用小写开头的crime来搜 ...
- FW qunit introduction
自动化测试软件对于开发来说是一个很重要的工具,而单元测试对于自动化测试来说是基本组成部分:软件的每一个组件或者单元可以在非人工介入的情况下,使用测试工具一遍遍的重复执行.换句话说,就是你可以写一次测试 ...
- 2015-04-14——css3 @media
//判断横竖屏 @media screen and (min-aspect-ratio: 13/13) { body {background-color:red;}} //屏幕宽高比,必须是除数形式 ...
- SQL与Access使用查询结果集更新表
SQL语法 update 表1 set 字段1 = bb.字段1 from 表1 as aa, (select 字段1,字段2 from 表) bb where aa.字段2 = bb.字段2 Acc ...
- C++ 常见字符处理 收录
1.string字符串删除 字符串中 指定字符 std::string& HTTPRequestHandlerImpl::replace_all_distinct(std::string&am ...
- 在Linux下查找文件内容包含某个特定字符串的文件
如何在Linux下查找文件内容包含某个特定字符串的文件? 我的目录下面有test1和test2两个文件夹,里面都含有很多文件,其中test2里面还包含一个test文件夹 我想请问的是,如何通过查找关键 ...