Cocoa - NSFileManager获取Root访问权限

6

我需要在我的应用程序中使用NSFileManager移动系统文件,但似乎没有root访问权限。如何最简单地获得这个权限?

我已经查看了苹果提供的BetterAuthorizationSample代码,但我不知道如何在用户批准后使NSFileManager运行其任务。

2个回答

3

更新:对于仍在使用此答案作为参考的人,BLAuthentication 使用了一个旧的、极不推荐使用的函数叫做 AuthorizationExecuteWithPriviledges,虽然它可以工作,但是它违背了现代安全范式,并且已经被弃用(已经有一段时间了)。从技术上讲,你仍然可以使用它,但如果你正在开发 Mac OS X Lion,那么你可以使用 ServicesManagement 框架,它允许你以帮助工具的身份运行代码。

关于如何创建和启动特权辅助工具,请参阅我的一个问题:使用 SMJobBless() 编写特权辅助工具


没有真正简单的方法来授权 NSFileManager,所以你应该考虑使用在管理员身份验证下运行的标准 mvcp 工具,并使用 BLAuthentication 类。不幸的是,原作者的网站已经关闭,但是你可以很容易地在谷歌上找到这个类的副本(如果你愿意,我也可以上传一份给你)。


使用 BLAuthentication,你想要做的事情大致如下:

#define MOVE @"/bin/mv"
if (![[BLAuthentication sharedInstance] isAuthenticated:MOVE]) {
    [[BLAuthentication sharedInstance] authenticate:MOVE];
}

NSArray *arguments = [NSArray arrayWithObjects:@"location1", @"location2", nil];
[[BLAuthentication sharedInstance] executeCommand:MOVE withArgs:arguments];

以上代码将提示用户输入管理员密码,并对程序进行默认时间限制的认证,限制时间为5分钟。


警告
当然,始终要小心处理系统文件!在可能的情况下避免移动或操作它们,特别是如果您的程序将在别人的计算机上运行(如果出了什么问题,你会受到责备)!


Kevin,澄清一些事情:a)对于常规文件,您仍然可以使用NSFileManager,但是对于root访问,请像上面展示的那样使用BLAuthentication。b)抱歉,我的错误;您甚至不需要NSTask(我忘记更新答案中的代码部分,但现在已经修复)。只需使用带有命令路径(@"/bin/cp"或@"/bin/mv")的-executeCommand:withArgs:来执行移动/复制操作。c)是的,尽管BLAuthentication,但它仍然可以编译和运行得非常好,即使在10.6下(安全框架随时间几乎没有改变)。 - Itai Ferber
1
还有一件事,当弹出窗口要求输入密码时,应用程序是否会继续进行其它操作?如果是这样的话,有没有办法在运行后暂停它并等待用户输入密码后再执行其它代码? - lab12
此外,不要忘记将安全框架添加到链接的框架中,以使 BLAuthentication 正常工作!Xcode 侧边栏->Targets->App Name(双击)->General->Add Linked Library->选择 Security.framework->在侧边栏中拖动到 Linked Frameworks。 - Itai Ferber
太好了,解决了!谢谢!如果我要使用“rm -f”命令,如何加入强制部分? - lab12
关于警告和“你将受到指责”的问题。这就是每个许可证中的“自担风险”条款,用户已经同意了。 :) - user142019
显示剩余4条评论


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接