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[1];

    authItems[0].name = kAuthorizationRightExecute;

    authRights.count = sizeof(authItems) / sizeof(authItems[0]);
    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,0,NULL,0};
    AuthorizationRights rights = {1,&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
    }
时间: 2024-09-27 18:23:19

cocoa中获得root权限的几种方法的相关文章

Redhat 赋于 root 权限的三种方法

方法一: 修改/etc/sudoers 文件,找到下面一行,把前面的注释(#)去掉? ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL? 然后修改用户,使其属于root组(wheel),命令如下:? #usermod -g root tommy 修改完毕,现在可以用tommy帐号登录,然后用命令su – ,即可获得root权限进行操作. ? ? 方法二: 修改/etc/sudoers 文件,找到下面一

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

一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. 二. Root 的介绍 1. Root 的目的 可以让我们拥有掌控手机系统的权限,比如删除一些system/app下面的无用软件,更换开关机铃声和动画,拦截状态栏弹出的广告等. 2. Root的原理介绍 谷歌的android系统管理员用户就叫做root,该帐户拥有整个系统至高无上的权利,它可以访问和修改你手机几乎所有的文件,只有root才具备最高级别的管理权限

thinkphp 中调用root权限python脚本

默认thinkphp使用apache用户,没有权限执行具有root权限的后台脚本,需要使用sudo. root权限下修改/etc/sudoers 添加文件的写权限:chmod u+w /etc/sudoers 编辑/etc/sudoers文件,找到这一 行:"root ALL=(ALL) ALL" 在起下面添加"apache ALL=(ALL)       NOPASSWD: ALL",然后保存退出. 撤销文件的写权限:chmod u-w /etc/sudoers

Linux中执行shell脚本的4种方法

这篇文章主要介绍了Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法,需要的朋友可以参考下. bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/root/bin目录中并已有执行权限(添加权限的方法:chmod +x hello.sh). 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: ./ 的意思是说在当前的工作目录下执行hello.sh.如果不加上

【转】Java中字符串中子串的查找共有四种方法(indexof())

原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引. 3.int lastIndexOf(String st

在 Ruby 中执行 Shell 命令的 6 种方法

我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb >> exec 'echo "hello $HOSTNAME"' hello codefun $ 注意 exec 利用 echo 命令替换了 irb 进程,然后退出.因为 Ruby 实际上结束了该方法,所以只能有限使用.该方法的缺点是,你无法从 Ruby 脚本中知道命令是执行成功

在JavaScript中判断整型的N种方法

整数类型(Integer)在JavaScript经常会导致一些奇怪的问题.在ECMAScript的规范中,他们只存在于概念中: 所有的数字都是浮点数,并且整数只是没有一组没有小数的数字. 在这篇博客中,我会解释如何去检查某个值是否为整型. ECMAScript 5 在ES5中有很多方法你可以使用.有时侯,你可能想用自己的方法:一个isInteger(x)的函数,如果是整型返回true,否则返回false. 让我们看看一些例子. 通过余数检查 你可以使用余数运算(%),将一个数字按1求余,看看余数

javascript中定义声明函数的四种方法

javascript中定义声明函数的四种方法 :http://blog.163.com/zzf_fly/blog/static/209589158201286104927248/ 方法一:function functionName([parameters]){functionBody}; 方法二:将一个未命名的函数function赋给一个指定变量(var):var add=function(a, b){} 方法三:使用new运算符声明函数varName=new Function([param1N

html5中让页面缩放的4种方法

html5中让页面缩放的4种方法 2013-10-22 14:45:03 分类: Web开发 1.viewport这种方法,不是所有的浏览器都兼容 2.百分比这种方法,可以兼容大部分浏览器,但是修改幅度比较大.main .login .txt1{margin-top:8.59375%; position:relative;}3.css transform这种方法,可以兼容大部分浏览器,但是页面的位置是居中的.w320{transform: scale(1,1);-ms-transform: sc