我需要在我的应用程序中使用 NSFileManager 移动系统文件,但我似乎没有根访问权限。获得此特权的最简单方法是什么?
我查看了 Apple 提供的 BetterAuthorizationSample 代码,但我似乎无法让 NSFileManager 在获得用户批准后运行其任务。
最佳答案
更新:为了更新仍在使用此答案以供引用的人,BLAuthentication
使用了一个旧的、极不推荐的函数,称为 AuthorizationExecuteWithPriviledges
,在工作时,违背了现代安全范式,并被弃用(并且已经有一段时间了)。从技术上讲,您仍然可以使用它,但如果您正在为 Mac OS X Lion 开发,我们非常欢迎您使用 ServicesManagement 框架,它允许您以作为辅助工具的特权运行代码。
有关如何创建和启动特权帮助工具的引用,请查看我的一个问题,Writing a Privileged Helper Tool with SMJobBless() .
没有真正简单的方法来授权 NSFileManager
,所以您应该考虑使用标准的 mv
和 cp
工具,在管理员身份验证下运行BLAuthentication
类。不幸的是,原作者的网站已关闭,但您可以轻松地在 Google 上找到该类(class)的副本(如果您愿意,我也可以为您上传一份副本)。
使用 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];
上面的代码将提示用户输入管理员密码,并在默认的五分钟时限内对程序进行身份验证。
警告
当然,请始终小心系统文件!尽可能避免移动或操纵它们,尤其是当您的程序要在其他人的计算机上运行时(如果出现任何问题,您将受到指责)!
关于objective-c - Cocoa - 获得 NSFileManager 的根访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4599447/