目前我所知道的,在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权限的几种方法的更多相关文章

  1. Mac 在命令行中获得Root权限

    Mac 在命令行中获得Root权限 作者 firedragonpzy 13 九月, 2012 2条评论 本文为firedragonpzy原创,转载务必在明显处注明:转载自[Softeware MyZo ...

  2. android中获取root权限的方法以及原理(转)

    一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. 二. Root 的介绍 1. Root 的目的 可以让我们拥有 ...

  3. 几种破解MySQL root密码的几种方法:

    几种破解MySQL root密码的几种方法: 方法一 使用phpmyadmin,这是最简单的了,修改mysql库的user表,不过别忘了使用PASSWord函数. 方法二 使用mysqladmin,这 ...

  4. CentOS下添加Root权限用户(超级用户)方法

    1.添加普通用户[root@server ~]# useradd chenjiafa   //添加一个名为chenjiafa的用户[root@server ~]# passwd chenjiafa   ...

  5. 【译】在React中实现条件渲染的7种方法

    原文地址:https://scotch.io/tutorials/7-ways-to-implement-conditional-rendering-in-react-applications 借助R ...

  6. Win7,Vista UAC下应用程序标注为“需要管理员权限”的四种方法(可以修改注册表)

    [转]Vista UAC下应用程序标注为“需要管理员权限”的四种方法 在Microsoft 的UACBlog里对此有过叙述.总结如下: 首先,如果一个程序被识别为管理员程序时,Vista会在它的图标上 ...

  7. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  8. Java中获取键盘输入值的三种方法

    Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...

  9. Web Service 中返回DataSet结果的几种方法

    Web Service 中返回DataSet结果的几种方法: 1)直接返回DataSet对象    特点:通常组件化的处理机制,不加任何修饰及处理:    优点:代码精减.易于处理,小数据量处理较快: ...

随机推荐

  1. Android多线程分析之中的一个:使用Thread异步下载图像

    Android多线程分析之中的一个:使用Thread异步下载图像 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可.转载请注明出处 打算整理一下对 Android Fr ...

  2. UIImagePickerController在UIPopoverController中 旋屏问题

    1弧度=180/π度1度=π/180弧度今天遇到了 一个问题.UIImagePickerController在UIPopoverController中 旋屏问题. 在查找了许多资料后方知,此乃iOS系 ...

  3. manacher算法处理最长的回文子串(一)

    引言 相信大家都玩过折叠纸张,如果把回文串相当于折叠一个A4纸,比如ABCDDCBA就是沿着中轴线(D与D之间)对折重合,那么这个就是一个回文串.或者是ABCDEDCBA的中轴线就是E,那么沿着中轴线 ...

  4. 【BZOJ1996】[Hnoi2010]chorus 合唱队 区间DP

    [BZOJ1996][Hnoi2010]chorus 合唱队 Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Ou ...

  5. 【谷歌浏览器】在任意页面运行JS

    1.使用谷歌浏览器的调试功能: 在任何页面上运行代码片段 · Chrome 开发者工具中文文档 注:比较简单,直接,不过只能本地执行,只能自己使用.且需自行保存JS文件: 2.使用油猴插件: Tamp ...

  6. phpstorm的设置

    1.编码:file encodings 2.怎么让每次新建的php文件取消开头的注释:file and code templates  ->php file 去掉那个一串代码就可以了

  7. IO流入门-第一章-FileInputStream

    FileInputStreamj基本用法和方法示例 import java.io.*; public class FileInputStreamTest01 { public static void ...

  8. MySQL数据库的设计和表创建

    首先,我们使用Navicat Premium编辑器创建一个用户,同时设置用户权限,MySQL默认有一个root用户,拥有最高权限 下面,我们先创建一个用户: ①CREATE USER  'aaa'@' ...

  9. tpot从elastic search拉攻击数据之一 找本地数据端口

    前面,我们已经在ubuntu服务器上部署好了tpot,并启动进行数据捕获 可以通过64297端口登陆到kibana可视化平台查看捕获到攻击的情况. 现在要拉取攻击数据了,但是该怎么拉呢? 看了一上午的 ...

  10. Linux学习笔记(13)linux软件安装rpm与yum--理论篇

    该文章linux知识点如下 1.linux中 软件包介绍 2.linux源码软件安装 3.linux二进制软件安装 4.linux rpm软件包管理 5.linux yum软件包管理 1.linux中 ...