我需要在我的应用程序中使用NSFileManager移动系统文件,但似乎没有root访问权限。如何最简单地获得这个权限?
我已经查看了苹果提供的BetterAuthorizationSample代码,但我不知道如何在用户批准后使NSFileManager运行其任务。
我需要在我的应用程序中使用NSFileManager移动系统文件,但似乎没有root访问权限。如何最简单地获得这个权限?
我已经查看了苹果提供的BetterAuthorizationSample代码,但我不知道如何在用户批准后使NSFileManager运行其任务。
更新:对于仍在使用此答案作为参考的人,BLAuthentication
使用了一个旧的、极不推荐使用的函数叫做 AuthorizationExecuteWithPriviledges
,虽然它可以工作,但是它违背了现代安全范式,并且已经被弃用(已经有一段时间了)。从技术上讲,你仍然可以使用它,但如果你正在开发 Mac OS X Lion,那么你可以使用 ServicesManagement 框架,它允许你以帮助工具的身份运行代码。
关于如何创建和启动特权辅助工具,请参阅我的一个问题:使用 SMJobBless() 编写特权辅助工具。
没有真正简单的方法来授权 NSFileManager
,所以你应该考虑使用在管理员身份验证下运行的标准 mv
和 cp
工具,并使用 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分钟。
警告
当然,始终要小心处理系统文件!在可能的情况下避免移动或操作它们,特别是如果您的程序将在别人的计算机上运行(如果出了什么问题,你会受到责备)!
NSFileManager
,但是对于root访问,请像上面展示的那样使用BLAuthentication
。b)抱歉,我的错误;您甚至不需要NSTask
(我忘记更新答案中的代码部分,但现在已经修复)。只需使用带有命令路径(@"/bin/cp"或@"/bin/mv")的-executeCommand:withArgs:
来执行移动/复制操作。c)是的,尽管BLAuthentication
很旧,但它仍然可以编译和运行得非常好,即使在10.6下(安全框架随时间几乎没有改变)。 - Itai FerberBLAuthentication
正常工作!Xcode 侧边栏->Targets->App Name(双击)->General->Add Linked Library->选择 Security.framework->在侧边栏中拖动到 Linked Frameworks。 - Itai Ferber