在cocoa程序中获得系统授权

2013年7月31日 分类: Cocoa, 编程 (472 个脚步)

偶然间,需要用到Mac的相关授权,所以就有了现在这篇文章了。。
有3种方法可以得到系统权限的授权。

1. 官方推荐实例,BetterAuthorizationSample

     这个实例得中心思想,是将需要授权的应用代码片段和主程序分离,这样,从最大程度上减小了由于主程序出现bug,从而导致权限漏洞得问题,也避免了开发中的bug,导致整个应用程序在高权限下运行的危险。你可以下载此官方代码。

2. 利用authopen命令

     你可能觉得使用这个BetterAuthorizationSample过于复杂和庞大。的确,对于哪些很小的程序,使用BAS架构是在过于麻烦,那么我们可以利用Mac OS X内置的openauth命令,来执行一些需授权的代码。

比如我要修改/etc/hosts文件,最简单的使用authopen的方法。。。

代码如下:

    NSString *convertedPath = [NSString stringWithUTF8String:[@"/etc/hosts" UTF8String]];
    NSTask *task = [[NSTask alloc] init];
    NSPipe *pipe = [[NSPipe alloc] init];
    NSFileHandle *writeHandle = [pipe fileHandleForWriting];
    
    [task setLaunchPath:@"/usr/libexec/authopen"];
    [task setArguments:[NSArray arrayWithObjects:@"-c", @"-w", convertedPath, nil]];
    [task setStandardInput:pipe];
    
    [task launch];
    
    NSString *testString = @"127.0.0.1	localhost\n255.255.255.255	broadcasthost \n::1 localhost \nfe80::1%lo0	localhost";
    NSData *data = [testString dataUsingEncoding: NSUTF8StringEncoding];
    
    [writeHandle writeData:data];
    
    close([writeHandle fileDescriptor]); // Close it manually
    
    [task waitUntilExit];

    首先我们可以读取hosts文件内容,,,修改后,放到NSData对象中,利用NSTask执行authopen,通过流写入,即可,,,注意上面代码中的

[NSArray arrayWithObjects:@"-c", @"-w", convertedPath, nil]

对于authopen,的-c -w参数,则会接受输入流,,,这时系统会弹出一个授权对话框,这个跟上一个方法的区别在于,这个对话框始终是显示authopen进程需要授权,这会给用户带来一定的困惑。

 

3. 利用AuthorizationCreate API

最后说说利用最广的AuthorizationCreate API。直接看代码:

NSString *toolPath = [[NSBundle mainBundle] pathForAuxiliaryExecutable:@”InstallBootImage”];
AuthorizationFlags authFlags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights;
AuthorizationItem authItems[] = {kAuthorizationRightExecute, strlen([toolPath fileSystemRepresentation]), (void*)[toolPath fileSystemRepresentation], 0};
AuthorizationRights authRights = {sizeof(authItems)/sizeof(AuthorizationItem), authItems};
return (AuthorizationCreate(&authRights, kAuthorizationEmptyEnvironment, authFlags, &auth) == errAuthorizationSuccess);
AuthorizationExecuteWithPrivileges(auth, [toolPath fileSystemRepresentation], kAuthorizationFlagDefaults, toolArgs, NULL);

上面的一段代码用来获得auth授权对象,当授权对象获得成功,则使用AuthorizationExecuteWithPrivileges执行授权代码,,这个使用最为直观简便。


我现在选择的是第二种方法,暂时没有出现啥毛病,其他的看着眼晕。。。
效果如下

host 内容如下:

127.0.0.1	localhost
255.255.255.255	broadcasthost 
::1 localhost 
fe80::1%lo0	localhost

 

在cocoa程序中获得系统授权 【声明】本文 在cocoa程序中获得系统授权 为柠之漠然原创文章,转载请注明出自 枫之落叶
并保留本文有效链接:https://blog.shiniv.com/2013/07/%e5%9c%a8cocoa%e7%a8%8b%e5%ba%8f%e4%b8%ad%e8%8e%b7%e5%be%97%e7%b3%bb%e7%bb%9f%e6%8e%88%e6%9d%83/ , 转载请保留本声明!

标签:
目前还没有任何评论.
你必须要启用 Javascript