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